我在使用CreateWindowEx时遇到问题。如果我将最终参数(LPVOID lpParam)设置为NULL,并在对ShowWindow的调用中使用返回的窗口句柄,则窗口将显示一切正常。但是,我需要根据我拦截的某些操作系统消息传递一个指向将要修改的类的指针。当我尝试通过这样指定lpParam来执行此操作时,返回的句柄显然是垃圾,因为将其传递给ShowWindow会导致:“在用户回调期间遇到未处理的异常。”
我不知道如何调试它,所以我陷入了困境。
指向的地址在传递和拉回之间保持不变。
我没有定义WM_PAINT的情况。
WM_CREATE处理程序:
case WM_CREATE:
{
// get screen resolution
HWND desktop = GetDesktopWindow();
RECT R;
GetWindowRect(desktop, &R);
int width = R.right - R.left;
int height = R.bottom - R.top;
HWND loading_image;
loading_image = CreateWindowEx(0,L"Static",L"Image", SS_CENTERIMAGE | SS_BITMAP | WS_CHILD | WS_VISIBLE,0,0,width,height,hwnd,(HMENU)ID_IMAGE3,g_hInst,NULL);
SetClassLong(loading_image,GCL_STYLE,CS_HREDRAW | CS_VREDRAW);
HBITMAP bitmap = (HBITMAP)LoadImage(NULL,L"loadingscreen.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
SendMessage(loading_image,STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)bitmap);
progressbar = CreateWindowEx(0, PROGRESS_CLASS, (LPTSTR)NULL, WS_CHILD | PBS_SMOOTH | WS_VISIBLE, width/2-400,100,800,20,hwnd,(HMENU)0,g_hInst,NULL);
SendMessage(progressbar,PBM_SETSTEP,20,NULL);
CREATESTRUCT* cs = (CREATESTRUCT*)lParam;
app = (D3DApp*)cs->lpCreateParams;
return 0;
}
在70毫秒(WM_WINDOWPOSCHANGING)上,WindowProc调用变坏了。对于之前的消息,它并不会很糟糕:WM_NCCALCSIZE,WM_CREATE,WM_PARENTNOTIFY,WM_SIZE,WM_SIZE或WM_SHOWWINDOW,尽管WM_SHOWWINDOW只是在WM_WINDOWPOSCHANGING之前处理的,所以我猜测WM_WINDOWPOSCHANG正在传递。
最佳答案
在CreateWindowEx
上放置一个断点。记下您要传递的指针。
在WindowProc函数上放置一个断点。检查它从私有窗口数据中提取的指针(存储指针的地方,对吗?)与传入的指针相同。您正在使用SetProp
和GetProp
(请参见MSDN上的主题Window Properties)而不是SetWindowLongPtr
,对吗?
在进入WindowProc时,请打印出消息号,以便在崩溃时可以查看正在处理的消息(如果调试器支持,则可以为此使用跟踪点,或者在代码中添加printf
调用并重新编译。
关于c++ - 即使CreateWindowEx似乎成功,WinAPI ShowWindow也会失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5131107/