画出了不寻常的效果,窗户的黑色部分 我在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;
}