Как обнаружить, если stati c текстовое действие вверх - PullRequest
0 голосов
/ 26 февраля 2020

Итак, у меня есть три компонента в моем диалоге. Две кнопки (PUSHBUTTON), а другая - текст c (LTEXT). Но все три элемента управления действуют как кнопки «как». Они кликабельны и делают все, что должны.

Так что код выглядит примерно так:

// MyDlg.cpp
BOOL MyDlg::DefaultWindowProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   switch( uMsg)
   {
       ...
       ...
       case WM_COMMAND:
            if( HIWORD(wParam) == 0 )
                dwSelectID = LOWORD(wParam);

            if ( dwSelectID == IDC_BUTTON1 )
                doSomething1();
            else if ( dwSelectID == IDC_BUTTON2 )
                doSomething2();
            else if ( dwSelectID == IDC_STATIC )
                doSomething3();
   }
}

Работает нормально. Но механизм в этих элементах управления работает по-другому. Две кнопки запускают соответствующие функции на LBUTTONUP, тогда как stati c запускает соответствующие функции на LBUTTONDOWN. Я предполагаю, что эти различные поведения происходят просто естественно. Что я могу сделать, чтобы текст stati c работал так же?

1 Ответ

1 голос
/ 26 февраля 2020

Хорошо, поэтому я последовал предложению Джонатана, который заключался в использовании подкласса.

Я подклассифицировал элемент управления stati c, чтобы элемент управления мог захватить сообщение LButtonUp. Когда подклассный элемент управления получает сообщение, он отправляет пользовательское сообщение своему родительскому дескриптору. Затем родительский дескриптор выполняет все необходимые действия.

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

// MyDlg.cpp
BOOL MyDlg::DefaultWindowProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   switch( uMsg)
   {
       ...
       ...
       case SOME_SPECIAL_MSG:
            doSomething3():
            return (INT_PTR)TRUE;
       case WM_COMMAND:
            if( HIWORD(wParam) == 0 )
                dwSelectID = LOWORD(wParam);

            if ( dwSelectID == IDC_BUTTON1 )
                doSomething1();
            else if ( dwSelectID == IDC_BUTTON2 )
                doSomething2();
       ...
       ...
   }
}
// Static.cpp
LRESULT CALLBACK UDStatic::StaticProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam, DWORD_PTR pwRefData)
{
   UDStatic* pThis = (UDStatic*)pwRefData;
   switch (nMsg)
   {
      ...
      case WM_LBUTTONUP:
          pThis->OnLButtonUp(hWnd, wParam, lParam, pwRefData);
          break;
   }
}
void UDStatic::OnLButtonUp(hWnd, wParam, lParam, pwRefData)
{
    HWND hWndParent = GetParent(hWnd);
    if (hWndParent)
        PostMessage( hWndParent, SOME_SPECIAL_MSG, 0, 0);
}

Другой способ решения проблема заключалась бы в создании настраиваемой текстовой кнопки, чтобы она наследовала свойство кнопки (BN_CLICKED); Получает работу.

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