VC++MFC编程实例

合集下载

VS2008下计算器的MFC编程实现..

VS2008下计算器的MFC编程实现..

VS2008下计算器的MFC编程实现简单的计算器编程,完全在VS2008下实现,主要用于熟悉VS2008的功能。

谨以此分享给和我一样初学MFC的朋友们。

STEP1:页面设计1.新建工程首先打开Visual Studio2008,选择MFC应用程序,设定好路径和工程名(这里我设置工程名为为“Calculator”)。

这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”,其他选项默认即可。

之后我们可以点击完成便看到以下界面:此时我们把当前页面上原配的控件按Delete全部清除(如下图)2.添加控件接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加。

点击右侧的工具栏按钮(以下是控件)我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。

影响用户的心情。

3.修改空间ID和Caption上图各控件类型如下:Edit ControlButtonGroup Box:选择其中一个GroupBox,右键单击,选择[属性]。

在右边显示属性对话框。

每个控件“属性”都有属于它自己的ID,默认的Group Box的ID为IDC_STATIC,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID。

4个Group Box的ID分别修改为IDC_STATIC_FRAME ,IDC_STATIC_IN, IDC_STATIC_RESULT, IDC_STATIC_BUTTON 控件Edit Control和Button也按相同的办法处理。

ID设置完成可以在“Resourse.h”中查看。

完成修改ID后,就需给控件添加消息响应了。

在属性对话框的上方点击闪电“”图标,添加控件事件。

如对于按钮“”,点击“”点击下拉键头,添加控件事件,页面自动切换到代码的编辑页面,如“添加OnBnClickedButton5”MFC默认下了的响应信息都为On_开头。

MFC应用程序编写实例—完整版(原创)

MFC应用程序编写实例—完整版(原创)

MFC应⽤程序编写实例—完整版(原创)前段时间,将近花了⼀周⾄两周上班和上班后的闲余时间,做了⼀个⽤于调试和测试⼯作项⽬的应⽤软件,下⾯将实现软件的重要步骤及主要功能讲解⼀遍,⽅便⽇后查阅。

程序开始后,提⽰登录框,输⼊⽤户名,密码后,登录进去主窗体,效果图如下:下⾯将主要实现的功能函数要点进⾏描述,具体实现如下:⼀、设置主窗体⼤⼩1、进⼊⼯程窗体初始化函数,OnInitDialog()中,在CDialog::OnInitDialog() 下⾯添加函数语句如下:SetWindowPos(NULL,0,0,600,400,SWP_NOMOVE); ////设置主窗体⼤⼩,长为600,⾼为400⼆、为主窗体添加背景图⽚:1、⾸先,在⼯程头⽂件中,声明画刷变量如:CBrush m_brBk;2、在⼯程OnInitDialog()中,添加如下代码:CBitmap bmp1;bmp1.LoadBitmap(IDB_BITMAP1);m_brBk.CreatePatternBrush(&bmp1);3、添加消息函数OnCtlColor,代码如下所⽰:HBRUSH CDebugDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// if (pWnd == this)//// {//// return m_brBk;//// }return(HBRUSH) m_brBk;}三、调⽤模态对话框和⾮模态对话框(以菜单⼊⼝为例)如菜单所属的主窗体类名为CDebugDlg,调⽤对话框的类名为CPing实现调⽤⾮模态对话框⽅法:选择调⽤菜单⼊⼝后,点击添加消息处理函数,在函数体内添中如下代码:CPing *dlg = new CPing();dlg->Create(IDD_DIALOG_PING); //创建⼀个⾮模态对话框dlg->ShowWindow(SW_SHOW); //显⽰⾮模态对话框 实现调⽤模态对话框⽅法:Cping dlg;dlg.DoModal();四、调⽤外部应⽤程序⽅法:1、调⽤外部应⽤程序可采⽤WinExec函数例如,调⽤⼀个Tcpview.exe外部程序,可在消息处理函数中添加如下代码:WinExec(".\\dll\\TCPview\\Tcpview.exe",SW_SHOW); // 其中.代表当前路径,此时需要⽤到\\来区分路径。

VC++MFC编程3

VC++MFC编程3

return (int)sqrt(dx*dx+dy*dy); } 第八步:编译运行程序员 函数原型: public: void DrawCircle(CDC* pDC, CPoint cenp, CPoint ardp); int ComputeRadius(CPoint cenp,CPoint ardp); 具体操作方法:用鼠标右键单击视图类, 选择“ 选择“Add Member Function…”,如下图所 Function…”,如下图所 示。分别添加上述两个成员函数,分别用 于画圆和计算圆的半径。
第一步:建立MouseSpring工程文件; 第一步:建立MouseSpring工程文件; 第二步:向视图类中添加自定义的成员变量 用鼠标右键单击视图类,选择“ 用鼠标右键单击视图类,选择“Add Member Variable…”, Variable…”,添加下面三个成员变量。 proctected : CPoint m_bO; // 圆心 CPoint m_bR; //圆上的点 //圆上的点 int m_ist; //圆心与圆周上点的区别,m_ist=0, //圆心与圆周上点的区别,m_ist=0, 表示鼠标左击点为圆心, //m_ist=1,表示鼠标左击点为圆周上的 //m_ist=1,表示鼠标左击点为圆周上的 点 操作方法如下图所示,分别添加上述三个成员变量。
第五步:在视图类的OnDraw()函数中加入下列代码,实 第五步:在视图类的OnDraw()函数中加入下列代码,实 现视图绘图。 void CMouseSpringView::OnDraw(CDC* pDC) { CMouseSpringDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDCpDC->SelectStockObject(NULL_BRUSH);//选择预定义对象 DrawCircle(pDC,m_bO,m_bR); //调用自定义的成员函数画圆 //调用自定义的成员函数画圆 }

VC MFC 编程实例17

VC MFC 编程实例17
B.3 窗口消息的消息映像宏
宏 ON_MESSAGE(WM_XXX,Handler) 例如: O N _ M E S S A G E ( W M _ C R E AT E , M y Handler) ON_MESSAGE(WM_PAINT,MyHan dler) ON_WM_XXX 例如: ON_WM_CREATE() ON_WM_DESTROY() 可每一个标准窗口消息都有属于它 自己的宏,它没有参数,并且它的 名字和使用基于它的 WM_XXX设计 OnXxx(message specific)(因为参数是 特定的消息,最好让 Class Wi z a r d添 加这些宏到消息映像中 ) 说 明 消息处理函数调用参数 可 L R E S U LT Handler (WP A R A M wParam,LPARAM lParam) 可
本文由sdhexu贡献
pdf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
下载
附录B 消息,控件通知和消息映像宏
B.1 一些通用窗口消息
WM命令 WM_CREATE 描 述 参数说明 发lParam指向CREATESTRUCT,它包含 C r e a t e Window ( ) 参数;初始化成功时 应返回0 WM_INITDIALOG 发发送此消息,告诉对话框初始化自己; 在WM_CREATE消息之后以及在所有对 话框中的控件被创建后发送 WM_GETMINMAXINFO WM_SIZE 发发送此消息,告诉窗口即将被重调到窗 口必须保持的最大或最小尺寸 发发送此消息,告诉一个窗口已被重调大小 发wParam是接收初始焦点的控件窗口的 句柄,lParam是被CreateDialogParam ( ) 传递的可选参数 发lParam指向一个MINMAXINFO结构, 它允许窗口设置它的最小和最大尺寸 发wParam是一个标志,用以区分窗口被 最大化,最小化还是只是被重调大小. lParam告诉新窗口的大小 WM_PAINT WM_DESTROY WM_NCCREATE WM_NCDESTROY WM_NCPAINT WM_ERASEBKGND WM_SHOWWINDOW WM_ENABLE WM_INITMENUPOPUP 发发送此消息,告诉窗口绘制它的客户区 发发送此消息,告诉一个窗口重新分配全 局堆上的任何内容 发发送此消息,告诉一个窗口正初始化非 客户区 发发送此消息,告诉一个窗口非客户区已 被销毁 发发送此消息,告诉一个窗口绘制它的非 客户区 发发送此消息,告诉一个窗口擦除背景 发发送此消息,告诉窗口显示或隐藏自己 发发送此消息,告诉一个窗口启用或禁用 自己 发发送此消息,告诉窗口它的系统菜单或 主菜单将被打开 WM_HELP 发发送此消息, 告诉一个窗口F1键已被按下 发wParam拥有菜单对象的句柄,lParam的 低位字表示子菜单位置,如果 lParam的 高位字非0,则系统菜单将打开 发lParam包含一个HELPINFO结构的指针, 结构包含处理上下文相关的帮助所需要 的信息 WM_MOUSEMOVE 发当鼠标移到它的客户区时被寄送到一个 窗口 WM_LBUTTONDOWN WM_LBUTTONUP 发鼠标的左键在客户区被按下时,被寄送 到该窗口 发当鼠标左键在窗口的客户区被松开时, 被寄送到该窗口 发与WM_MOUSEMOVE相同 发wParam指示是否有键盘的Shift-Ctrl-Alt 键被按下, l P a r a m指示相对于客户区的 新的鼠标光标位置 发与WM_MOUSEMOVE相同 发w P a r a m拥有绘制区域的句柄,区域 在第4章中描述 发wParam指定进行擦除的设备环境(一个 绘制的和被填充的矩形 ) 发如果wParam非0,则窗口被显示 发如果wParam非0,则窗口已被启用 发l P a r a m指向 W M _ C R E AT E使用的相 同的CREATESTRUCT结构 发wParam和lParam未被使用 发wParam是进行绘制的设备环境 发wParam和lParam未被使用

vc++使用MFC操作EXCEL文件 创建+编辑+保存

vc++使用MFC操作EXCEL文件 创建+编辑+保存

使用MFC操作EXCEL文件本文档适用于:•Microsoft Foundation Classes (MFC), Microsoft Visual C++, 32-bit Editions, version 6.0 以上•Microsoft OLE 库第一步:建立一个自动化工程1.启动VC 6.0,打开新建对话框,新建一个MFC AppWizard(exe)工程,这里工程明设置为TestExcel。

2.进入MFC 应用程序向导,选择基本对话框,直接点击完成,工程文件结构如下图:3.打开MFC ClassWizard窗口(查看—>建立类向导),选择Automation,单击Add Class按钮,选择From a type library...,弹出文件选择对话框,之后定位到Microsoft Office的安装目录(通常为C:\Program Files\Microsoft Office\Office),选择EXCEL9.OLB 注意,确定后,弹出ConfirmClasses窗口,选择列表中的所有类,单击OK按钮。

注意文件名EXCEL9.OLB,因安装的Office版本不同而有所差异,EXCEL9.OLB对应的是Microsoft Office 2000,微软命名方式为Excel+数字的形式,Office版本越高,数字越大。

//注意,Excel003的文件是:C:\Program Files\Microsoft Office\OFFICE11\Excel.exe4.返回编辑器,查看工程文件,可发现多了EXCEL9.H及EXCEL9.CPP两个文件。

5.打开stdafx.h头文件确保包含如下头文件:#include <afxdisp.h>#include "excel9.h"6.打开TestExcel.cpp文件,修改CTestExcelApp::InitInstance(),加入如下代码:BOOL CTestExcelApp::InitInstance(){if( !AfxOleInit() ){AfxMessageBox("初始化Ole出错!");return FALSE;}AfxEnableControlContainer();............return FALSE;}为保证编译时不产生重复定义错误,打开excel9.h文件,在文件开始位置加入如下代码:#if !defined _HEAD_FILE_EXCEL9_#define _HEAD_FILE_EXCEL9_相应的,在文件末尾加入:#endif到此,OLE自动化工程建立完成。

VC(MFC)开发OPENGL程序

VC(MFC)开发OPENGL程序

VC(MFC)开发OPENGL程序作者:李英江日期: 2006-08-10 19:07:00网站:转载请保留作者内容!利用使用VC开发OPENGL程序,运用MFC库,做一个简单例子我简单介绍一下图形接口,现在流行的两大图形接口Direct3D 和OpenGL,Direct3D主要是针对游戏,像starcaft星际争霸,它支持DX5.0以上的版本,但是不少游戏同时支持两种图形加速,如CS,魔兽争霸。

OpenGL主要是针对专业的图形应用,在军事,医学,GIS地理信息系统,动画(3dsmax,maya...),电影,等应用广泛,并且可以在不同的平台上应用,DX相对来说就只能限于Windows操作系统了。

1.运用MFC向导,生成一个单文档应用程序,不做任何事的MFC 框架程序。

2.视图类中添加窗口样式。

/************************************************************** *******/BOOL CMfc_basicView::PreCreateWindow(CREATESTRUCT& cs){// Add Window styles required for OpenGL before window iscreatedcs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CS_OWNDC);return CView::PreCreateWindow(cs);}/************************************************************** *******/3.在afxcmn.h中包含OPENGL头文件。

/************************************************************** *******/#include <afxcmn.h>// MFC support for Windows Common Controls// Inserted these files for openGL#include <gl.h>#include <glut.h>#include <glu.h>#include <glaux.h>#endif // _AFX_NO_AFXCMN_SUPPORT/************************************************************** *******/4.视图类中 .h文件中加入四个public 成员变量/************************************************************** *******/HGLRC m_hRC; // Permanent Rendering ContextHDC m_myhDC; // Private GDI Device Contextint m_height; // Stores the height of the Viewint m_width; // Stores the width of the view/************************************************************** *******/5.视图类中右键添加一个BOOL成员函数SetupPixelFormat/************************************************************** *******/BOOL COglm_demoView::SetupPixelFormat(){GLuint PixelFormat;static PIXELFORMATDESCRIPTOR pfd= {sizeof(PIXELFORMATDESCRIPTOR),// Size Of This Pixel Format Descriptor1,// Version Number (?)PFD_DRAW_TO_WINDOW | // Format Must Support WindowPFD_SUPPORT_OPENGL | // Format Must Support OpenGL PFD_DOUBLEBUFFER, // Must Support Double Buffering PFD_TYPE_RGBA, // Request An RGBA Format24, // Select A 24Bit Color Depth0, 0, 0, 0, 0, 0, // Color Bits Ignored (?)0, // No Alpha Buffer0, // Shift Bit Ignored (?)0, // No Accumulation Buffer0, 0, 0, 0, // Accumulation Bits Ignored (?)16, // 16Bit Z-Buffer (Depth Buffer)0, // No Stencil Buffer0, // No Auxiliary Buffer (?)PFD_MAIN_PLANE, // Main Drawing Layer0, // Reserved (?)0, 0, 0 // Layer Masks Ignored (?)};m_myhDC = ::GetDC(m_hWnd); // Gets A Device Context For The WindowPixelFormat = ChoosePixelFormat(m_myhDC, &pfd); // Finds The Closest Match To The Pixel Format We Set Aboveif (!PixelFormat){::MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);// This Sends A 'Message' Telling The Program To Quitreturn false ; // Prevents The Rest Of The Code From Running}if(!SetPixelFormat(m_myhDC,PixelFormat,&pfd)){::MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}m_hRC = wglCreateContext(m_myhDC);if(!m_hRC){::MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}if(!wglMakeCurrent(m_myhDC, m_hRC)){::MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}// Now that the screen is setup we can// initialize OpenGL();InitGL();return true;}/************************************************************** *******/6.关闭WM_ERASEBACKGROUND消息,不关闭的话,画图时会闪动.在视图类中选择“Add Windows Message Handler”加入消息处理函数./************************************************************** *******/BOOL CMfc_basicView::OnEraseBkgnd(CDC* pDC){return FALSE;}/************************************************************** *******/7.初始化OPENGL 添加InitGL()函数./************************************************************** *******/void CMfc_basicView::InitGL(){// Enables Depth TestingglEnable(GL_DEPTH_TEST);// Enable the point size for selected pointsglPointSize(5.0f);// This Will Clear The Background Color To BlackglClearColor(.4, 0.2, 0.0, 0.0f);// Reset the current projection matrixSetProjection();glMatrixMode(GL_MODELVIEW);glLoadIdentity();//Enable back face culling, defaults to Clock wise vertices.glEnable(GL_CULL_FACE);glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);glShadeModel(GL_SMOOTH);glPolygonMode(GL_FRONT, GL_FILL);}/************************************************************** *******/8. 在视图类中添加调窗口大小的处理函数OnSize() 消息句柄/************************************************************** *******/void CMfc_basicView::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);glMatrixMode(GL_MODELVIEW);glLoadIdentity();// Make the rendering context currentwglMakeCurrent(m_myhDC,m_hRC);// Reset The Current Viewport And Perspective TransformationglViewport(0, 0, cx, cy);m_height= cy;m_width = cx;// Calculate The Aspect Ratio Of The WindowgluPerspective(60.0f,(GLfloat)cx/(GLfloat)cy,0.1f,1000.0f);}9.添加SetPorjection()函数void CMfc_basicView::SetProjection(){glViewport(0, 0, m_width, m_height);// Reset The Projection MatrixglMatrixMode(GL_PROJECTION);glLoadIdentity();// It's a perspective projection// Calculate The Aspect Ratio Of The WindowgluPerspective(60.0f,(GLfloat)m_width/(GLfloat)m_height, 0.1f,3000.0f);}/************************************************************** *******/10.在Project 菜单选择Settings. 单击Link 选项页Object/library Module添加库文件.opengl32.lib glu32.lib glut.lib glaux.lib11.在视图类中加入OnCreate消息句柄/*********************************************************************/int CMfc_basicView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;SetupPixelFormat();wglMakeCurrent(NULL,NULL);return 0;}/************************************************************** *******///现在编译程序的话,会看到一个无法刷新的应用程序了。

VC++实验四 MFC图形绘制编程实验

VC++实验四 MFC图形绘制编程实验

实验四 MFC图形绘制编程实验一、实验目的(1) 熟悉Visual C++ 6.0开发环境;(2) 掌握MFC消息映射的操作步骤;(2) 掌握MFC图形输出的方法;(3) 理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。

二、实验内容请编写程序,要求如下:(1) 定义一支黄色画笔,绘制一条线段;(1) 定义一支紫色画笔,绘制一条多段线;(3) 定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;(4) 定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;(5) 定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。

三、实验报告1.列出图形绘制程序代码清单:(1)在头文件Demo.h中:#include "afxwin.h"class CDemoWnd:public CFrameWnd{public:CDemoWnd();~CDemoWnd();public:LRESULT OnPaint(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()public:int m_nX0;int m_nY0;int m_nX1;int m_nY1;};class CDemoApp:public CWinApp{public:BOOL InitInstance();};CDemoApp ThisApp;(2)在源文件Demo.cpp中:#include "Demo.h"CDemoWnd::CDemoWnd(){m_nX0 = 0;m_nY0 = 0;m_nX1 = 0;m_nY1 = 0;}CDemoWnd::~CDemoWnd(){}BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)ON_MESSAGE(WM_PAINT,OnPaint)END_MESSAGE_MAP()LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam) {CPaintDC dc(this);CPen Pen1,*pOldPen1;Pen1.CreatePen(PS_SOLID,10,RGB(255,255,0));pOldPen1=dc.SelectObject(&Pen1);dc.SelectObject(&Pen1);dc.MoveTo(10,10);dc.LineTo(100,100);CPen Pen2,*pOldPen2;Pen2.CreatePen(PS_SOLID,4,RGB(255,0,255));pOldPen2=dc.SelectObject(&Pen2);dc.SelectObject(&Pen2);POINT pt1[]={{100,10},{10,180},{200,150}};dc.Polyline(pt1,3);CPen Pen3,*pOldPen3;dc.SelectStockObject(BLACK_BRUSH);Pen3.CreatePen(PS_SOLID,4,RGB(255,0,0));pOldPen3=dc.SelectObject(&Pen3);dc.SelectObject(&Pen3);dc.Rectangle(300,50,400,150);CPen Pen4,*pOldPen4;dc.SelectStockObject(GRAY_BRUSH);Pen4.CreatePen(PS_SOLID,4,RGB(0,255,0));pOldPen4=dc.SelectObject(&Pen4);dc.SelectObject(&Pen4);dc.Ellipse(500,200,700,400);CPen Pen5,*pOldPen5;Pen5.CreatePen(PS_SOLID,4,RGB(0,0,255));pOldPen5=dc.SelectObject(&Pen5);dc.SelectStockObject(DKGRAY_BRUSH);dc.SelectObject(&Pen5);POINT pt2[]={{250,250},{400,250},{475,379},{400,509},{250,509},{175,379}};dc.Polygon(pt2,6);return 0;}BOOL CDemoApp::InitInstance(){CDemoWnd *pMainWnd = new CDemoWnd();pMainWnd->Create(NULL,"Demo Mini-MFC");pMainWnd->ShowWindow(m_nCmdShow);pMainWnd->UpdateWindow();m_pMainWnd = pMainWnd;return TRUE;}2、程序运行结果:3、总结在MFC 程序中绘制图形的基本操作步骤:(1)获取图形设备接口。

visual c++ mfc扩展编程实例

visual c++ mfc扩展编程实例

visual c++ mfc扩展编程实例MFC(Microsoft Foundation Class)是Microsoft提供的一个C++类库,它封装了Windows API,使得开发者可以更方便地使用Windows平台的各种功能。

下面是一个简单的Visual C++ MFC扩展编程实例,演示如何创建一个简单的窗口并显示文本。

1. 打开Visual Studio,创建一个新的MFC应用程序项目。

2. 在项目属性中,将“应用程序类型”设置为“MFC应用程序”。

3. 在“源文件”文件夹中,打开“CMyApp”类。

4. 在“CMyApp”类的“OnInitDialog”函数中,添加以下代码:```cppBOOL CMyApp::OnInitDialog(){CMainDialog::OnInitDialog();// 设置窗口标题SetWindowText(_T("MFC扩展编程实例"));// 创建文本控件CWnd* pWnd = GetDlgItem(IDC_STATIC_TEXT);ASSERT(pWnd);CRect rect;pWnd->GetWindowRect(&rect);CString strText;strText.Format(_T("Hello, MFC!"));pWnd->SetWindowText(strText);return TRUE; // 返回TRUE 除非你对WM_COMMAND 设置了一个处理函数}```5. 在“头文件”文件夹中,打开“CMyApp”类的头文件“CMyApp.h”。

6. 在“CMyApp”类中添加一个成员变量:```cppCStatic m_StaticT ext; // 文本控件成员变量```7. 在“CMyApp”类的构造函数中,初始化该成员变量:```cppCMyApp::CMyApp() : CMainDialog(CMyApp::IDD){// 初始化成员变量m_StaticText.SubclassDlgItem(IDC_STATIC_TEXT, this); // 绑定控件ID 和窗口句柄}```。

VC++MFC编程实例

VC++MFC编程实例
3) 窗口的状态 (1) ShowWindow:显示或隐藏一个窗口,显示可以 有多种方式:最大化、最小化、正常显示等。 (2) IsWindowEnabled:判断一个窗口是否可见。 (3) IsWindowEnabled:判断窗口的禁止/使能状态, 禁止状态的窗口不能响应用户的键盘和鼠标的输入。 (4) EnableWindow:设置窗口的禁止/使能状态,参 数为true表示使能。
第10章 Visual C++编程实例
另外,也可以选择应用程序静态链接到MFC。静 态链接意味着,应用程序不依赖于MFC库文件的存在 (但仍然可能需要Msvcrt.dll文件)。静态链接的代价是 可执行文件更大,而且MFC内存的利用可能不够充分。
在菜单中选择“工程”中的“设置”对话框,在 对 话 框 右 方 的 “ General” 选 项 卡 中 通 过 组 合 框 “Microsoft Foundation Classes”选择使用MFC类库的方 法。可选项有三种,分别为“Not Using MFC(不使用 MFC)","Use MFC in a Shared DLL(以动态链接库方式使 用MFC)”和“Use MFC in a Static Library(以静态库方 式使用MFC)”。
penNew.CreatePen(PS_SOLID,1,RGB(255,0,0)); dc.SelectObject(&brushNew); dc.SelectObject(&penNew);
第10章 Visual C++编程实例
for(int i=0;i<m_nBubbleCount;i++) dc.Ellipse(m_rectBubble[i]);

mfc项目开发实例85个

mfc项目开发实例85个

mfc项目开发实例85个全文共四篇示例,供读者参考第一篇示例:MFC(Microsoft Foundation Classes)是一种面向Windows操作系统开发的图形用户界面应用程序框架,它是微软公司推出的一种软件开发工具,为开发人员提供了一系列类和函数,用于快速、简便地创建Windows应用程序。

在本文中,我们将介绍一些MFC项目开发的实例,希望对MFC开发者有所启发和帮助。

一、MFC项目开发实例之文件操作1. 创建一个MFC项目,实现文件的读取和写入功能。

可以通过CFile类来实现文件的打开、读取、写入和关闭操作。

2. 创建一个MFC项目,实现文件夹的遍历和文件的拷贝功能。

可以使用CFileFind类来查找文件和文件夹,使用CopyFile函数来实现文件的拷贝。

6. 创建一个MFC项目,实现数据库连接和查询功能。

可以使用CDatabase类和CRecordset类来连接数据库和执行SQL查询。

11. 创建一个MFC项目,实现多文档视图窗口的创建和切换功能。

可以通过CMDIChildWnd类和CDocument类来创建多文档视图窗口。

12. 创建一个MFC项目,实现对话框的创建和控件的添加功能。

可以通过CDialog类和CWnd类来创建对话框,使用CButton类、CEdit类和CListCtrl类等控件来添加在对话框中。

13. 创建一个MFC项目,实现菜单和工具栏的添加和事件处理功能。

可以通过CMenu类和CToolBar类来添加菜单和工具栏,使用消息映射来处理菜单和工具栏事件。

14. 创建一个MFC项目,实现状态栏和进度条的显示和更新功能。

可以通过CStatusBar类和CProgressCtrl类来创建状态栏和进度条,使用SetPaneText和SetPos函数来更新状态栏和进度条。

15. 创建一个MFC项目,实现动画和图像显示功能。

可以使用CImageList类和CAnimateCtrl类来实现动画和图像的显示。

VC MFC串口通信编程详解

VC MFC串口通信编程详解
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
• lpFileName:将要打开的串口逻辑名,如“COM1”; • dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; • dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为 0; • lpSecurityAttributes:引用安全性属性结构,缺省值为 NULL; • dwCreationDistribution:创建标志,对串口操作该参数必须置为
在 Win32 下,可以使用两种编程方式实现串口通信,其一是使用 ActiveX 控件,这种 方法程序简单,但欠灵活.其二是调用 Windows 的 API 函数,这种方法可以清楚地掌握 串口通信的机制,并且自由灵活.下面只介绍 API 串口通信部分.
串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作 方式).同步操作时,API 函数会阻塞直到操作完成以后才能返回(在多线程方式中, 虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API 函数会立即 返回,操作在后台进行,避免线程的阻塞.
配置串口的示例:
SetupComm(hCom,1024,1024);//输入缓冲区和输出缓冲区的大小都是 1024 COMMTIMEOUTS TimeOuts; //设定读超时 TimeOuts.ReadIntervalTimeout=1000; TimeOuts.ReadTotalTimeoutMultiplier=500; TimeOuts.ReadTotalTimeoutConstant=5000; //设定写超时 TimeOuts.WriteTotalTimeoutMultiplier=500; TimeOuts.WriteTotalTimeoutConstant=2000; SetCommTimeouts(hCom,&TimeOuts);//设置超时 DCB dcb; GetCommState(hCom,&dcb); dcb.BaudRate=9600;//波特率为 9600 dcb.ByteSize=8;//每个字节有 8 位 dcb.Parity=NOPARITY;//无奇偶校验位 dcb.StopBits=TWOSTOPBITS;//两个停止位 SetCommState(hCom,&dcb); PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

VC MFC 编程实例19

VC MFC 编程实例19
D.1 设置Developer Studio
D.1.1 激活其他应用程序 Developer Studio可在Tools菜单中添加定制菜单命令,在环境内运行其他应用程序,方法 如下: 1) 单击Tools/Customize菜单命令,以打开 Customize属性表. 2) 选择To o l s选项卡,并滚动到菜单列表的底部 (Developer Studio应该已经在该菜单中预 装了几个命令). 3) 选中底部的空白焦点矩形,并输入需要在菜单中显示的名字;按回车键将打开三个编 辑框,分别是Command,Arguments和Initial Directory. 4) 在Command中,输入要运行的执行文件的路径名. 5) 在Arguments中,输入传递给执行文件的参数. 6) 在Initial Directory中,输入运行该命令前 Developer Studio应该改变的目录. 可把下面的命令添加到 Tools菜单: Explorer命令 使Windows Explorers最初在工程目录中打开.菜单名字输入到 Explorer中. 命令输入 C : \ Wi n d o w s \ e x p l o r e r. e x e或C : \ Wi n n t \ e x p l o r e r. e x e (根据操作系统而定 ),参数输入 / e, 并使初始目录(Initial Directory)为空白. DOS命令 打开一个初始在工程目录下 MS-DOS窗口.菜单命令输入 MS-DOS,命令输入
必须改用printf ( ),还可以用下面即将讨论的AfxMessageBox ( ). D.2.2 AfxMessageBox ( ) 如果问题只出现在没有安装 Developer Studio的操作系统上的应用程序中,或只出现在应 用程序的发行版中时,除了在软件中用 printf ( )外,还可以考虑使用 AfxMessageBox ( );可以 格式化一个消息或创建一个静态消息,用以指示应用程序通过一个关键部位时的过程,并用 AfxMessageBox ( )显示这些消息; AfxMessageBox ( )甚至可以不必在一个控件窗口的类中, 或者根本不必在一个类中. D.2.3 ASSERT ( )和VERIFY ( ) 另外两个用来检查工作的全局函数是 A S S E RT ( ) 和VERIFY ( ),这些宏通常用来检查传 送到一个函数的参数是否合法.如果这些参数来自用户的输入,可能还要用 AfxMessageBox ( )显示某种错误消息;但是,如果该参数源于应用程序的其他部分,则可以使用具有更小系统 开销的ASSERT ( )和VERIFY ( ),MFC库用ASSERT ( )和VERIFY ( )防止任何愚蠢的错误导 致奇异的结果. 在应用程序的调试版中, ASSERT ( )和VERIFY ( )核查一个合法的 C或C++表达式,如果 不是TRUE,则显示一个错误消息并退出应用程序;在应用程序的发行版中, ASSERT ( )不做 任何事情 — 甚至不核查括弧内的表达式, VERIFY ( )虽然核查表达式,但如果发现错误,还 是不能停止应用程序的发行版.这两个宏的例子如下:

VC++MFC鼠标做图编程实验

VC++MFC鼠标做图编程实验

一、实验目的(1) 熟悉开发环境;(2) 掌握应用MFC类库编写鼠标绘图程序的方法;(3) 掌握MFC环境中绘图函数的使用方法。

二、实验内容创建一个单文档应用程序,实现鼠标的绘图功能。

要求:(1) 创建一个工具栏,有线段、矩形、椭圆三个按钮;(2) 绘图前,选择工具栏上的按钮,确定图形的形状。

按下鼠标左键,开始绘图,结合鼠标的光标坐标值,来确定图形的形状和大小,并随着鼠标的移动在屏幕上实时绘制图形,放开鼠标左键,确定最后的图形,绘制在屏幕上。

三、实验处理列表实现绘图功能的代码清单:1、代码如下#if !defined(AFX_PIC_H__00F5F2B9_A2A6_4ED6_907E_EC07AA16 8545__INCLUDED_)#defineAFX_PIC_H__00F5F2B9_A2A6_4ED6_907E_EC07AA168545__INCL UDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class CPic{public:CPic();virtual ~CPic();void Draw(CDC *PDC);public:UINT m_nDrawType;int m_nX0;int m_nY0;int m_nX1;int m_nY1;};#endif// !defined(AFX_PIC_H__00F5F2B9_A2A6_4ED6_907E_EC07AA1685 45__INCLUDED_)2、代码如下:// Pic.cpp: implementation of the CPic class.////////////////////////////////////////////////////////////////////////#include ""#include "Shiyan8.h"#include ""#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CPic::CPic(){}CPic::~CPic(){}void CPic::Draw(CDC *pDC){CPen PenLN,*pOldPen;(PS_SOLID,3,RGB(255,0,0));pOldPen = pDC->SelectObject(&PenLN);switch(m_nDrawType){case 0:pDC->MoveTo(m_nX0,m_nY0);pDC->LineTo(m_nX1,m_nY1);break;case 1:pDC->Ellipse(m_nX0,m_nY0,m_nX1,m_nY1);break;case 2:pDC->Rectangle(m_nX0,m_nY0,m_nX1,m_nY1);break;}pDC->SelectObject(pOldPen);}3、程序如下:// Shiyan8View.cpp : implementation of the CShiyan8View class//#include ""#include "Shiyan8.h"#include "Shiyan8Doc.h"#include "Shiyan8View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CShiyan8ViewIMPLEMENT_DYNCREATE(CShiyan8View, CView)BEGIN_MESSAGE_MAP(CShiyan8View, CView)//{{AFX_MSG_MAP(CShiyan8View)ON_COMMAND(ID_DRAW_FILEOPEN, OnDrawFileopen)ON_UPDATE_COMMAND_UI(ID_DRAW_FILEOPEN, OnUpdateDrawFileopen)ON_COMMAND(ID_DRAW_FILESA VE, OnDrawFilesave)ON_UPDATE_COMMAND_UI(ID_DRAW_FILESA VE, OnUpdateDrawFilesave)ON_WM_LBUTTONDOWN()ON_WM_MOUSEMOVE()ON_WM_LBUTTONUP()//}}AFX_MSG_MAPON_COMMAND_RANGE(ID_DRAWTYPE_LINE,ID_DRAWTYPE_RECT,OnDrawType)ON_UPDATE_COMMAND_UI_RANGE(ID_DRAWTYPE_LIN E, ID_DRAWTYPE_RECT,OnUpdateDrawType)// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CShiyan8View construction/destructionCShiyan8View::CShiyan8View(){// TODO: add construction code herem_nDrawType = 0;m_nX0 = 0;m_nY0 = 0;m_nX1 = 0;m_nY1 = 0;m_nPicNum = 0;}CShiyan8View::~CShiyan8View(){}BOOL CShiyan8View::PreCreateWindow(CREATESTRUCT& cs) {// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CShiyan8View drawingvoid CShiyan8View::OnDraw(CDC* pDC){CShiyan8Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data herefor(int i=0;i<m_nPicNum;i++){m_Pic[i].Draw(pDC);}}/////////////////////////////////////////////////////////////////////////////// CShiyan8View printingBOOL CShiyan8View::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CShiyan8View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CShiyan8View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CShiyan8View diagnostics#ifdef _DEBUGvoid CShiyan8View::AssertValid() constCView::AssertValid();}void CShiyan8View::Dump(CDumpContext& dc) const{CView::Dump(dc);}CShiyan8Doc* CShiyan8View::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CShiyan8Doc)));return (CShiyan8Doc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CShiyan8View message handlersvoid CShiyan8View::OnDrawFileopen(){// TODO: Add your command handler code here}void CShiyan8View::OnUpdateDrawFileopen(CCmdUI* pCmdUI){// TODO: Add your command update UI handler code herepCmdUI->Enable(FALSE);}void CShiyan8View::OnDrawFilesave(){// TODO: Add your command handler code herevoid CShiyan8View::OnUpdateDrawFilesave(CCmdUI* pCmdUI){// TODO: Add your command update UI handler code herepCmdUI->Enable(FALSE);}void CShiyan8View::OnDrawType(WORD nID){m_nDrawType = nID-ID_DRAWTYPE_LINE;}void CShiyan8View::OnUpdateDrawType(CCmdUI* pCmdUI){pCmdUI->SetRadio(m_nDrawType == pCmdUI->m_nID-ID_DRAWTYPE_LINE);}void CShiyan8View::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_nX0 = m_nX1 = ;m_nY0 = m_nY1 = ;CView::OnLButtonDown(nFlags, point);}void CShiyan8View::OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);CPen PenBK,PenLN,*pOldPen;if(nFlags & MK_LBUTTON)(PS_SOLID,1,RGB(255,255,255)); (PS_DASH, 1,RGB(255,0,0)); pOldPen = (&PenBK);switch(m_nDrawType){case 0:(m_nX0,m_nY0);(m_nX1,m_nY1);break;case 1:(m_nX0,m_nY0,m_nX1,m_nY1);break;case 2:(m_nX0,m_nY0,m_nX1,m_nY1);break;}(&PenLN);m_nX1 = ;m_nY1 = ;switch(m_nDrawType){case 0:(m_nX0,m_nY0);(m_nX1,m_nY1);break;case 1:(m_nX0,m_nY0,m_nX1,m_nY1);break;case 2:(m_nX0,m_nY0,m_nX1,m_nY1);break;}(pOldPen);CView::OnMouseMove(nFlags, point);}void CShiyan8View::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default CClientDC dc(this);CPen PenBK,PenLN,*pOldPen;(PS_SOLID,1,RGB(255,255,255));(PS_SOLID,3,RGB(255,0,0));pOldPen = (&PenBK);switch(m_nDrawType){case 0:(m_nX0,m_nY0);(m_nX1,m_nY1);break;case 1:(m_nX0,m_nY0,m_nX1,m_nY1);break;case 2:(m_nX0,m_nY0,m_nX1,m_nY1);break;}(&PenLN);m_nX1 = ;m_nY1 = ;switch(m_nDrawType){case 0:(m_nX0,m_nY0);(m_nX1,m_nY1);break;case 1:(m_nX0,m_nY0,m_nX1,m_nY1);break;case 2:(m_nX0,m_nY0,m_nX1,m_nY1);break;}m_Pic[m_nPicNum].m_nDrawType = m_nDrawType;m_Pic[m_nPicNum].m_nX0 = m_nX0;m_Pic[m_nPicNum].m_nY0 = m_nY0;m_Pic[m_nPicNum].m_nX1 = m_nX1;m_Pic[m_nPicNum].m_nY1 = m_nY1;m_nPicNum++;(pOldPen);CView::OnLButtonUp(nFlags, point);}其他的程序略四、实验总结:1.在Resource View中展开menu资源菜单中,设计如下:2、在Resource View中展开Toorlbar资源菜单中,设计如下:3、本实验的一部分代码可以从实验六中复制过来,但应注意变量名称。

mfc编程cstringlist实例 -回复

mfc编程cstringlist实例 -回复

mfc编程cstringlist实例-回复MFC编程中的CStringList实例在MFC(Microsoft Foundation Classes)编程中,CStringList是一个非常有用的类,用于管理字符串的链表。

它提供了许多方便的功能,使得操作字符串链表变得更加简单和高效。

在本文中,我们将逐步回答关于CStringList的问题,并给出一些实例代码来帮助读者更好地理解和使用这个类。

问题1:什么是CStringList?CStringList是MFC框架中的一个类,它是一个模板类,用于处理字符串的链表。

它使用的是C++的模板机制,可以在链表中存储任意类型的数据。

但在这里,我们主要关注它在处理字符串方面的应用。

问题2:如何创建一个CStringList对象?要创建一个CStringList对象,只需简单地声明一个新的实例即可:CStringList strList;这将创建一个名为strList的CStringList对象。

您可以根据需要创建多个实例,并在程序的任何地方使用它们。

问题3:如何向CStringList中添加字符串?要向CStringList中添加字符串,可以使用AddHead()或AddTail()成员函数。

AddHead()函数将字符串添加到链表的头部,而AddTail()函数则将字符串添加到链表的尾部。

下面是一些示例代码:CStringList strList;strList.AddHead("Hello");strList.AddTail("World");这将创建一个名为strList的CStringList对象,并向其头部添加字符串"Hello",在其尾部添加字符串"World"。

问题4:如何遍历并访问CStringList中的字符串?要遍历并访问CStringList中的字符串,可以使用CstringList的一个迭代器。

MFC编程例子

MFC编程例子

例程1. MFChello步骤1.选择新建-项目,打开后出现如果1所示对话框。

选择VC++中的智能设备,在右边选择MFC 智能设备应用程序。

在下方的名称中输入MFChello,点击确定。

步骤2.步骤3.步骤4.步骤5.步骤6在BOOL CMFChelloApp::InitInstance()添加如下代码AfxEnableControlContainer(); //调用此函数的目的是为了使程序支持包含OLE控件MessageBox(NULL,_T("一个简单的MFC程序"),_T("你好"),MB_OK); //谈出对话框例程2.鼠标测试程序同例程1一样,建立一个基于对话框的MouseTest程序。

在右边的对话框编辑器中选择Static Text,添加到对话框中一个静态文本,然后更改右下角的静态文本的属性,Caption改为提示:点一下鼠标右键或左键,ID改为IDC_STATIC点击对话框,在右下角点击消息按钮,出现下图。

找到WM_LBUTTONDOWN消息,添加OnLButtonDown函数。

在函数中添加代码如下MessageBox(NULL,_T("你点的是左键"),_T("The first Dialog"),MB_OK);同样操作在WM_RBUTTONDOWN消息,添加OnRButtonDown函数。

在函数中添加代码如下MessageBox(NULL,_T("你点的是右键"),_T("The first Dialog"),MB_OK);进行仿真即可。

例程3.添加图标创建一个基于对话框的IconTest程序。

切换到资源视图。

右键点击Icon,选择添加资源,弹出下图。

选择导入,导入一个图标文件(.ico)文件,如下图。

点击CIconTestDlg类,找到CIconTestDlg函数。

VCMFC编程实例1

VCMFC编程实例1

VCMFC编程实例1本文由sdhexu贡献pdf文档可能在WAP端浏览体验不佳。

建议您优先选择TXT,或下载源文件到本机查看。

下载第一部分基础知识用 V i s u a l C++ 和 M F C 创建的应用程序大多会自动生成窗口 , 并且可以处理消息 , 进行绘图. M i c r o s o f t 在这方面做了大量的工作 , 隐藏了内部工作 , 使我们能够更轻松地创建一个一般的应用程序.然而,当用户不能实现他们想要实现的功能时,适当地了解内部工作机制,对于消除编程上的困惑会有好处.更重要的是,知道怎样执行任务(诸如把窗口放置到什么地方,从什么地方获得一个消息和在任意地方绘图) ,有助于分清用户的应用程序和由Visual C++ 和 M F C 自动提供的限于窗口 , 消息和绘图的应用程序. Visual C++ 应用程序有四项主要基本知识:创建一个窗口,了解其他的M F C类,把消息发送到一个窗口和在一个窗口内绘图.当然还有其他一些基本知识,我们也将在涉及时适当地进行讨论.不过本部分将讨论以下四项基本知识.窗口在第1章中,我们首先讨论在使用和不使用MFC的情况下创建一个窗口,以便清楚地了解 M F C是如何工作的. M F C窗口既可以由属于 M F C的C + +类创建,也可以由一个早于并存在于 M F C之外的非C + +窗口类创建.我们将进一步观看窗口类并讨论那些由 Wi n d o w s操作系统提供的窗口类.最后,再看看 MFC应用程序中都有什么.类在第2章中,我们将全面地讨论M F C提供的强大的功能.大多数M F C类是从三个 M F C基类( C O b j e c t,C W n d和C C m d Ta rg e t )派生来的.并讨论构成一个应用程序的 M F C类,支持窗口界面的M F C 类,用来绘图的类,访问文件的类,维护数据和数据库的类和访问因特网 (Internet)的MFC类.消息处理在第3章中, 我们将讨论一个MFC应用程序是怎样通过消息与外界及应用程序进行通信的. 还将讨论四种消息类型,并跟踪一个消息通过接收消息的类.最后将探讨该路径上的重定向消息.绘图在第4章中,我们将讨论在窗口中绘图的方法,包括绘图工具,绘图用的颜色,在屏幕或打印机上绘图,绘制位图和图标,绘制矩形和圆,绘制动画.下载第1章窗口在本章中,我们将讨论M F C用户界面的基本要素:窗口.在此基础上比较 A P I 窗口和 M F C窗口的异同,描述如何创建一个窗口,销毁一个窗口和控制 Wi n d o w s操作系统与窗口的通信问题.1.1 窗口和API环境窗口是屏幕上的一个矩形区域,应用程序在该区域中显示数据并等待鼠标点击. Wi n d o w s应用系统的用户界面可以包含许多窗口,每个窗口都有不同的特点,但都是互相联系的,如图 1-1所示.窗口应用程序的主窗口窗口窗口窗口图1-1 Windows应用程序用户界面包括的窗口1.1.1 三种类型窗口在这么多窗口中,基本类型只有三种:重叠(Overlapped)窗口,弹出 (Popup)窗口和子窗口 ( C h i l d ).在它们之间并没有太多内在的差异,但是使用不同的窗口风格,它们的外观是不同的(见图1-2). 重叠窗口窗口. 弹出窗口通常以对话框和消息框的形式与用户对话. 子窗口通常用在视图(View)中,如在文本编辑器中的文本显示,也用在控件中,如在对话框中的OK按钮.而对那些看起来像按钮或控件的子窗口,也称为"控件"窗口. 重叠窗口和弹出窗口的主要区别是弹出窗口出现时可以没有标题 (也称为标题栏 ).子窗口与重叠窗口或弹出窗口的主要区别是子窗口只能出现在另一个窗口中,并且子窗口的任何多余部分都被该窗口移去或剪切掉.另外,子窗口是唯一不能有菜单条的窗口. 参见图1-3中的Windows 应用程序,其中包括重叠窗口,弹出窗口和子窗口. 通常用于建立应用程序主窗口.事实上,有时也叫做"主"窗口或者"框架"下载重叠窗口最基本的窗体第1章窗口3弹出窗口注意:在它的最基本的窗体中,系统不进行任何绘制. 窗口都是客户区子窗口注意:在它的最基本的窗体中,系统不进行任何绘制. 窗口都是客户区典型的外观注意:这都是客户区.子窗口通常自己进行绘制共同的设置注意:子窗口不能有子菜单图1-2 窗口风格可以用来区分三种不同类型的窗口不是一个窗口—显示在子窗口中, 并由子窗口绘制属于桌面的重叠窗口,也称为主窗口属于主窗口的弹出窗口属于主窗口的子窗口属于弹出窗口的子窗口,它位于弹出窗口之中图1-3 由重叠窗口,弹出窗口和子窗口组成的窗口应用程序1.1.2 客户区和非客户区每个窗口都有由系统绘制的"非客户区"和由应用程序绘制的"客户区" .系统可以绘制图1-4显示的其中一个或者全部特征,当然也可以把所有的特征留给你去绘制.任务栏应用程序图标最小化按钮最大化按钮菜单条关闭按钮垂直滚动条水平滚动条系统菜单(单击应用程序图标时,显示虚线框)客户区图1-4 窗口的非客户区可以由系统选择绘制每个窗口代表内存中的一个窗口对象,并由该窗口对象告诉 Wi n d o w s操作系统将窗口绘制在何处,以及在对鼠标单击,键盘按下(假设该窗口拥有输入焦点 )和时钟终止等事件作出响4图1-5).第一部分基础知识下载应时应调用什么应用程序.窗口对象自身是窗口类的一个实例,它不是Visual C++的类,而是存在于Visual C++之外,并早于Visual C++的Microsoft Windows所属的类.然而,就像C++的类一样,窗口类为每个基于它创建的窗口定义了若干特征,如背景色和往何处发送消息等(见窗口对象窗口类窗口①使用RegisterClass( ) 函数创建窗口类②窗口对象由CreateWindow( ) ③窗口管理器保持一个窗口对函数创建,作为它的变量传象列表,并告诉每个对象在输窗口类屏幕上绘制自己图1-5 Microsoft Windows所属的窗口类创建的窗口对象Wi n d o w s操作系统提供了一个扩展的应用程序接口 ( A P I ),可以用来创建和维护这些窗口对象.调用 C r e a t e Window( )函数可以创建一个窗口对象;调用 S e t WindowLong( )函数可以改变由窗口类定义的特征;调用MoveWindow( )函数可以移动窗口;调用DestroyWindow( )可以退出窗口.如此说来, MFC又能做些什么呢?1.2 窗口和MFC环境M F C窗口是 C + +和Windows API 调用的综合.事实上, M F C 窗口提供了许多 (但不是全部) Windows API的C + +封装,从而减轻了编写 Wi n d o w s应用程序时一些乏味的工作,并提供了一些新的服务. M F C窗口不对窗口对象进行直接控制,而在 A P I环境中却是可以的.如果不能在 A P I环境中实现某项功能,那么肯定也不能在 M F C环境中实现.举例来说, M F C库的C W n d可以创建一个窗口,但它只是过去在API环境中使用的API调用的封装. 微软已经把在 M F C库中创建和维护一个窗口的逻辑作为真正的 C + +封装和控制.然而, 这种方法虽使得MFC库万能,但却是不方便的,并导致了严重的冗余和更多的错误. 创建M F C窗口是复杂的,首先,创建类 C W n d的一个实例,然后调用类 C W n d的一个成员函数,该成员函数调用API中的CreatWindow( )函数.返回的窗口句柄 (这只是指向窗口对象的非直接指针 )保存在类CWnd的成员变量 m_hWnd中. 注意因为窗口在内存中创建,而内存经常发生变化,窗口地址可能是经常变化的.因此,窗口句柄并非直接指向窗口对象,而是指向跟踪窗口对象地址的另一个指针. 销毁窗口同样也是复杂的,必须确保销毁了该窗口对象,以及封装该窗口对象的 CWnd实例.虽然CWnd对象知道窗口对象,但是窗口对象并不知道 CWnd对象(见图1-6).下载窗口对象窗口类 CWnd类对象第1章窗口5窗口①首先,用 AfxRegister Class( ) 函数创建一个窗口类②然后,在堆栈上或堆中创建一个 CWnd类对象③调用 CWnd的成员函数 Create(),该函数自身调用图 1 - 4中看到的 ::Create Window()函数④ ::Create Window ⑤窗口管理器告知再次创建窗口; 每个窗口对象在窗口句柄保存到屏幕上绘制自己 CWnd中图1-6 应用两个对象创建MFC窗口尽管窗口应用程序的用户界面可以由几十个,甚至几百个窗口构成,但是大多数窗口还是由不到十个的窗口类创建的.即使在应用程序中有一千个窗口,每个窗口也只能是三种基本类型之一:重叠窗口,弹出窗口或子窗口.1.3 怎样应用MFC创建一个窗口可以用MFC的CWnd类创建一个窗口:CWnd wnd; BOOL b=wnd.CreateEx (ExStyle, ClassName, WindowName, Style, x, y, Width, Height, Parent, Menu, Param);第一行代码创建了一个CWnd类的对象,第二行通过调用Windows API函数CreateWindowEx( ) 创建了真正的窗口.HWND hwnd=::CreateWindowEx (ExStyle, ClassName, WindowName, Style, x, y, Width, Height, Parent, Menu, Instance, Param);因为C W n d类只是封装了用于创建窗口的 Windows API函数( C r e a t e WindowEx( )),因此, 从本质上讲,创建窗口所必须的参数在API环境和MFC环境中是相同的:■ ■ ■ ■ ■ ■参数Style和ExStyle决定窗口的"外观"和类型 (重叠,弹出,子窗口 ). 参数ClassName决定在创建窗口时使用的窗口类. 参数WindowName决定窗口标题内容(如果窗口标题有内容). 参数x, y, Width和Height决定窗口的位置和大小. 参数Parent指向拥有该窗口的窗口指针 (如果有这样的窗口 ). 参数M e n u指向内存中的一个对象,作为它的菜单使用—除非创建一个子窗口,如果是这样的话,那么该参数是帮助父窗口识别子窗口的IDnumber. 参数Instance识别该窗口属于哪个应用程序,以便发送到该窗口的消息能被发送到正确的应用程序的消息队列中. CWnd类填入Instance参数. 参数Param是在创建窗口时由窗口类使用的指针,该指针是指向附加信息的非强制性结构的指针.■■返回的hwnd参数是指向创建的窗口对象的指针,但在未创建任何窗口时,该参数返回值为NULL.窗口句柄自动地保存在CWnd类的m_hWnd成员变量中,这在前面的图 1-6中可以看到.6规则. 规则第一部分基础知识下载现在既然已了解了有关创建窗口的基本知识,那么让我们进一步来看看填写这些参数的1. 窗口名称参数该参数是一个零结尾的文本串,用该串指明在窗口标题栏中显示的内容.如果窗口没有标题栏,该参数可以为零(0). 然而,某些通用控件也使用该参数.例如,按钮控件把该参数的内容放在按钮的表面. 在创建窗口标题栏后,可以用类CWnd的成员函数SetWindowText()来改变窗口标题栏的名称.2. 风格和扩展风格参数这两个是3 2位的参数,用来指定创建什么类型的窗口.可以选择多种类型,如下面的例子所示:,WS_CHILD|WS_VISIBLE,窗口风格参数的作用包括:■用于创建三种基本窗口类型的风格,用 W M _ C H I L D创建一个子窗口;用 W M _ P O P U P 创建一个弹出窗口. W M _ O V E R L A P P E D创建一个重叠窗口.如果不为窗口指定任何一种风格,那么窗口风格默认为WM_OVERLAPPED. 用以增添窗口的非客户区特色的风格.例如,可以用 W S _ V S C R O L L为窗口添加一个垂直滚动条,如图 1-7所示其他非客户区窗口风格.■■若在CreateWindow( ) 中定义了菜单条,则菜单条出现, 它不是一个子窗口 (使窗口可视) (禁止窗口输入)如果选取了最小化或最大化按钮则关闭按钮出现图1-7 非客户窗口风格用来增添窗口的特色■由每个通用控件定义的风格.例如, B S _ F L AT按钮风格告诉按钮控件绘制一个二维按钮. 用来使窗口可视,可操作和 /或初始最大化的风格. 用来标识控件组起始控件的风格,或者当用户敲击 Tab键控制焦点在窗口中变化时,用来指示哪个控件有资格获得输入焦点的风格. 想了解更多的有关窗口风格的例子,请参阅附录 A.■ ■■在创建窗口以后,可以用C W n d的成员函数ModifyStyle( )和ModifyStyleEx( )改变窗口风格.某些风格可能要求重画窗口,这时,可以给 ModifyStyle( )函数添加第三个参数,自动激发类CWnd的成员函数SetWindowPos( )做重画窗口工作.下载CWnd wnd; wnd.ModifyStyle (0,WS_BORDER,SWP_NOZORDER);第1章窗口7事实上,给 M o d i f y S t y l e ( )或M o d i f y S t y l e E x ( )添加任何第三个参数,都需要添加下面的 S e t WindowPos( ) 选项: S W P _ N O Z O R D E R,S W P _ N O M O V E ,S W P _ N O A C T I VAT E和 SWP_SHOW. 注意有时候,甚至一个重画的窗口可能与新风格不相容,尤其对通用控件窗口来说更是这样.因为单个窗口决定重画窗口时使用什么风格.在这种情况下,唯一的办法是: 在事先存储已有窗口的风格和其他参数后,销毁和重建该窗口. 3. X 和Y位置参数这是两个 3 2位的参数,用于以像素为单位指定窗口的位置.创建重叠窗口和弹出窗口时,X和Y是相对于桌面窗口左上角的位置.而创建子窗口时, X和Y是相对于父窗口客户区的左上角位置.如果把 X和Y参数都设置为 C W _ U S E D E FA U LT,那么系统将自动为窗口选定一个位置.系统层叠排列这些新窗口 (见图1-8).第一窗口下一个窗口第三个窗口图1-8 CW_USEDEFAULT允许系统自动设定窗口位置然而,如果 X和Y参数都设置为 C W _ U S E D E FA U LT,那么子窗口在创建的时候,总被创建在(0, 0)的位置. 创建窗口以后,可以用类CWnd的成员函数MoveWindow( )移动窗口. 4. 宽度和高度参数这是两个 3 2位的参数,用于以像素为单位指定窗口的大小.如果将参数 Wi d t h和H e i g h t都设置为CW_USEDEFAULT,则系统将根据桌面窗口的大小,自动选定窗口的大小.然而,对于一个子窗口来说,系统将创建一个长和宽均为 0的窗口.如果窗口的风格是 W S _ M I N I M I Z E 或WS_MAXIMIZE,那么系统将忽视用户为 Width和Height设置的任何值. 创建窗口以后,可以用类CWnd的成员函数MoveWindow( )重新设置窗口的大小. 5. Z-Order 当几个窗口占据屏幕上同一区域时, Z - O r d e r决定哪个窗口显示在哪个窗口之上. Z O r d e r ( Z顺序)中的Z来源于坐标X-Y-Z轴的Z轴,其中Z轴垂直屏幕,并由屏幕指向外面.当窗口最初被创建或选中时,则窗口将出现在 Z - O r d e r的顶层.然而,该窗口永远不可能出现在一个最顶层窗口的上面,除非该窗口也是最顶层的窗口. "最顶层"窗口用 W S _ E X _ TO P M O S T 窗口风格创建,并显示在所有非最顶层窗口的上面,而与该窗口是不是当前选中的窗口无关. 创建窗口后,可以用 CWnd的成员函数 SetWindowPos()改变窗口的Z顺序. 6. 父窗口或物主窗口参数该参数是指向类 CW n d对象的指针,根据创建的窗口类型标识是父窗口还是物主窗口8■第一部分基础知识下载(Owner): 如果创建的是一个子窗口,那么用该参数来标识它的父窗口 (该子窗口所放置的并为之所截断的窗口 ).该值不能为 N U L L.子窗口只能出现在它的父窗口里面,当父窗口被销毁时它们也被销毁,并且当父窗口被隐藏或最小化时它们也被隐藏.■如果创建的是重叠窗口或弹出窗口,用该参数来标识物主窗口.如果该值为N U L L,则桌面窗口成为物主窗口.从属窗口总是显示在它们的主窗口上面,并且随着物主窗口的销毁而被销毁;物主窗口最小化时,则从属窗口被隐藏;但当物主窗口被隐藏时, 从属窗口并不被隐藏. 一个子窗口可能是另一个子窗口的父窗口,但绝不可能是一个物主窗口.如果试图使一个子窗口成为一个物主窗口,那么系统只能使那个子窗口的最顶层窗口作为物主窗口.图 1 - 9 是这些关系的概述.②子窗口对象被创建, 并显示在父窗口中①重叠或弹出窗口对象被创建,并显示在屏幕上③ 弹出或重叠窗口对象被创建,并显示在父窗口中图1-9 物主,父,子窗口的层次关系可以用 C W n d的成员函数 SetOwner( ) 改变已有窗口的物主窗口,用 C W n d的成员函数 SetParent( )改变父窗口. 7. 菜单或控件 ID 参数该参数用来标识菜单 ( M e n u )句柄或控件 (Control )ID,这要依赖于创建的窗口是子窗口, 重叠窗口,还是弹出窗口.■如果创建的是一个子窗口,用该参数标识控件 I D,控件I D通常用来帮助父窗口识别子窗口.因为该参数寻求一个 H M E N U变量,因此,需要用 H M E N U类型重载变量定义控件ID.例如,如果子窗口的控件 ID 是102,应该用如下方法定义它:…, (HMENU) 102,… ■如果创建的是一个重叠窗口或弹出窗口,用该参数定义窗口的菜单.若该值为 N U L L, 则菜单默认为在该窗口的窗口类中定义的任何菜单;如果窗口类也没有指定的菜单, 则该窗口在创建时没有菜单.可以用下面的方法为该参数加载一个菜单:HMENU hMenu=::LoadMenu (AfxGetInstanceHandle( ), MAKEINTRESOURCE (xx));下载这里的xx是应用程序资源里面的菜单 ID(Menu ID).第1章窗口9可以用CWnd的SetDlgCtrlID( )改变已有子窗口的 ID.用类CWnd 的成员函数 SetMenu( )改变一个重叠窗口或弹出窗口的菜单. 8. 实例前面已提到,CWnd类将填入该参数. CWnd通过调用AfxGetInstanceHandle( )获得该实例 (Instance).一个应用程序的实例从本质上标识了哪个程序在内存里. AfxGetInstanceHandle( ) 是由MFC库提供的静态函数. 9. 参数该3 2位参数 ( P a r a m e t e r )是可选的.它通常是指向一个结构或者类对象的指针,而该结构或者类对象是创建某种类型的窗口时需要提供的.例如,当用MDICLIENT窗口类创建窗口时, 需要该参数提供一个CLIENTCREATESTRUCT结构的指针.10. 类名参数类名(Class Name)参数是一个零结尾字符串,当创建一个窗口时,用来标识使用那个窗口类.关于窗口类和窗口处理,将在本章后面的内容中详细讨论.该参数不能为NULL,在创建一个非常一般的MFC窗口时,使用AfxRegisterWndClass (0)填入该参数.1.4 怎样使用MFC销毁一个窗口如前面所提到的一样,删除一个 M F C窗口可能有些烦琐,必须按下面的顺序删除两个对象:pWnd->DestroyWindow( ); //destroys Window Object delete pWnd; //destroys Cwnd Object也可以只删除 C W n d对象,因为 D e s t r o y Window( )是从CW n d的析构函数中调用的,但不提倡使用这种方法.销毁一个窗口而不先调用DestroyWindow( )函数,将使某些析构消息不能被任何从CWnd派生的类处理.你几乎不需自己销毁一个窗口,用户或系统通常会做这项工作. 如果需要在销毁窗口的同时销毁 C W n d对象,则应该在C W n d的派生类中添加下面的重载函数:CYourWnd::PostNcDestroy( ) { delete this; }PostNcDestroy( )是销毁窗口前调用的最后一个成员函数.但是,几乎不需对该函数进行重载,因为CWnd和派生类一般是嵌在另一个类中或建立在堆栈中的. 1.4.1 捆绑到一个已有的窗口如果一个窗口是用Windows API在应用程序建立之前或外面创建的,并且需要把它封装到CWnd类中,可以用下面的语句实现:CWnd wnd; wnd.Attach (hwnd);这里的hwnd是已有窗口的句柄. Attach( )只是把CWnd的成员变量 m_hWnd赋给hwnd. 也可以使用CWnd::FromHandle (hwnd),它查看是否有 C W n d对象已经封装了该窗口句柄并返回该 C W n d 对象的指针.如果不存在这样的 C W n d对象,将创建一个临时对象.如果是临10第一部分基础知识下载时对象,则不要使用该指针,因为在应用程序空闲的时候,该指针指向的对象将被删除. 1.4.2 窗口类前面已提及,一个窗口类不是一个 C + +类,而是早于并存在于 C + +之外的窗口专有的类. 窗口类的作用就像一个模板,可以由此创建其他窗口,并可共享某些特征,包括下面所示的特征: 类风格包括能给予窗口的一些微小的特征. 类图标类菜单如果窗口有图标,用它来指定在窗口的左上角处所画的图标. 如果窗口有菜单,用它来指定窗口中显示的菜单.类光标当光标通过窗口的客户区时,用它来指定显示哪种鼠标形状. 背景色定义用什么颜色来擦除窗口的背景色.窗口的客户区将显示该颜色. 窗口进程定义处理任何发送到该窗口的消息时应该调用的函数.定义窗口进程可能是窗口类唯一最重要的前提. 1.4.3 窗口进程窗口与环境的交互是通过发送和接收消息来实现的.如果系统要求窗口自己进行绘制, 系统给它发送一个 W M _ PA I N T 消息; 如果系统要求窗口销毁自己 , 则发送一个 W M _ D E S T R O Y消息.这些消息都由窗口的窗口进程处理,该窗口进程的地址在窗口类中定义.对于发送到由相同的窗口类创建的窗口的消息,系统采用完全相同的窗口进程进行处理. 相同的窗口进程是怎样跟踪所有的窗口的呢?它是怎么知道窗口A 画在( 1 0 , 3 4 ),而窗口 B画在 (56,21)呢?所有这些工作的完成只需使用窗口的窗口对象. 例如,所有用按钮窗口类创建的窗口,都使用相同的按钮窗口进程.如果一个WM_PAINT消息发送到其中任何一个窗口,则按钮窗口进程根据每个窗口的窗口对象指定的大小,位置和风格画出确切的按钮 (见图1-10).窗口对象③" BUTTON"的窗口进程搜索窗口对象,以查明绘制什么类型的按钮,如果风格是 "Check Box" ,则绘制一个复选框父窗口①用"BUTTON"窗口类创建的窗口②通过发送一个WM_PAINT 消息到窗口进程,窗口管理器告诉每个窗口绘制自己④如果风格是" Push Button",则窗口进程绘制一个按钮⑤ 窗口进程也搜索窗口对象以查明在哪里绘制这些控件窗口图1-10 按钮窗口进程使用窗口对象指定对哪个窗口进行操纵下载1.5 怎样使用MFC创建一个窗口类第1章窗口11当用户创建一个窗口类时,实际上只是在三个操作系统列表之一中注册一个 W N D C L A S S 结构.系统为每个窗口类类型维护一个列表: 系统全局类(System Global Class) 有效. 应用程序全局类(Application Global Class) 的线程有效. 应用程序局部类(Application Local Class) 由应用程序注册,并只对注册它们的应用程序或DLL有效. 当系统搜索一个窗口类时,从应用程序局部类开始,然后搜索应用程序全局类,最后搜索系统全局类. 要创建一个窗口类,可以先创建WNDCLASS结构的实例,然后用 MFC类库的AfxRegister Class( ) 注册它.也可以用 M F C类库的AfxRegisterWndClass( ) 来创建一个基于调用参数的WNDCLASS对象. 1.5.1 使用AfxRegisterWndClass( )函数注册一个窗口类 AfxRegisterWndClass( )函数在使用上是非常自动化的,一些通常需要你提供的参数都能自己填入,甚至连新的窗口类的名字也能自动产生.LPCTSTR lpszClassName=AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor=0,HBRUSH hbrBackground=0, HICON hIcon=0);在系统启动时注册,且必须注册,对所有应用程序都由应用程序注册,只对应用程序及应用程序这些参数的使用规则如下: 1. 类名根据传给该函数的参数,为新的窗口类产生名字.如果传输的参数完全相同,那么创建的窗口类也将完全相同.如果需要创建新的窗口类,可以用 AfxRegisterClass( ). 2. 风格窗口类风格由下面选项列表中一系列标记的或 (OR)运算提供: 类风格CS_OWNDC CS_PARENTDC CS_CLASSDC CS_SAVEBITS CS_BYTEALIGNCLIENT CS_BYTEALIGNWINDOW CS_GLOBALCLASS CS_VREDRAW CS_HREDRAW CS_NOCLOSE CS_DBLCLKS 描述为为该窗口类创建的每个窗口分配唯一的设备环境.有关设备环境的更详尽资料见第4章为从系统高速缓存中检索设备环境,然后设置该设备环境的剪裁区,以组合到父窗口中,以便子窗口能画在父窗口上为分配一个设备环境给所有由该窗口类创建的窗口使用为由该类创建的任何窗口的视频存储区将被保存,以便窗口移动或关闭时,不需要重画基础窗口—这对快速机器来说作用不大为当计算机的显示卡和 C P U速度较慢时,这两种风格有用.添加这些风格后,当窗口在字节边缘时,显示卡更容易移动窗口为如果设置该风格,则该类是应用程序的全局类,否则它是一个应用程序局部类为如果设置了垂直风格,并且窗口的垂直大小发生了变化,则整个窗口被重画. 水平风格也这样为禁用系统菜单中的关闭命令为如果未设置该参数,并且双击由该窗口类创建的窗口,则传送给应用程序的将不是双击事件,而是两个相继完成的单击事件12第一部分基础知识下载3. 图标(Icon) 该参数是显示在窗口左上角的图标的句柄,但只适用于使用 W S _ S Y S M E N U的窗口风格. 应用程序主窗口的图标也显示在任务栏上.如果将该参数设置为理过,用CWnd的SetIcon()可改变已有的图标.4. 光标(Cursor) 该参数是鼠标移经应用程序窗口的客户区时,将要显示的鼠标光标句柄.如果将该参数设置为NULL,则显示的是箭头光标.可以用下面的语句装载一个光标:HICON hIcon=AfxGetApp( )->LoadCursor (xx);N U L L ,并且设置了W S _ S Y S M E N U风格,则系统将提供一个默认的图标.在 M F C环境中,绝大部分图标已被处这里的xx是应用程序资源中光标的名字或ID. 这里指定的光标意味着是该窗口的默认光标.如果想动态地改变光标形状,则应该处理该窗口的WM_SETCURSOR消息,并用 SetCursor( )来改变光标形状 (见第8章例33). 5. 背景色当系统创建窗口时,先在显示窗口的地方画一个矩形区域,以擦除该区域的背景色.该参数指定填充该矩形域时所用画刷的句柄 (参见第 4章有关画刷的详细内容 ).为窗口类创建的画刷对象在该类退出注册时被自动释放. 在指定背景色时,也可以不创建画刷对象,而指定下面所列系统颜色之一:COLOR_ACTIVEBORDER COLOR_ACTIVECAPTION COLOR_APPWORKSPACE COLOR_BACKGROUND COLOR_BTNFACE COLOR_BTNSHADOW COLOR_BTNTEXT COLOR_CAPTIONTEXT COLOR_GRAYTEXT COLOR_HIGHLIGHT。

三个c++的MFC编程详细步骤

三个c++的MFC编程详细步骤

2-7 编写一个绘图程序,程序运行后,当用户在客户区窗口按下鼠标左键并移动时,根据鼠标移动的轨迹绘制出指定的线段。

第一步:在这添加(红色加粗字体)class CMFC_52View : public CView{protected: // create from serialization onlyCPoint m_ptOrigin;bool m_bDragging;HCURSOR m_hCross;第二步:在这添加(红色加粗字体)CMFC_52View::CMFC_52View(){m_bDragging=false;m_hCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);// TODO: add construction code here}第三步:击鼠标右键打开类向导,添加WM_LBUTTONDOMN;WM_MOUSEMOVE;WM_LBUTTONUP;如图:然后在添加(红色加粗字体):void CMFC_52View::OnLButtonDown(UINT nFlags, CPoint point){SetCapture();::SetCursor(m_hCross);m_ptOrigin=point;m_bDragging=TRUE;// TODO: Add your message handler code here and/or call defaultCView::OnLButtonDown(nFlags, point);}void CMFC_52View::OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default if(m_bDragging){CClientDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin=point;}CView::OnMouseMove(nFlags, point);}void CMFC_52View::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default if(m_bDragging){m_bDragging=false;ReleaseCapture();}CView::OnLButtonUp(nFlags, point);}第四步:在这添加(红色加粗字体):BOOL CMFC_52App::InitInstance(){AfxEnableControlContainer();。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1) 生成CwinApp的一个实例(调用CwinApp的构造函数), 初始化全局对象; (2) Win32入口程序函数WinMain调用函数AfxWinMain; (3) AfxWinMain调用函数CwinApp的成员函数InitInstance;
(4) AfxWinMain调用函数CwinApp的成员函数Run;
第10章 Visual C++编程实例
调试:
首先,使用Visual C++集成开发环境中的菜单选项 “ 文 件 / 新 建 ” , 并 在 项 目 选 项 卡 中 选 择 “ Win32 Application"。 其次,在编译时要确定应用程序的可执行程序如
何使用MFC的类库。一种方法是使用共享的动态链接
第10章 Visual C++编程实例
图 10-2
第10章 Visual C++编程实例
在CmyWnd类中声明了一个数组成员m_rectBubble,
用于存放泡泡的数据;另外,还声明了一个整型数据 成员m_nBubbleCount, 用来存放数组中泡泡的实际数量。 在框架窗口类的构造函数中该成员变量被初始化为0, 由于构造函数非常简单,因此使用了内联函数的形式。
第10章 Visual C++编程实例
第10章 Visual C++编程实例
10.1 MFC编程流程 10.2 常用MFC类和消息处理
10.3 对话框的应用
10.4 菜 单 的 应 用
10.5 工具栏应用
第10章 Visual C++编程实例
10.1 MFC编程流程
在普通的C/C++程序中,可以看到程序从main函数 开始到结束的所有代码,但在Visual C++中MFC封装了 一部分类,同时也隐藏了一部分代码,因此我们看不 到源程序的所有代码,例如从项目的所有源文件中找 不到main函数。 基本对话框的MFC程序流程图如图10-1所示。
第10章 Visual C++编程实例
3) 窗口的状态
(1) ShowWindow:显示或隐藏一个窗口,显示可以 有多种方式:最大化、最小化、正常显示等。 (2) IsWindowEnabled:判断一个窗口是否可见。 (3) IsWindowEnabled:判断窗口的禁止/使能状态,
禁止状态的窗口不能响应用户的键盘和鼠标的输入。
第10章 Visual C++编程实例
另外,也可以选择应用程序静态链接到MFC。静
态链接意味着,应用程序不依赖于MFC库文件的存在 (但仍然可能需要Msvcrt.dll文件)。静态链接的代价是
可执行文件更大,而且MFC内存的利用可能不够充分。
在菜单中选择“工程”中的“设置”对话框,在 对 话 框 右 方 的 “ General” 选 项 卡 中 通 过 组 合 框 “Microsoft Foundation Classes”选择使用MFC类库的方 法。可选项有三种,分别为“Not Using MFC(不使用 MFC)","Use MFC in a Shared DLL(以动态链接库方式使 用MFC)”和“Use MFC in a Static Library(以静态库方 式使用MFC)”。
}
第10章 Visual C++编程实例
}
void CMyWnd::OnPaint() {
CPaintDC dc(this);
CBrush brushNew; CPen penNew; brushNew.CreateSolidBrush(RGB(rand()%255,rand()%25 5,rand()%255));
penNew.CreatePen(PS_SOLID,1,RGB(255,0,0));
dc.SelectObject(&brushNew); dc.SelectObject(&penNew);
第10章 Visual C++编程实例
for(int i=0;i<m_nBubbleCount;i++)
dc.Ellipse(m_rectBubble[i]); } //应用程序类 class CMyApp:public CWinApp
{
public: BOOL InitInstance(); }; BOOL CMyApp::InitInstance()
第10章 Visual C++编程实例
{
CMyWnd *pFrame=new CMyWnd; pFrame->Create(0,_T("吹彩色泡泡")); pFrame->ShowWindow(m_nCmdShow); this->m_pMainWnd=pFrame;
第10章 Visual C++编程实例
10.2 常用MFC类和消息处理
10.2.1 常用MFC类 MFC的类构成了一个完整的体系,该体系由一个 被称为Cobject的类作为基类,其它类大部分由该类派 生而来,如CWnd(窗口类)、Cdocument(文档类)、 Cfile(文件类)等。也有一部分类如字符串类,Cstring和
int m_nBubbleCount;
public: CMyWnd() {m_nBubbleCount=0;}
第10章 Visual C++编程实例
protected:
afx_msg point); void OnLButtonDown(UINT nFlags,CPoint
afx_msg void OnPaint();
时间类Ctime等则不从Cobject继承。
第10章 Visual C++编程实例
1. 窗口公共基类CWnd
类CWnd对所有Windows窗口提供功能支持,它是 所有窗口类的直接或间接父类。 一个CWnd对象和一个Windows窗口是有本质区别 的,尽管它们有密切的联系。CWnd对象是一个C++ 概念,即类的实例,而Windows窗口则是指向Windows 内部数据结构的一个句柄,它的创建和显示要消耗系 统资源。一个CWnd对象通过其构造函数被创建,被析
(1) FlashWindow:闪烁窗口。
(2) MessageBox:弹出一个标准消息框。
第10章 Visual C++编程实例
例 如 : 开 始 一 个 系 统 定 时 器 每 0.5 秒 发 一 次
WM_TIMER消息,代码为: SetTimer(1,500,NULL): 其中,第一个参数表示定时器的标识,第二个参 数表示发送WM_TIMER的间隔时间,第三个参数是一 个回调函数,一般设为NULL。可以在WM_TIMER消 息的处理函数OnTimer(通过ClassWizard添加)中加入处 理代码来响应定时器消息。结束定时器的方法是调用
第10章 Visual C++编程实例
OnPaint()函数根据数组m_rectBubble的内容画出一
个泡泡。其中语句。 dc.SelectStockObject(LTGRAY_BRUSH); 用于选择一个库存画刷,画刷决定了所画图形(如 椭圆、矩形和多边形等)内部的颜色。 在处理鼠标消息的ONLButtonDown()函数中,语句 int r=rand()%50+10; 随机确定了要画出的泡泡的半径(范围为10~50像 素点),其中全局函数rand()可产生一个随机整数。
第10章 Visual C++编程实例
程序开始
生成CwinApp 一个实例, 的 初始化全局对象 AfxWinMain() 的函数体 初始化句柄
退出句柄 WindMain () 的函数体 消息循环
退出句柄
程序结束
图 10-1
第10章 Visual C++:
第10章 Visual C++编程实例
OnPaint()函数用于绘制客户区的内容。要完成这 项任各,需要先建立一个设备环境(Device Context),这 可以通过声明一个CpaintDC类的对象dc实现。在声明 语句中,应将当前窗口对象指针this 传给CpaintDC类的 构造函数,把绘图区域确定为当前窗口的客户区。 Windows在窗口更新、移动、改变尺寸或移去覆盖在 其上的其它窗口对象时均会向该窗口发送WM_PAINT 消息,从而触发应用程序调用OnPaint()函数重绘窗口 客户区。
(3) 窗口句柄的销毁:调用CWnd::DestroyWindow。
第10章 Visual C++编程实例
2) 窗口的大小和位置
(1) IsIconic:窗口是否处在最小化状态。 (2) IsZoomed:判断窗口是否在最大化状态。 (3) MoveWindow:改变窗口的大小、位置和Z轴顺序。 Z轴顺序指本窗口和其他窗口的覆盖关系。
组,每当用户按下鼠标左键时,就产生一个泡泡的数 据并存入数组中。最后,由框架窗口类的OnPaint()函 数显示所有的泡泡。
第10章 Visual C++编程实例
#include<afxwin.h>
#define MAX_BUBBLE 250 class CMyWnd:public CFrameWnd { CRect m_rectBubble[MAX_BUBBLE];
return TRUE;
} CMyApp ThisApp; //全局应用程序对象 按【Ctrl+F5】运行程序,运行结果如图10-2所示。
第10章 Visual C++编程实例
说明:
该程序声明了两个类,一个是由应用程序类 CwinApp派生出来的CmyApp类,一个是由框架窗口 CframeWnd类派生出来的CmyWnd类。MFC的基本类 名均以字母C打头,习惯上在为使用MFC编写的应用 程序中的类起名时也这样做。在程序中还声明了一个 CmyWnd类的全局对象ThisApp。
相关文档
最新文档