画出了不寻常的效果,窗户的黑色部分 我在C++中创建Win32应用程序,尝试(不成功)保持一些面向对象的方式,同时仍然尊重WinAPI消息循环等。
我遇到的问题是,我的窗口看起来不一致和/或以一种我以前从未遇到过的奇怪方式绘制。例如: 调整窗口大小时会发生这种情况。如果我最小化窗口并再次打开它,除了按钮之外,所有东西都是黑色的。此外,当将鼠标从窗口外移到窗口中时,无论光标在进入窗口之前是什么,都会保留下来。例如,如果窗口后面有一个文本框,我将光标从文本框移到该窗口中,光标仍然是插入符号光标 我正在使用此代码处理我的画出了不寻常的效果,窗户的黑色部分 我在C++中创建Win32应用程序,尝试(不成功)保持一些面向对象的方式,同时仍然尊重WinAPI消息循环等。,c++,winapi,paint,C++,Winapi,Paint,我遇到的问题是,我的窗口看起来不一致和/或以一种我以前从未遇到过的奇怪方式绘制。例如: 调整窗口大小时会发生这种情况。如果我最小化窗口并再次打开它,除了按钮之外,所有东西都是黑色的。此外,当将鼠标从窗口外移到窗口中时,无论光标在进入窗口之前是什么,都会保留下来。例如,如果窗口后面有一个文本框,我将光标从文本框移到该窗口中,光标仍然是插入符号光标 我正在使用此代码处理我的WindowMain类中的消息: std::map<HWND, WindowMain*> WindowMain::
WindowMain
类中的消息:
std::map<HWND, WindowMain*> WindowMain::HWNDMap;
LRESULT CALLBACK WindowMain::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
if (HWNDMap.find(hWnd) == HWNDMap.end()) { return DefWindowProc(hWnd, msg, wParam, lParam); }
return HWNDMap[hWnd]->InstWndProc(hWnd, msg, wParam, lParam);
}
LRESULT CALLBACK WindowMain::InstWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CLOSE:
PostQuitMessage(0);
break;
case WM_DESTROY:
DeleteObject(_hFont);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
我的问题是,为什么会出现这种奇怪的绘画问题?我主要对光标上发生的奇怪的事情感兴趣
编辑:我正在使用while循环来翻译和发送消息。您没有设置WNDCLASS.hbrBackground,也没有处理WM_ERASEBKGND。所以你看到了显示器的背面。呵呵,我从中看出了喜剧的价值!我已经更改了hbrBackground,它修复了一个问题,非常感谢。你知道为什么光标会出现这个问题吗?这很难演示,但我想我在上面已经解释得很好了。window类还包括一个字段,指定默认情况下需要哪个光标IIRC,mem将其设置为零可能意味着“鼠标进入此窗口之前的任何内容”。不过,这只是一个有根据的猜测——我已经很久没有使用WIN32了。我尝试不使用
memset
ting WNDCLASS,这不起作用,我还尝试使用IDC\u ARROW
为hCursor
属性使用LoadCursor
,但也不起作用。你的想法听起来很对,所以我会进一步检查。暗中刺杀-通常是?。hCursor=LoadCursor(NULL,IDC\u ARR0W)代码>。第一个参数是实例句柄,但不是程序的实例-IDC\u ARROW
是共享资源,而不是程序中的资源-因此NULL
。也许不是你的问题,但这是我所能想到的。
WindowMain::WindowMain(HINSTANCE hInst) {
_isReady = false;
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.lpfnWndProc = WndProc;
wc.lpszClassName = ClassName.c_str();
wc.hInstance = hInst;
wc.hbrBackground = (HBRUSH)(0);
if (!RegisterClass(&wc)) { return; }
_hWnd = CreateWindow(ClassName.c_str(), "AlchemyAC", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInst, NULL);
if (!_hWnd) { return; }
_hBtnStart = CreateWindow("BUTTON", "Start", WS_TABSTOP | WS_VISIBLE | WS_CHILD, 10, 10, 100, 24, _hWnd, NULL, hInst, NULL);
_hBtnStop = CreateWindow("BUTTON", "Stop", WS_TABSTOP | WS_VISIBLE | WS_CHILD, 10, 39, 100, 24, _hWnd, NULL, hInst, NULL);
if (!_hBtnStart || !_hBtnStop) { return; }
GetObject(GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &_lf);
_hFont = CreateFont(_lf.lfHeight, _lf.lfWidth,
_lf.lfEscapement, _lf.lfOrientation, _lf.lfWeight,
_lf.lfItalic, _lf.lfUnderline, _lf.lfStrikeOut, _lf.lfCharSet,
_lf.lfOutPrecision, _lf.lfClipPrecision, _lf.lfQuality,
_lf.lfPitchAndFamily, _lf.lfFaceName);
SendMessage(_hBtnStart, WM_SETFONT, (WPARAM)_hFont, true);
SendMessage(_hBtnStop, WM_SETFONT, (WPARAM)_hFont, true);
EnableWindow(_hBtnStop, false);
HWNDMap[_hWnd] = this;
_isReady = true;
}