我在使用 CreateWindowEx 时遇到问题。如果我将最终参数(LPVOID lpParam)设置为NULL并在调用 ShowWindow 时使用返回的窗口句柄,则窗口会显示一切正常。但是,我需要根据我拦截的一些操作系统消息传入一个指向我将要修改的类的指针。当我尝试这样做时,通过将 lpParam 指定为 this ,我返回的句柄显然是垃圾,因为将其传递到 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;
}
WindowProc调用在70 msg(WM_WINDOWPOSCHANGING)上变坏。它在以前的消息上不会坏:WM_NCCALCSIZE,WM_CREATE,WM_PARENTNOTIFY,WM_SIZE,WM_SIZE或WM_SHOWWINDOW,虽然WM_SHOWWINDOW在WM_WINDOWPOSCHANGING之前处理,所以我猜WM_WINDOWPOSCHANGING只是WM_SHOWWINDOW传递的结果。
答案 0 :(得分:2)
在CreateWindowEx
上放置一个断点。记下你传入的指针。
在WindowProc函数上放置一个断点。检查它从你的私有窗口数据中提取的指针(那是你存储指针的位置,对吧?)与传入的指针相同。你使用的是SetProp
和GetProp
(参见主题{{ 3}}在MSDN上)而不是SetWindowLongPtr
,对吧?
在进入WindowProc时,打印出消息编号,以便在崩溃时查看正在处理的消息(如果调试器支持,可以使用跟踪点,或者添加printf
调用你的代码并重新编译。
答案 1 :(得分:1)
也许你已经有了答案,但我认为罪魁祸首在于:
SetClassLong(loading_image,GCL_STYLE,CS_HREDRAW | CS_VREDRAW);
为什么需要这样做?
答案 2 :(得分:0)
您是否意识到CreateWindowEx
在返回之前发送了消息?这意味着您的WindowProc
必须处理它们。您没有显示该代码,但过早调用CreateWindowEx是一个常见的错误。