给win32窗口程序加个按钮

之前写过一个用很简单的代码创建一个win32窗口应用程序的博文
这是一篇补丁,来说明怎么增加一个按钮并且响应点击消息

由于是补丁,所以之前说过的话就不写了,看下面的代码里被注释围起来的部分

#include 
LRESULT CALLBACK xiaoxichuli (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HWND hwndButton;	//按钮的句柄 
	switch (message)
	{
	case WM_CREATE:  
/****************************创建按钮的部分**************************************/  
		//创建窗口的时候要做的事情
		hwndButton=CreateWindow(TEXT("BUTTON"), TEXT("喵"), WS_VISIBLE|WS_CHILD|WS_BORDER,10, 10,100, 30,hwnd,(HMENU)1/*给按钮一个ID为1*/,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE), NULL);
		break;
/****************************处理事件消息部分*************************************/ 
	case WM_COMMAND:
		if(LOWORD(wParam)==1)		   //响应ID为1的消息 
		{
			MessageBox(hwnd,TEXT("来戳我吖!"),TEXT("喵吖喵"),MB_OK);//跳一个卖萌的消息框出来 
		}
		break;
/********************************************************************************/
	case   WM_DESTROY:
		// 在消息队列中插入一个[退出程序]消息
		PostQuitMessage (0) ;
		break;
	default:return DefWindowProc (hwnd, message, wParam, lParam) ;
	}
	// 执行内定的消息处理
	return 0;
}

int PASCAL	WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
	static char szAppName[] = TEXT("喵");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;
	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = xiaoxichuli;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);// 加载 图标供程序使用 IDI-图示ID  
	wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);// 加载 鼠标光标供程序使用  IDC-游标ID
	wndclass.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH); //GetStockObject 取得一个图形对象(此例中是取得窗口背景的画刷对象)
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;
	
	// 注册窗口
	if (!RegisterClass(&wndclass))		  //如果程序类没法注册的话
	{
		MessageBox(NULL,TEXT("程序无法运行"),szAppName,MB_ICONERROR);
		return 0;
	}
	 //根据窗口类别 WndClass 建立一个窗口
	hwnd = CreateWindow(szAppName,TEXT("喵~"),WS_SYSMENU,CW_USEDEFAULT,CW_USEDEFAULT,200,100,NULL,NULL,hInstance,NULL);
	// 在屏幕上显示窗口
	ShowWindow(hwnd,iCmdShow);
	// 指示窗口自我更新
	UpdateWindow(hwnd);
	// 从消息队列中取得消息
	while (GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

以上是一个可以编译运行的代码,除了围起来的部分其它地方都没变【只是改了下消息处理函数的名字
在win32程序里,创建按钮也是用CreateWindow函数,只是参数有点不同:
·窗口样式要有WS_CHILD,否则不会显示出来【另外两个样式可有可无】
·要有父窗口句柄
·第一个参数为TEXT(“BUTTON”),似乎不可以是其他的
·第二个参数的作用变成定义按钮上的文字
·原本的菜单句柄那里变成了ID号

而且按钮不用窗口注册和显示函数…
关于消息处理这一块我还没搞太明白,就不详解了。



本文发布于 https://luojia.me

本站文章未经文下加注授权不得拷贝发布。

本博客使用Disqus评论系统,如果看不到评论框,请尝试爬墙。