【发布时间】:2011-02-27 02:44:59
【问题描述】:
我在使用 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 被通过的结果。
【问题讨论】:
-
听起来您的
WM_CREATE消息处理程序有问题。你应该发布它。 -
或者
WM_PAINT处理程序有问题。或WM_ERASEBACKGROUND。或WM_POSCHANGING。或者当您的窗口出现时发送的任何内容。 -
WM_CREATE和WM_PAINT之间很可能有一些互动——您应该发布两者的相关来源。