【发布时间】:2023-02-24 06:37:57
【问题描述】:
我是 win32 编程的新手,我在 WM_CREATE 消息处理的代码块中使用 SetWindowLongPtr,但它总是返回零。该程序相当简单,有什么我遗漏的吗?
#include <stdio.h>
#include <windows.h>
#ifdef _WIN64
#define SET_WINDOW_LONG_PTR SetWindowLongPtr
#else
#define SET_WINDOW_LONG_PTR SetWindowLong
#endif
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int main(int argc, char *argv[]) {
HINSTANCE hInstance = GetModuleHandle(NULL);
WNDCLASS wc = {0};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = L"MyWindowClass";
wc.cbClsExtra = sizeof(LONG_PTR);
if (!RegisterClass(&wc)) {
// Handle error...
}
HWND hWnd = CreateWindow(L"MyWindowClass", L"My Window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!hWnd) {
// Handle error...
}
ShowWindow(hWnd, SW_SHOWNORMAL);
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam) {
switch (message) {
case WM_CREATE:
LONG_PTR MYDATA = (LONG_PTR)malloc(sizeof(int));
int result = SetWindowLongPtr(hWnd, GWLP_USERDATA, MYDATA);
// int result = SetWindowLongPtr (hWnd, DWLP_USER, MYDATA); //this won't work either
// result is zero
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
构建命令:
gcc main.c -o test.exe -mwindows -lcomctl32
到目前为止我尝试过的事情:
- 使用
DWLP_USER代替GWLP_USERDATA; - 使用特定于平台的
SET_WINDOW_LONG_PTR宏而不是SetWindowLongPtr;它仍然返回零。
更新:按照@wohlstad的建议,我先用
SetLastError(0)然后用GetLastError得到错误,GetLastError返回零,似乎使用SetWindowLongPtr没有错,虽然官方文档的某些部分似乎是有点混乱:如果函数失败,返回值为零
【问题讨论】:
标签: c user-interface winapi win32gui