2010-02-02 60 views
0

我正在實現一個自定義組合框來表現得像一個搜索框。 它由編輯控件,按鈕和列表框構成。SearchBox的自定義組合框

我想打開列表框上的鼠標點擊按鈕,它似乎很簡單,但變得複雜。 首先,我試圖管理鼠標點擊「BN_CLICKED」,但後來我發現它太晚了,我想打開已在「WM_LBUTTONDOWN」(和「WM_LBUTTONDBLCLK」)上的列表框,問題是,當我'試圖打開這個消息的列表框,列表框收到「WM_KILLFOCUS」並在打開一會兒後立即關閉,之後按鈕收到「WM_SETFOCUS」消息,我想打開列表框中的「 WM_SETFOCUS「,它接收按鈕,但我不能依靠這個消息,因爲它不會被髮送每個按鈕點擊(例如,當我不斷點擊按鈕)。

回答

1

從一個組合框開始並從中派生一個窗口類不是更容易嗎?

WNDPROC comboboxwndproc; 

LRESULT CALLBACK MyComboBoxWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch (uMsg) { 
    /* do your thing */ 
    } 

    return CallWindowProc(comboboxwndproc, hwnd, uMsg, wParam, lParam); 
} 

void register_custom_combobox() { 
    WINDOWCLASSEX mycbwc; 
    char mycbwcname[] = "MYCOMBOBOX"; 
    mycbwc.cbSize = sizeof(WNDCLASSEX); 
    GetClassInfoEx(NULL, "COMBOBOX", &mycbwc); 
    comboboxwndproc = cbwc.lpfnWndProc; 
    mycbwc.lpfnWndProc = MyComboBoxWndProc; 
    mycbwc.hInst = my_instance; 
    mycbwc.lpszClassName = mycbwcname; 
    RegisterClassEx(&mycbwc); 
} 

如果你想,你可以,而不是使用全局變量,在類額外區域保留空間。然後在自定義窗口過程中,檢查它是否已被設置,如果沒有,請再次請求組合框類信息並將指針指向組件框區域中的組合框窗口過程。

1

或者,您也可以覆蓋上創建的窗口過程而不是註冊一個新的窗口類:

WNDPROC g_ComboBoxProc; 

LRESULT CALLBACK SearchBoxProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    // Special handling here. 

    return CallWindowProc(g_ComboBoxProc, hwnd, uMsg, wParam, lParam); 
} 

HWND CreateSearchBox(LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, 
        int w, int h, HWND hWndParent, HMENU hMenu, 
        HINSTANCE hInstance, LPVOID lpParam) { 
    HWND hwnd = CreateWindow(TEXT("COMBOBOX"), lpWindowName, dwStyle, 
          x, y, w, h, hWndParent, hMenu, hInstance); 
    if (hwnd) { 
    g_ComboBoxProc = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, 
               (WNDPROC) SearchBoxProc); 
    } 

    return hwnd; 
} 

雖然SetWindowSubclass或許應該被替代。