3.1 面向对象的窗口类的封装

本文介绍了面向对象封装在窗口类中的应用,通过参考MFC框架,提高代码的可读性和重用性。讨论了CWinApp作为应用程序类的角色,以及CWnd通用窗口类的功能。此外,详细阐述了QWinApp的设计,包括InitInstance、Run和ExitInstance三个关键函数的执行流程,旨在实现高效批量创建和管理窗口。

汽车产业生产初期,靠手工制件,所以效率极低;  随着工业发展,引入了汽车生产线,从而汽车可以批量生产,生产力水平大大提高。

同理,如果我们每次创建窗口,都要完成上百行代码,如果创建多的话,重复工作量太大。并且随着代码的增多,可读性也差 。所以说我们封装自己的一个窗口类,用这个窗口类批量,快速的创建窗口。这个我们可以参考古代的印刷术。

我们参照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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值