最初绘制的组合框下拉列表

时间:2011-09-11 16:18:18

标签: c winapi combobox

正如标题所述,我的问题是WinAPI组合框的扩展列表在打开时显示为空白。任何后续更新(如移动光标时)都会重绘受影响的项目。此外,列表不会响应任何鼠标输入。这种情况在Windows XP和7中都会发生。

尽管我在Spy ++中可以看出,模态列表接收WM_ERASEBKGND但是没有处理WM_PAINT。顺便说一下,在模式对话框中显示组合框可以很好地工作,但是将控件创建为常规顶级窗口的一部分或者生成与无模式子窗口相同的对话框模板不会。

我猜我忘记了一些基本和令人尴尬的事情,例如:没有设置剪辑样式或在消息循环中调用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 个答案:

答案 0 :(得分:1)

您正在将一个hwnd传递给GetMessage,这通常不是您想要的,只需使用NULL。