WIN32编程 一个简单的问题
#include <windows.h>/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
switch(Message) {
/* Upon destruction, tell the main thread to stop */
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
/* All other messages (a lot of them) are processed using default procedures */
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSEX wc; /* A properties struct of our window */
HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
MSG msg; /* A temporary location for all messages */
/* zero out the struct and set the stuff we want to modify */
memset(&wc,0,sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc; /* This is where we will send messages to */
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = "WindowClass";
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
if(!RegisterClassEx(&wc)) {
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, /* x */
CW_USEDEFAULT, /* y */
640, /* width */
480, /* height */
NULL,NULL,hInstance,NULL);
if(hwnd == NULL) {
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
/*
This is the heart of our program where all input is processed and
sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
this loop will not produce unreasonably high CPU usage
*/
while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
TranslateMessage(&msg); /* Translate key codes to chars if present */
DispatchMessage(&msg); /* Send it to WndProc */
}
return msg.wParam;
}
大佬求解
不明白一点 LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
参数hwnd这个窗口句柄 不是全局变量那是如何传进到这个回调函数呢? 没有老鸟吗.... 什么是win32编程啊? 窗口的class决定了这个窗口调用哪个函数来处理消息。窗口在调用消息处理函数的时候,把自己的窗口句柄hWnd以及消息类型、消息参数传给消息处理函数。就这么简单。
不是没老鸟,是老鸟觉得这个问题太过初级。 你CreateWindow的时候,系统会给你分配这个窗口的HANDLE。系统自己分配的值,自己也知道在哪里读取。有消息产生的时候,是系统先截获这个消息,哦,这个消息是发生在某个窗口上面的,那系统就会从内存中读取出这个窗口的HANDLE,和消息的类型以及鼠标指针的位置等附加信息,然后调用你窗口处理函数,然后流程就到了你这里了,你要处理某个消息就写代码,不想处理就交给
DefWindowProc处理。
实际上你调试一下窗口程序就知道了,是user32.dll中的一个函数会调用你的WndProc。
你Winmain中的hwnd和WndProc中的hwnd虽然名字一样,但是他们是不一样的变量,地址都不一样,只不过值是一样的,不存在全局变量不全局变量的问题。
回调函数是系统负责调用的,具体过程差不多是这样:
窗口产生消息(消息中包含这个窗口的句柄)后传给相应的线程,线程中有消息队列,GetMessage从消息队列中取出消息,然后通过DispatchMessage将消息句柄传回内核,在内核中,系统根据消息中的窗口句柄找到相应的窗口,然后调用窗口中的回调函数,这时HWND就用上了,然后该怎么处理就怎么处理。 黄河大鲤鱼 发表于 2020-3-14 17:41
什么是win32编程啊?
:eee就是 MFC的爸爸易语言的祖宗 shallies 发表于 2020-3-14 17:46
窗口的class决定了这个窗口调用哪个函数来处理消息。窗口在调用消息处理函数的时候,把自己的窗口句柄hWnd ...
牛皮奥铁子 又红又专 发表于 2020-3-14 20:10
就是 MFC的爸爸易语言的祖宗
mfc又是什么…… 黄河大鲤鱼 发表于 2020-3-14 22:58
mfc又是什么……
win32 就是C++界面编程但是不能拖拽 MFC 类似易语言封装好了 直接拖拽按钮什么的
页:
[1]
2