您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > MFC-Windows应用程序设计-第2章-Windows应用程序的类封装
MFCWindows应用程序设计第2章Windows应用程序的封装在早期的编程生涯中,程序员采用C语言和WindowsAPI函数进行Windows程序设计。采用这种方式进行程序开发,使得开发过程艰苦、乏味。随着编程技术的不断发展,Windows编程采用了面向对象的程序设计思想(ObjectOrientedProgramming,OOP)。这种思想集抽象性、封装性、集成性和多态性于一体,提高了编程的效率。下面对Windows应用程序中的面向对象思想进行介绍。第2章Windows应用程序的封装应用程序主函数的C++封装2.1派生类的封装2.2窗口函数的封装-----消息映射2.3Windows应用程序主函数的任务是创建并显示窗口和实现消息循环。为了形成程序框架,应该声明两个类:应用程序类和窗口类。2.1应用程序主函数的C++封装2.1.1窗口类的声明classCFrameWnd{public:HWNDhWnd;public:intRegisterWindow();voidCreate(LPCTSTRlpClassName,LPCTSTRlpWindowName);voidShowWindow(intnCmdShow);voidUpdateWindow();};2.1应用程序主函数的C++封装2.1.1窗口类的声明intCFrameWnd::RegisterWindow(){WNDCLASSwc;wc.style=0;wc.lpfnWndProc=WndProc;wc.cbClsExtra=0;wc.cbWndExtra=0;wc.hInstance=hInstance;wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);wc.hCursor=LoadCursor(NULL,IDC_ARROW);wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszMenuName=NULL;wc.lpszClassName=lpszClassName;returnRegisterClass(&wc);}2.1应用程序主函数的C++封装2.1.1窗口类的声明voidCFrameWnd::Create(LPCTSTRlpClassName,LPCTSTRlpWindowName){RegisterWindow();hInst=hInstance;hWnd=CreateWindow(lpszClassName,lpWindowName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);}2.1应用程序主函数的C++封装2.1.1窗口类的声明voidCFrameWnd::ShowWindow(intnCmdShow){::ShowWindow(hWnd,nCmdShow);}voidCFrameWnd::UpdateWindow(){::UpdateWindow(hWnd);}2.1应用程序主函数的C++封装2.1.2应用程序类的声明---CWinAppclassCWinApp{public:CFrameWnd*m_pMainWnd;public:BOOLInitInstance(intnCmdShow);intRun();};2.1应用程序主函数的C++封装2.1.2应用程序类的声明---CWinAppBOOLCWinApp::InitInstance(intnCmdShow){m_pMainWnd=newCFrameWnd;m_pMainWnd-Create(NULL,封装的Windows程序);m_pMainWnd-ShowWindow(nCmdShow);m_pMainWnd-UpdateWindow();returnTRUE;}2.1应用程序主函数的C++封装2.1.2应用程序类的声明---CWinAppintCWinApp::Run(){while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}returnmsg.wParam;}2.1应用程序主函数的C++封装2.1.3主函数封装后的程序CWinApptheApp;intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){intResultCode=-1;theApp.InitInstance(nCmdShow);returnResultCode=theApp.Run();}2.1应用程序主函数的C++封装2.2派生类的应用2.2.1应用程序类的派生类classCWinApp{public:CFrameWnd*m_pMainWnd;public:virtualBOOLInitInstance(intnCmdShow);intRun();~CWinApp();};2.2派生类的应用2.2.1应用程序类的派生类BOOLCWinApp::InitInstance(intnCmdShow){m_pMainWnd=newCFrameWnd;m_pMainWnd-Create(NULL,封装的Windows程序);m_pMainWnd-ShowWindow(nCmdShow);m_pMainWnd-UpdateWindow();returnTRUE;}2.2派生类的应用2.2.1应用程序类的派生类classCMyApp:publicCWinApp{public:BOOLInitInstance(intnCmdShow);//重新定义InitInstance函数};2.2派生类的应用2.2.1应用程序类的派生类CMyApp::InitInstance(intnCmdShow){m_pMainWnd=newCFrameWnd;m_pMainWnd-Create(NULL,用新的InitInstance函数的程序);m_pMainWnd-ShowWindow(nCmdShow);m_pMainWnd-UpdateWindow();returnTRUE;}2.2.2窗口类的派生类2.2派生类的应用2.3.1消息处理函数的简单封装2.3窗口函数的封装---消息映射classCFrameWnd{public:HWNDhWnd;public:intRegisterWindow();voidCreate(LPCTSTRlpClassName,LPCTSTRlpWindowName);voidShowWindow(intnCmdShow);voidUpdateWindow();intAfxWndProc(HWND,UINT,WPARAM,LPARAM);};intCCmdTarget::AfxWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_LBUTTONDOWN:On_LButtonDown(hWnd,message,wParam,lParam);break;caseWM_PAINT:On_Paint(hWnd,message,wParam,lParam);break;caseWM_DESTROY:On_Destroy(hWnd,message,wParam,lParam);break;default:returnDefWindowProc(hWnd,message,wParam,lParam);}return0;}LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){AfxWndProc(hwnd,message,wParam,lParam);}2.3.1消息处理函数的简单封装2.3窗口函数的封装---消息映射MFC用CCmdTarget封装窗口函数classCCmdTarget{public:intAfxWndProc(HWND,UINT,WPARAM,LPARAM);voidOn_LButtonDown(HWND,UINT,WPARAM,LPARAM);voidOn_Paint(HWND,UINT,WPARAM,LPARAM);voidOn_Destroy(HWND,UINT,WPARAM,LPARAM);};2.3窗口函数的封装---消息映射2.3.2消息映射1、类的消息处理函数afx_msgvoidOnLButtonDown();afx_msgvoidOnDestroy();afx_msgvoidOnPaint();2.3窗口函数的封装---消息映射2.3.2消息映射2、类的消息映射表structMSGMAP_ENTRY{UINTnMessage;void(*pfn)(HWND,UINT,WPARAM,LPARAM);};2.3消息映射2、类的消息映射表消息分类Windows消息:除WM_COMMAND之外,以WM_开头的消息。从CWnd派生的类都可以接收到这类消息。命令消息:自菜单、工具条按钮、加速键等用户接口对象的WM_COMMAND通知消息。在MFC中通过资源项的标识(ID)来区分不同的命令消息。控制通知消息:是控制子窗口送给父窗口的WM_COMMAND通知消息。2.3.2消息映射2、类的消息映射表structAFX_MSGMAP_ENTRY{UINTnMessage;//Windows消息的ID号UINTnCode;//为控制消息的通知码UINTnID;//Windows控制消息的IDUINTnLastID;//表示如果是一个指定范围的消息被//映射的,nLastID用来表示它的范围。UINTnSig;//表示消息的动作标识AFX_PMSGpfn;//一个指向和该消息相应的执行函数的指针};2.3窗口函数的封装---消息映射2.3.3消息映射表的声明和实现1、宏DECLARE_MESSAGE_MAP2、宏BEGIN_MESSAGE_MAPBEGIN_MESSAGE_MAP(类名,基类名)2.3窗口函数的封装---消息映射2.3.3消息映射表的声明和实现3、ON_××××Windows消息的宏前缀为“ON_WM_”这样的宏不带参数,因为它对应的消息和消息处理函数的函数名称、函数原型是确定的。MFC提供了这类消息处理函数的定义和缺省实现。每个这样的宏处理不同的Windows消息。ON_WM_LBUTTONDOWN()2.3窗口函数的封装---消息映射2.3.3消息映射表的声明和实现3、ON_××××命令消息的宏:ON_COMMAND这类宏带有参数,需要通过参数指定命令ID和消息处理函数。这些消息都映射到WM_COMMAND上,也就是将消息映射条目的第一个成员nMessage指定为WM_COMMAND,第二个成员nCode指定为CN_COMMAND(即0)。消息处理函数的原型是void(void),不带参数,不返回值。2.3窗口函数的封装---消息映射2.3.3消息映射表的声明和实现3、ON_××××控制通知消息的宏:ON_BN_CLICKED(消息标识,对应的消息处理函数)ON_CBN_DBLCLK(消息标识,对应的消息处理函数)2.3.3消息映射表的声明和实现4、END_MESSAGE_MAP2.3窗口函数的封装---消息映射作业:作业本:P622-1,2-2,2-3,2-4,2-5上机:在例题2-5的基础上,添加当鼠标左键按下移动鼠标在鼠标所
本文标题:MFC-Windows应用程序设计-第2章-Windows应用程序的类封装
链接地址:https://www.777doc.com/doc-6721362 .html