二、WM_CREATE消息

来源(CSDN博客)

From: https://blog.csdn.net/nuomibuliu/article/details/39118855

二、WM_CREATE消息

2014年09月07日 11:43:45 nuomibuliu 阅读数:2469更多

个人分类: Win32

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nuomibuliu/article/details/39118855

一、CreateWindowEx()

通常程序员在学习一个新语言或是属性一个新环境的时候所试验性写的第一个程序叫做Hello World,都会及其粗俗的在屏幕上以各式各样的方式来展示出这么样Hello World一句的问候。

所以在这里便不再沿用这个粗俗的习惯,写一个叫作“你好世界”的程序。

写这么样的一个程序很简单,只需要将前面一个程序改动一点:

HWND hwndMain=CreateWindowEx(WS_EX_CLIENTEDGE,
	"MAIN",
	"你好世界",
	WS_OVERLAPPEDWINDOW,
	CW_USEDEFAULT,CW_USEDEFAULT,
	CW_USEDEFAULT,CW_USEDEFAULT,
	NULL,
	NULL,
	hInstance,
	NULL);


将第三个参数,程序标题更改即可。

这是最直接的改动方法,下面来通过其他修改标题的方式来看看CreateWindowEX()与WM_CREATE之间的关系。

二、WM_CREATE消息

BOOL SetWindowText(
	HWND hWnd,         // handle to window or control
	LPCTSTR lpString   // address of string
);


SetWindowText()函数第一个参数传入需要改变标题的窗口句柄,第二个参数为要设置的标题。

所以可以对这个标题在消息处理函数中在WM_CREATE消息中用SetWindowText()作修改。

LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	if(uMsg==WM_DESTROY)
	{
		PostQuitMessage(0);
		return 0;
	}
	else if(uMsg==WM_CREATE)
	{
		SetWindowText(hwnd,"你好世界");
		return 0;
	}
	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}


三、CreateWindowEX()与WM_CREATE

CreateWindowEX()与WM_CREATE之间有着非常直接的关系:在CreateWindowEX()函数里,处理完必要的创建窗口步骤后,就会发出WM_CREATE消息。

CreateWindowEx()中创建窗口的全部参数都会被放在CREATESTRUCT结构体内,并将指针地址赋值给WM_CREATE的lParam参数。

CREATESTRUCT结构体:

typedef struct tagCREATESTRUCT { // cs
	LPVOID    lpCreateParams;
	HINSTANCE hInstance;
	HMENU     hMenu;
	HWND      hwndParent;
	int       cy;
	int       cx;
	int       y;
	int       x;
	LONG      style;
	LPCTSTR   lpszName;
	LPCTSTR   lpszClass;
	DWORD     dwExStyle;
} CREATESTRUCT;


创建窗口时:

BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
	g_hInstance=hInstance;
	HWND hwndMain=CreateWindowEx(WS_EX_CLIENTEDGE,
		"MAIN",
		"MyWin",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,
		CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		"你好世界");
	if(hwndMain==NULL) return 0;
	ShowWindow(hwndMain,nCmdShow);
	UpdateWindow(hwndMain);
	return 1;
}


消息处理函数里:

LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	if(uMsg==WM_DESTROY)
	{
		PostQuitMessage(0);
		return 0;
	}
	else if(uMsg==WM_CREATE)
	{
		CREATESTRUCT *pcs=(CREATESTRUCT*)lParam;
		SetWindowText(hwnd,(LPCSTR)(pcs->lpCreateParams));
		char buf[256];
		sprintf(buf,"%s -> %s",(LPCSTR)(pcs->lpszName),(LPCSTR)(pcs->lpCreateParams));
		MessageBox(hwnd,buf,"",MB_OK);
		return 0;
	}
	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

Link: http://www.asm32.net/article_details.aspx?id=7327


浏览次数 0 发布时间 2018-09-22 14:38:50 从属分类 VC++ 【评论】【 】【打印】【关闭
 
| www.asm32.net | 2006版 | 资料中心 | linux | asm/asm32 | C/C++ | VC++ | java | Python | 书签 | ASP.Net书签 | 京ICP备09029108号-1