2010-02-02 56 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或许应该被替代。