`
lingyibin
  • 浏览: 191019 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

MFC学习笔记(四)

阅读更多

前面写了那么多代码,但很多东西都是固定的,我们需要写的主要是消息处理函数。。。所以可以把这些代码模块化,把要我们写的部分空出来。

下面的代码虽然有点复杂,但已经给出了类似这样的模块化方法。

 

 

#include<windows.h>
//定义全局变量-------------------------------------------------------------------------------
HINSTANCE		hInst;	
HWND 			hWnd;		
MSG			msg;
char lpszClassName[]="窗口";
char *ShowText;

//声明函数原型-------------------------------------------------------------------------------
ATOM			MyRegisterClass(HINSTANCE hInstance);//注册窗口类函数
BOOL			Create(HINSTANCE, int);  //程序实例初始化函数
int				Run( );                  //消息循环函数

LRESULT CALLBACK	WndProc(			//窗口函数
HWND, UINT, 
WPARAM, LPARAM);
 						
void OnLButtonDown(			// WM_LBUTTONDOWN消息处理函数
HWND hWnd, 
UINT message, 
WPARAM wParam, 
LPARAM lParam);

void OnPaint(					// WM_PAINT消息处理函数
HWND hWnd, 
UINT message, 
		WPARAM wParam, 
LPARAM lParam);

void OnDestroy(				// WM_DESTROY消息处理函数
HWND hWnd, 
UINT message, 
		WPARAM wParam, 
LPARAM lParam);
//////////上面的都是声明,下面是实现
//主函数-----------------------------------------------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	
	MyRegisterClass(hInstance);        	//定义和注册窗口类
	Create(hInstance, nCmdShow);  		//创建窗口
	ShowWindow(hWnd, nCmdShow);   	//显示窗口
	UpdateWindow(hWnd);            	//更新屏幕显示
	return Run();                     	//消息循环
}
//注册窗口类函数的实现-------------------------------------------------------------
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASS wc;
	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;
	return RegisterClass(&wc);
}
//创建窗口函数的实现----------------------------------------------------------------------
BOOL Create(HINSTANCE hInstance, int nCmdShow)
{
	hWnd=CreateWindow(	lpszClassName,
						"Windows",
						WS_OVERLAPPEDWINDOW,
						400,300,300,250,
						NULL,
						NULL,
						hInstance,
						NULL);
   return TRUE;
}
//消息循环函数的实现----------------------------------------------------------------------
int Run( )
{
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
//窗口函数的实现-----------------------------------------------------------------------------
#define DECLARE_MESSAGE_MAP( ) \
struct MSGMAP_ENTRY  _messageEntres[ ];\

#define BEGIN_MESSAGE_MAP( ) \
struct MSGMAP_ENTRY  _messageEntres[ ] = \
{ \

#define ON_WM(messageID,msgFuc) \
	messageID,msgFuc,
#define END_MESSAGE_MAP( ) \
};\

void On_LButtonDown(HWND, UINT, WPARAM, LPARAM);
void On_Paint(HWND, UINT, WPARAM, LPARAM);
void On_Destroy(HWND, UINT, WPARAM, LPARAM);
struct MSGMAP_ENTRY
{
	UINT nMessage;
	void (*pfn)(HWND, UINT, WPARAM, LPARAM );
};
//声明消息映射表
DECLARE_MESSAGE_MAP( )
BEGIN_MESSAGE_MAP( )
ON_WM(WM_LBUTTONDOWN,On_LButtonDown)
ON_WM(WM_PAINT,On_Paint)
ON_WM(WM_DESTROY,On_Destroy)
END_MESSAGE_MAP( )

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 
WPARAM wParam, LPARAM lParam)
{
int i;
	int n = sizeof ( _messageEntres)/sizeof(_messageEntres[0] );
	for (i = 0; i < n; i ++)
	{
		if (message == _messageEntres [ i ] . nMessage )
			( *_messageEntres [ i ] . pfn )( hWnd, message, wParam, lParam);
	}
	
	return DefWindowProc(hWnd, message, wParam, lParam);
}


//鼠标左键单击消息处理函数的实现---------------------------------------------------
void On_LButtonDown(HWND hWnd, UINT message, 
				WPARAM wParam, LPARAM lParam)
{
	ShowText="Hello!";
	InvalidateRect(hWnd,NULL,1);
}
//重绘窗口用户去消息处理函数的实现------------------------------------------------
void On_Paint(HWND hWnd, UINT message, 
				WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	hdc = BeginPaint(hWnd, &ps);
	TextOut(hdc,50,50,ShowText,6);
	EndPaint(hWnd, &ps);
}
//销毁窗口消息处理函数的实现----------------------------------------------------------
void On_Destroy(HWND hWnd, UINT message, 
				WPARAM wParam, LPARAM lParam)
{
	PostQuitMessage(0);
}

 

 上面这些代码,看不懂也没什么关系,只要知道 做一个简单的窗口,我们需要写的东西就只是红色的部分。 这就是MFC进行封装的原理。

ps:上面的代码在编辑时有红色的字,但发表时红色的字段依旧是黑色,只是被html标签:"<span></span>"包围起来了。所以这边指的红色的字就是被那html标签包围的文字。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics