如何手动做Windows窗口

#include 
#include 

HINSTANCE hinst;

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{	
	hinst = hinstance;//把系统传来的实例句柄用全局实例句柄变量保存起来,方便以后使用
	//定义窗口类
	WNDCLASSEX wcx;//末尾加EX代表扩展功能,比不加EX更强大

	//给窗口对象赋值(手动初始化)
	wcx.cbSize = sizeof(wcx);
	wcx.style = CS_HREDRAW | CS_VREDRAW;
	wcx.lpfnWndProc = MainWndProc;//窗口过程,由这个窗口过程处理消息,把这个与窗口过程联系起来了
	wcx.cbClsExtra = 0;//不使用类内存
	wcx.cbWndExtra = 0;//不使用窗口内存
	wcx.hInstance = hinstance;
	wcx.lpszMenuName = NULL;
	wcx.lpszClassName = L"MainWClass";
	wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wcx.hCursor = LoadCursor(NULL, IDC_ARROW);//箭头形状 的鼠标指针
	wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//用白色的画刷把窗口背景变白色
	wcx.hIconSm = (HICON)LoadImage(hinstance,
		MAKEINTRESOURCE(5)/*在5号资源里有一个图片*/, IMAGE_ICON,
		GetSystemMetrics(SM_CXSMICON),//CX宽度
		GetSystemMetrics(SM_CYSMICON),//CY高度
		LR_DEFAULTCOLOR);
	
	//先要注册这个窗口类,如果失败就会提前结束
	if (!RegisterClassEx(&wcx))
	{
		return 1;
	}
	
	//注册成功后,使用窗口类创建窗口
	//先要定义一个窗口句柄
	HWND hwnd;//窗口句柄
	hwnd = CreateWindow(L"MainWClass",
		L"HELLO",
		WS_OVERLAPPEDWINDOW,//微软最经典的样式
		CW_USEDEFAULT,//左上角点的x值
		CW_USEDEFAULT,//左上角点的y值
		CW_USEDEFAULT,//窗口的长
		CW_USEDEFAULT,//窗口的高
		(HWND)NULL,
		(HMENU)NULL,
		hinstance,
		(LPVOID)NULL);

	if (!hwnd)//创建失败
	{
		return 1;
	}

	//显示窗口    如何显示是 Windows 告诉我们的   就是Winmain里面最后一个参数
	ShowWindow(hwnd, CmdShow);
	UpdateWindow(hwnd);//立即显示

	
	
	//写消息循环   即去消息队列里取消息  
	//先要定义消息变量   和判断有没有取到消息
	MSG msg;//消息变量
	BOOL fGotMessage;//有没有取到消息

	while (fGotMessage = GetMessage(&msg, (HWND)NULL, 0, 0) != 0)//用一个 循环不停取消息
	{
		TranslateMessage(&msg);//转化消息
		DispatchMessage(&msg);//转发消息  转发给窗口

	}

	return msg.wParam;

}

//          窗口过程函数   消息处理
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	//每当要处理一个消息 就写一个 case
	case WM_DESTROY:
		PostQuitMessage(0);//发送一个退出消息给Windows
		return 0;
	default://我们不想去处理这个消息,就转给Windows去处理
		return DefWindowProc(hwnd, uMsg, wParam, lParam);
	}
}

点击运行

如何手动做Windows窗口_第1张图片


这个是简化版   直接省略了菜单和其他的一些部分    自己写的目的是对这些代码有个深刻的了解


你可能感兴趣的:(Windows,API,学习)