汽车产业生产初期,靠手工制件,所以效率极低; 随着工业发展,引入了汽车生产线,从而汽车可以批量生产,生产力水平大大提高。
同理,如果我们每次创建窗口,都要完成上百行代码,如果创建多的话,重复工作量太大。并且随着代码的增多,可读性也差 。所以说我们封装自己的一个窗口类,用这个窗口类批量,快速的创建窗口。这个我们可以参考古代的印刷术。
我们参照MFC框架进行封装:一来可以提高代码的可读性和重用性;二来可以了解MFC的内部运行机制。
3.1MFC的应用程序框架
CWinApp:应用程序类,每个应用程序有且只有一个继承自CWinApp的派生类对象。
CWnd:一个通用窗口类,用来提供Windows中的所有通用特性、对话框和控件。
3.2应用程序类QWinApp的设计
3.2.1 InitInstance函数的执行过程
该函数提供一个接口给派生类,让派生类重载该函数,实现注册窗口,创建窗口、显示更新窗口等功能。但对于基类函数来说,仅仅只是个接口,直接返回。
3.2.2 Run函数内部执行过程
该函数从消息队列中取出消息,并将消息派遣到对应的窗口回调函数中。
<span style="font-family:Microsoft YaHei;">void QWinApp::run()
{
MSG msg;
while(::GetMessage(&msg,NULL,NULL,NULL)
{
::TranslateMessage(&msg);
::DispathchMessage(&msg);
}
}
</span>3.2.3 ExitInstance函数内部执行过程
当应用程序退出后,该函数主要是做最后的收尾工作,比如销毁指针等。
同样,对于基类来说,仅仅只是个接口,直接返回。
下面我们模拟第二节MFC窗口产生过程。
//stdafx.h //必要头文件
#include"Windows.h"
#include"tchar.h"
#include"assert.h"
//stdafx.cpp
stdafx.h//QWinApp.h 创建基类
#pragma once
#include "stdafx.h"
class QWinApp
{
public:
QWinApp(void);
~QWinApp(void);
public:
virtual BOOL InitInstance();
virtual BOOL ExitInstance();
virtual void run();
public:
LPVOID m_pMainWnd; //保存主窗口对象的指针
};
//QWinApp.cpp
#include "QWinApp.h"
#include "Global.h"
QWinApp::QWinApp(void)
{
m_pMainWnd=NULL;
g_pWinApp=this;
}
QWinApp::~QWinApp(void)
{
}
BOOL QWinApp::InitInstance()
{
return TRUE; //只是为子类对象提供一个接口,不做任何事情,直接返回
}
BOOL QWinApp::ExitInstance()
{
return TRUE;
}
void QWinApp::run()
{
MSG msg;
while(GetMessage(&msg,NULL,NULL,NULL)) //第二个参数为NULL 因为消息循环接收所有窗口的消息
{
//消息循环
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
//Global.h //获取全局QWinApp指针
#pragma once
#include "QWinApp.h"
#include "stdafx.h"
extern QWinApp *g_pWinApp; //外部变量
extern QWinApp* glbGetApp(); //模拟MFC AfxGetApp函数
<strong>//Global.cpp</strong>
#include "Global.h"
QWinApp *g_pWinApp=NULL;
QWinApp* glbGetApp()
{
return g_pWinApp;
}
//QWinDemoApp.h 子类,继承QWinApp
<pre name="code" class="cpp">#pragma once
#include "qwinapp.h"
class QDemoWinApp :
public QWinApp
{
public:
QDemoWinApp(void);
~QDemoWinApp(void);
public:
virtual BOOL InitInstance();
virtual BOOL ExitInstance();
};
extern QDemoWinApp theApp;
//QWinDemoApp.cpp
#include "QDemoWinApp.h"
//窗口过程函数
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CLOSE:
{
::DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
{
::PostQuitMessage(0);
}
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
QDemoWinApp::QDemoWinApp(void)
{
}
QDemoWinApp::~QDemoWinApp(void)
{
}
QDemoWinApp theApp; //产生全局对象
BOOL QDemoWinApp::InitInstance()
{
HINSTANCE hInstance=(HINSTANCE)GetModuleHandle(NULL); //GetMOduleHandle函数获得当前应用程序实例句柄
assert(hInstance);
const TCHAR* pszClassName=_T("lsfreeing");
WNDCLASSEX wcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hbrBackground=(HBRUSH)::GetStockObject(BLACK_BRUSH);
wcex.hCursor=(HCURSOR)::LoadCursor(NULL,IDI_QUESTION);
wcex.hIcon=(HICON)::LoadIcon(NULL,IDI_APPLICATION);
wcex.hIconSm=NULL;
wcex.hInstance=hInstance;
wcex.lpfnWndProc=WindowProc;
wcex.lpszClassName=pszClassName;
wcex.lpszMenuName=NULL;
wcex.style=CS_HREDRAW | CS_VREDRAW;
BOOL flag=::RegisterClassEx(&wcex);
if(flag==FALSE)
{
MessageBox(NULL,_T("注册失败"),_T("lsfreeing"),MB_YESNOCANCEL);
return FALSE;
}
HWND hwnd=::CreateWindowEx(0,pszClassName,_T("ls"),WS_VISIBLE|WS_OVERLAPPEDWINDOW
,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);//创建窗口
if(hwnd==NULL)
{
MessageBox(NULL,_T("创建失败"),_T("ls"),MB_YESNOCANCEL);
return FALSE;
}
::ShowWindow (hwnd,SW_SHOW); //显示
::UpdateWindow(hwnd); //更新
return TRUE;
}
BOOL QDemoWinApp::ExitInstance()
{
return TRUE;
}
//main.cpp
#include"QDemoWinApp.h"
#include"Global.h"
int WINAPI WinMain(HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow) //_tWinMain兼容不同字符集
{
QWinApp* pWinApp=glbGetApp();
assert(pWinApp);
pWinApp->InitInstance();
pWinApp->run();
pWinApp->ExitInstance();
return TRUE;
}
本文介绍了面向对象封装在窗口类中的应用,通过参考MFC框架,提高代码的可读性和重用性。讨论了CWinApp作为应用程序类的角色,以及CWnd通用窗口类的功能。此外,详细阐述了QWinApp的设计,包括InitInstance、Run和ExitInstance三个关键函数的执行流程,旨在实现高效批量创建和管理窗口。


被折叠的 条评论
为什么被折叠?



