2011-09-11 6 views
1

私の問題はWinAPIコンボボックスの展開リストを開いたときに空白で表示されるということです。その後の更新(カーソルを移動するときなど)は、影響を受けたアイテムを再描画します。さらに、リストはマウス入力に応答しません。これは、Windows XPと7の両方で発生します。コンボボックスのドロップダウンリストは最初に描画されていません

私がSpy ++で知る限りでは、モーダルリストはWM_ERASEBKGNDを受け取りますが、WM_PAINTの処理は停止します。モーダルダイアログボックスでコンボボックスを表示すると、うまく動作しますが、通常のトップレベルウィンドウの一部としてコントロールを作成したり、モードレスの子ウィンドウと同じダイアログテンプレートを作成したりすることはありません。

私はかなり基本的で恥ずかしいものを忘れてしまったと思います。クリッピングスタイルを設定したりDoDialogMagicをメッセージループなどで呼び出すことはできませんが、私自身はそれを理解できないようです。とにかく

、ここでは最小限のREPROケースです:

#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

あなたが値getMessageにHWNDを渡している、これは単にNULLを使用し、あなたが望むものは通常ではありません。

+0

Dammit ..今は*恥ずかしくて簡単でした。私はそれを見ていないと信じることはできませんし、疑いもなく、それは同様に同様の他のいたずらな問題のすべての種類を解決します。ありがとう! – doynax

関連する問題