@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);
}
}