Сделайте выпадающий тип Combobox вести себя как элемент управления Edit - PullRequest
0 голосов
/ 25 февраля 2020

Я собираюсь заменить стандартный элемент редактирования на выпадающий список. Таким образом, в основном этот комбобокс выглядит как элемент управления для редактирования.

Пока все работает нормально, но есть одно заметное отличие:

  • Когда вы нажимаете на элемент управления для редактирования, содержащий уже некоторые текст, который не имеет фокуса, курсор просто помещается туда, где вы щелкаете.
  • Но когда вы нажимаете на поле со списком, содержащее уже некоторый текст и не имеющий фокуса, весь текст

Это показывает ситуацию, которая происходит, когда вы нажимаете либо на поле со списком, либо на элемент управления редактирования, где красная стрелка указывает, когда ни один из них не имеет фокуса:

enter image description here

Есть ли способ заставить поле со списком вести себя как элемент управления редактирования?

1 Ответ

2 голосов
/ 19 марта 2020

Одним из решений, позволяющих предотвратить выделение всего текста, является использование подкласса поля со списком и установка фокуса на его элемент управления для редактирования, когда левая кнопка мыши нажимает на него в первый раз. Код, как показано ниже:

Процедура подкласса:

LRESULT CALLBACK EditSubClassProc(HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam,
    UINT_PTR uIdSubclass,
    DWORD_PTR dwRefData
    )
{
    switch (uMsg)
    {
    case WM_DESTROY:
    {
        RemoveWindowSubclass(hWnd, EditSubClassProc, 0);
        return DefSubclassProc(hWnd, uMsg, wParam, lParam);
    }
    case WM_LBUTTONDOWN:
    {
        if (GetFocus() != hWnd)
        {
            SetFocus(hWnd);
        }
        return DefSubclassProc(hWnd, uMsg, wParam, lParam);
    }
    default:
        return DefSubclassProc(hWnd, uMsg, wParam, lParam);
    }
}

Найти окно управления редактированием поля со списком и установить обратный вызов подкласса:

   //  Get the edit window handle to combo box. 
   HWND comboEditHdl = NULL;
   COMBOBOXINFO info = { 0 };
   info.cbSize = sizeof(COMBOBOXINFO);

   if (!GetComboBoxInfo(hwndCombo1, &info))
       return 0;

   comboEditHdl = info.hwndItem;

   if (comboEditHdl)
   {
       SetWindowSubclass(comboEditHdl, EditSubClassProc, 0, NULL);
   }
...