windows窗口底层实现(代码)
Posted 敲代码的Messi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows窗口底层实现(代码)相关的知识,希望对你有一定的参考价值。
#include <windows.h>
// 窗口过程
// CALLBACK 等同于WINAPI
LRESULT CALLBACK WindowProc(
HWND hwnd, // 消息所属的窗口句柄
UINT uMsg, //具体消息名称 WM_XXXX
WPARAM wParam, // 键盘消息
LPARAM lParpm) // 鼠标消息
switch (uMsg)
case WM_CLOSE:// 点击关闭按钮,会触发该消息
//DestroyWindow(hwnd);// 该消息处理程序不会关闭 窗口,而是发送另一个消息 WM_DESTROY
break;
case WM_DESTROY:
PostQuitMessage(0); // 该消息处理函数 会让 getMessage=false;
case WM_LBUTTONDOWN : //鼠标左键按下
int x = LOWORD(lParpm);
int y = HIWORD(lParpm);
char buf[1024];
wsprintf(buf, TEXT("%d , %d"), x, y);
MessageBox(hwnd, buf, TEXT("鼠标左键按下"), MB_OK); //最后一个参数为按钮
break;
default:
break;
return DefWindowProc(hwnd, uMsg, wParam, lParpm); // 使用默认处理函数
//程序入口函数
//WINAPI 代表 __stdcall 参数的传递顺序,从右到左依次入栈
int WINAPI WinMain(
_In_ HINSTANCE hInstance,// 应用程序实例句柄
_In_opt_ HINSTANCE hPrevInstance, //上一个应用程序句柄,在win32中一般为nULL,不起作用
_In_ LPSTR lpCmdLine, //传递给应用程序的命令行程序,相当于 char* argv[]
_In_ int nShowCmd) // 显示命令 最大化,最小化,正常
// 1. 设计窗口
WNDCLASS wc; //窗口类
wc.cbClsExtra = 0; //类的额外的内存
wc.cbWndExtra = 0; //窗口的额外内存
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景
wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标,若为第一个参数为NULL,则用系统提供的光标
wc.hIcon = LoadIcon(NULL, IDI_HAND); //程序左上角图标,参数用法和光标一样
wc.hInstance = hInstance;//应用程序的实例句柄,传入WinMain形参即可
wc.lpfnWndProc = WindowProc; //窗口过程回调函数
wc.lpszClassName = TEXT("txjClass"); //指定窗口类名称
wc.lpszMenuName = NULL; //菜单名称,不需要菜单,直接nULL
wc.style = 0; // 显示风格,0代表默认风格
//2. 注册窗口类
RegisterClass(&wc);
//3. 创建窗口
HWND hWnd = CreateWindow(
wc.lpszClassName, //窗口类名字
TEXT("测试"), //窗口标题
WS_OVERLAPPEDWINDOW, //窗口风格
CW_USEDEFAULT, CW_USEDEFAULT, //窗口x,y坐标,使用默认值
CW_USEDEFAULT, CW_USEDEFAULT, //窗口宽度,高度,使用默认值
NULL, //无父窗口
NULL, //无菜单
hInstance, //应用程序实例句柄,为WinMain第1个形参
NULL); //附件信息,通常设置为NULL
//4. 显示和更新
ShowWindow(hWnd, SW_SHOWNORMAL); // 创建窗口时的句柄,以默认方式显示
UpdateWindow(hWnd);
//5.循环取消息
/*
* typedef struct MSG
HWND hwnd; 主窗口的句柄
UINT message; 具体消息名称
WPARAM wParam; 附加消息 键盘消息
LPARAM lParam; 附加消息 鼠标消息(左右键)
DWORD time; 消息产生时间
POINT pt; //附加消息 鼠标消息 (点)
*/
MSG msg;
while (1)
/*
GetMessageW(
_Out_ LPMSG lpMsg, 消息结构体
_In_opt_ HWND hWnd, 捕获窗口,NULL代表捕获所有窗口
_In_ UINT wMsgFilterMin, 最小最大消息,都填0表示捕获所有消息
_In_ UINT wMsgFilterMax);*/
if(GetMessage(&msg,NULL,0,0)==FALSE)
break;
// 翻译消息
TranslateMessage(&msg);
//分发消息
DispatchMessage(&msg);
//5.处理消息(窗口过程)
return 0;
以上是关于windows窗口底层实现(代码)的主要内容,如果未能解决你的问题,请参考以下文章