2021-09-22

@win32创建窗口

需要包含头文件 #include<windows.h>

主函数int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)

创建窗口需要六步

1.设计窗口类

WNDCLASSW wc;
wc.cbClsExtra = 0;//类额外内存通常为0
wc.cbWndExtra = 0;//窗口额外内存通常为0
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景颜色
wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标如果第一个参数为NULL则使用系统提供的光标
wc.hIcon = LoadIcon(NULL, IDI_WARNING);
wc.hInstance = hInstance;
wc.lpfnWndProc = WindowProc;//消息处理程序
wc.lpszClassName = TEXT(“Window”);//窗口名称
wc.lpszMenuName = NULL;//菜单名
wc.style = 0;//默认风格

2.注册窗口类

Register Class(&wc)

3.创建窗口类(返回窗口句柄)

HWND = hwnd CreateWindowExW()

DWORD dwExStyle, // 窗口的扩展风格。
LPCTSTR lpClassName, // 窗口类名。
LPCTSTR lpWindowName, // 窗口标题栏的文字信息
DWORD dwStyle, // 窗口的基本风格。
int x, // 窗口左上角X轴坐标。
int y, // 窗口左上角Y轴坐标。
int nWidth, // 窗口的宽度。
int nHeight, // 窗口的高度。
HWND hWndParent, // 窗口的父窗口句柄。
HMENU hMenu, // 窗口的菜单句柄。
HINSTANCE hInstance, // 应用程序实例句柄。
LPVOID lpParam // 窗口创建的附加数据。

4.显示与更新窗口类

ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);

5.获取消息

MSG msg;//消息结构体

While(1)

if(GetMessage(msg,NULL,0,0)==0)//(消息结构体,窗口句柄,捕获所有消息)

break;

TranslateMessage(&msg)//翻译消息 Ctrl+c是复制

DispatchMessage(&msg)//分发消息

6.处理消息

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
/*
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息标识
WPARAM wParam, // 消息附加参数1
LPARAM lParam // 消息附加参数2
*/
switch (uMsg)
{
case WM_CLOSE://关闭窗口点X
DestroyWindow(hwnd);//函数名xxxWindow消息 不会放到消息队列中,而是直接执行
break;
case WM_DESTROY:
PostQuitMessage(0);//终止进程
break;
case WM_LBUTTONDOWN:
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
TCHAR buf[1024];
wsprintf(buf, TEXT(“x = %d,y=%d”), xPos, yPos);
MessageBox(hwnd, buf, TEXT(“鼠标按下”), MB_OK);
break;
}
case WM_KEYDOWN:
MessageBox(hwnd, TEXT(“键盘按下”), TEXT(“键盘的消息”), MB_OK);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 100, 100, TEXT(“HELLO”), strlen(“HELLO”));
EndPaint(hwnd, &ps);
break;
}
default:
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	/*
	HWND hwnd,      // 窗口句柄
	UINT uMsg,      // 消息标识
	WPARAM wParam,  // 消息附加参数1
	LPARAM lParam   // 消息附加参数2
    */
	switch (uMsg)
	{
	case WM_CLOSE:
		DestroyWindow(hwnd);//函数名xxxWindow消息 不会放到消息队列中,而是直接执行
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_LBUTTONDOWN:
	{
		int xPos = LOWORD(lParam);
		int yPos = HIWORD(lParam);
		TCHAR buf[1024];
		wsprintf(buf, TEXT("x = %d,y=%d"), xPos, yPos);
		MessageBox(hwnd, buf, TEXT("鼠标按下"), MB_OK);
		break;
	}
	case WM_KEYDOWN:
		MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘的消息"), MB_OK);
		break;
	case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(hwnd, &ps);
		TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));
		EndPaint(hwnd, &ps);
		break;
	}
	default:
		break;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	WNDCLASSW wc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.hCursor = LoadCursor(NULL, IDC_HAND);
	wc.hIcon = LoadIcon(NULL, IDI_WARNING);
	wc.hInstance = hInstance;
	wc.lpfnWndProc = WindowProc;
	wc.lpszClassName = TEXT("Window");
	wc.lpszMenuName = NULL;
	wc.style = 0;
	RegisterClass(&wc);
	//lpClassName, lpWindowName, dwStyle, x, y,\nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam
	HWND hwnd = CreateWindowExW(WS_EX_ACCEPTFILES, wc.lpszClassName, TEXT("TEXT WINDOW"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
	ShowWindow(hwnd, SW_SHOWNORMAL);
	UpdateWindow(hwnd);
	MSG msg;
	while (1)
	{
		if (GetMessage(&msg, NULL, 0,0) == FALSE)
		{
			break;
		}
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值