Раскрывающийся список со списком, который изначально не отображался - PullRequest
1 голос
/ 11 сентября 2011

Как видно из названия, моя проблема в том, что расширенный список поля со списком WinAPI отображается пустым при открытии.Любые последующие обновления (как при перемещении курсора) будут перерисовывать затронутые элементы.Кроме того, список не будет реагировать ни на один ввод мыши.Это происходит как в Windows XP, так и в 7.

Насколько я могу судить в Spy ++, модальный список получает WM_ERASEBKGND, но останавливается до обработки WM_PAINT.Кстати, показ поля со списком в модальном диалоговом окне работает хорошо, но создание элемента управления как части обычного окна верхнего уровня или создание того же шаблона диалога, что и у немодального дочернего окна, - нет.

IНаверное, я забыл кое-что довольно простое и неловкое, например, не устанавливая стиль отсечения или не вызывая DoDialogMagic в цикле сообщений или что-то подобное, но я просто не могу понять это самостоятельно.

Во всяком случае, вот минимальный случай воспроизведения:

#include <windows.h>
#include <commctrl.h>
#include <tchar.h>
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "comctl32.lib")

INT CALLBACK _tWinMain(HINSTANCE instance, HINSTANCE parent, LPTSTR commands, INT show) {
    static const TCHAR title[] = _T("Combo Problem");
    HWND hwnd;
    HWND combo;
    MSG msg;

    /* First create our parent window */
    const WNDCLASS cls = {
        /* style         */ 0,                                   
        /* lpfnWndProc   */ DefWindowProc,
        /* cbClsExtra    */ 0,
        /* cbWndExtra    */ 0,
        /* hInstance     */ instance,
        /* hIcon         */ NULL,
        /* hCursor       */ LoadCursor(NULL, IDC_ARROW),
        /* hbrBackground */ (HBRUSH) (COLOR_INACTIVEBORDER + 1),
        /* lpszMenuName  */ NULL,
        /* lpszClassName */ title
    };
    RegisterClass(&cls);
    hwnd = CreateWindow (
        /* lpClassName   */ title,
        /* lpWindowName  */ title,
        /* dwStyle       */ WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        /* x             */ CW_USEDEFAULT,
        /* y             */ CW_USEDEFAULT,
        /* nWidth        */ 125,
        /* nHeight       */ 70,
        /* hWndParent    */ NULL,
        /* hMenu         */ NULL,
        /* hInstance     */ instance,
        /* lpParam       */ NULL
    );

    /* Now create and populate the combo box itself */
    InitCommonControls();
    combo = CreateWindow (
        /* lpClassName   */ _T("COMBOBOX"),                     
        /* lpWindowName  */ _T(""),
        /* dwStyle       */ CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE,
        /* x             */ 10,
        /* y             */ 10,
        /* nWidth        */ 100,
        /* nHeight       */ 150,
        /* hWndParent    */ hwnd,
        /* hMenu         */ NULL,
        /* hInstance     */ instance,
        /* lpParam       */ NULL
    );
    SendMessage(combo, CB_ADDSTRING, 0, (LPARAM) _T("Alpha"));
    SendMessage(combo, CB_ADDSTRING, 0, (LPARAM) _T("Beta"));
    SendMessage(combo, CB_ADDSTRING, 0, (LPARAM) _T("Gamma"));

    /* Finally run the message pump */
    while(GetMessage(&msg, hwnd, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

1 Ответ

1 голос
/ 11 сентября 2011

Вы передаете hwnd в GetMessage, обычно это не то, что вам нужно, просто используйте NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...