SearchBox的自定义ComboBox

时间:2010-02-02 11:31:39

标签: c++ windows winapi

我正在实现一个自定义组合框,其行为类似于搜索框。 它由Edit控件,Button和Listbox构成。

我试图在鼠标点击按钮时打开列表框,它似乎很简单但变得复杂。 首先我尝试管理鼠标点击“BN_CLICKED”,但后来我发现它已经太晚了,我想在“WM_LBUTTONDOWN”(以及“WM_LBUTTONDBLCL”)上打开列表框,问题是,当我'在尝试打开此消息的列表框时,列表框收到“WM_KILLFOCUS”并在打开片刻后立即关闭,稍后按钮收到“WM_SETFOCUS”消息,我打算在“WM_SETFOCUS”中打开列表框“它接收按钮,但我不能依赖此消息,因为每次按钮点击都不会发送(例如,当我一直点击按钮时)。

2 个答案:

答案 0 :(得分: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);
}

如果您愿意,您可以在Class Extra区域中保留空间,而不是使用全局变量。然后在自定义窗口proc中,检查它是否已经设置,如果没有,请再次请求组合框类信息并将指针放在Class Extra区域中的组合框窗口proc。

答案 1 :(得分: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