c++创建窗口步骤 :

/*练习如何创建一个窗口:
 
 (1)声明窗口消息处理函数
 (2)窗口主函数的声明,窗口类的创建
 (3)窗口类的注册
 (4)窗口显示模式的设定 主函数和处理函数的消息传递
 (5)完成消息处理函数

*/

代码每一行都写了注释,希望对你有帮助 同时也算是给自己做个笔记了。若有不懂,获取需要源代码请看代码末尾。

​
​
//(1)窗口消息处理函数: 返回值:LRESULT->long   "_stdcall" 修饰函数参数从右向左通过堆栈传递 
//四个参数:HWND:窗口句柄 UINT 消息值(int) WPARAM:消息参数1 LPARAM:消息参数2

LRESULT _stdcall WinProcess(HWND hwnd, UINT Message, WPARAM  WIparam, LPARAM IParam); 

//(2)窗口主函数的声明,窗口类的创建
int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hpreInstance, char* lpCmdLine, int nCmdShow)
{
	WNDCLASSEXA WindowsClass;
	WindowsClass.cbSize = sizeof(WNDCLASSEXA);  //第一个成员:cbSize 分配给WNDCLASSEX类型的空间,直接计算即可
	WindowsClass.style = CS_HREDRAW | CS_VREDRAW;  //第二个成员:style 窗口类所有窗口的样式 CS_开头常量 多个以“|”分割 注意是一个 |
	WindowsClass.lpfnWndProc = WinProcess;  //第三个成员 IpfnWndProc指向的是消息处理函数,即为上面声明的函数。注意到WndProc指的是函数类型
	WindowsClass.cbClsExtra = 0;//第四个成员:cbClsExtra 该类生成的所有窗口共享该附加空间
	WindowsClass.cbWndExtra = 0;//第五个成员:cbWndExtra 是对窗口的,每一个实例化一个窗口的空间
	WindowsClass.hInstance = hInstance;//第六个成员:模块实例句柄  第一个参数就是
	WindowsClass.hIcon = LoadIconA(hInstance, MAKEINTRESOURCEA(32512));//第七个成员:hIcon 图标句柄,系统IDI_开头的常量
	WindowsClass.hCursor = LoadCursorA(hInstance, MAKEINTRESOURCEA(32512));//第八个成员:hCursor 鼠标句柄,系统IDI_开头的常量
	WindowsClass.hbrBackground = CreateSolidBrush(RGB(255,255,255));//第九个成员:hbrBackground 背景图刷句柄
	WindowsClass.lpszMenuName = NULL;//第十个成员:ipseMenuName:菜单指针,没有就用null
	WindowsClass.lpszClassName = "windowclass";//第十一个成员:ipszClassName 窗口类名指针 自己定义
	WindowsClass.hIconSm = NULL;//第十二个成员: hIconSm :底部任务栏小图标句柄 定义为空就是hIcon图标 大小系统自动转换
   
	//(3)窗口类的注册:用到api RegisterClassExA

	if (RegisterClassExA(&WindowsClass))
		return 0;//创建失败返回0

	HWND WindowHandle = CreateWindowExA(WS_EX_LEFT, "windowclass", "练习创建窗口", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hInstance, NULL);
	if (WindowHandle)
	{
		return 0;//创建失败返回0
	}
	
	//(4)窗口显示模式的设定 主函数和处理函数的消息传递
	
	ShowWindow(WindowHandle, SW_SCROLLCHILDREN);
	UpdateWindow(WindowHandle);
	//通过MSG结构体传递消息到消息处理函数
	MSG Message;
	while (GetMessageA(&Message, NULL, 0, 0)) //由于窗口在存在的过程中,窗口需要不间断的接收消息,所以是一个循环
	{
		TranslateMessage(&Message);   //将虚拟消息转化为字符消息
		DispatchMessageA(&Message); //将消息传递给处理函数
	}
	return (int)Message.wParam;
}

LRESULT _stdcall WinProcess(HWND hwnd, UINT Message, WPARAM  WIparam, LPARAM IParam)
{

	
	switch (Message)
	{
	case WM_PAINT://绘图更新事件
	{
		//写处理事件代码
		break;
	}
	case WM_DESTROY://程序退出事件
	{ 
		//写处理事件代码
		break;
	}
	default: 
	{ 
		return DefWindowProcA(hwnd, Message, WIparam,IParam); //默认处理办法
		break;
	}
	
	}
	//源码文件Q:3492625357
}

​

​

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐