绘画给出了不寻常的结果,窗口的黑色部分

时间:2015-10-26 21:20:42

标签: c++ winapi paint

我正在用C ++创建一个win32应用程序并尝试(不成功)保持一些面向对象,同时仍然尊重winapi消息循环等。

我遇到的问题是我的窗户似乎画得不一致和/或以前所未曾遇到过的奇怪方式。例如:

Window Image

调整窗口大小时会发生这种情况。如果我最小化窗口并再次打开它,除了按钮外,一切都是黑色的。此外,当我将鼠标从窗口外部移动到窗口时,保留在进入窗口之前我的光标。例如,如果窗口后面有一个文本框,并且我将光标从文本框移动到此窗口,则光标仍然是插入光标。

我使用此代码处理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;
}

WindowMain::WndProc函数是WindowMain的静态成员。我使用std::mapHWND映射到WindowMain*,以便我可以将消息从静态方法传递到相关的WindowMain::InstWndProc。我觉得问题可能在这里,但我无法发现它。

如果它是相关的,这是我用来创建窗口的代码:

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;
}

我的问题是,为什么会出现这种奇怪的绘画问题?我主要对光标发生的奇怪事情感兴趣。

编辑:我使用while循环来翻译和发送消息。

0 个答案:

没有答案