Пользовательский ComboBox для SearchBox - PullRequest
0 голосов
/ 02 февраля 2010

Я реализую собственный комбинированный список, чтобы вести себя как окно поиска. Он состоит из элемента управления «Редактировать», кнопки и списка.

Я пытаюсь открыть список по щелчку мышью на кнопке, это казалось простым, но усложнилось. Сначала я попытался управлять щелчком мыши на «BN_CLICKED», но потом обнаружил, что уже слишком поздно, и я хотел бы открыть список уже на «WM_LBUTTONDOWN» (и на «WM_LBUTTONDBLCLK»), проблема в том, что когда я ' Когда я пытаюсь открыть окно со списком в этом сообщении, окно со списком получает «WM_KILLFOCUS» и закрывается сразу после открытия на мгновение, а позже кнопка получает сообщение «WM_SETFOCUS», я подумывал открыть окно со списком в «WM_SETFOCUS» "который получает кнопку, но я не могу положиться на это сообщение, потому что оно не будет отправляться при каждом нажатии кнопки (например, когда я продолжаю нажимать кнопку).

Ответы [ 2 ]

1 голос
/ 02 февраля 2010

Кроме того, вы можете переопределить процедуру окна при создании вместо регистрации нового класса окна:

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 .

1 голос
/ 02 февраля 2010

Не проще ли начать с комбо-бокса и извлечь из него класс окна?

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 проверьте, установлено ли оно уже или нет, и, если нет, запросите информацию о классе combobox еще раз и поместите указатель на proc окна combobox в области Class Extra.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...