Win32 API 2 дочерние кнопки главного окна не получают сообщение WM_MOUSEMOVE - PullRequest
0 голосов
/ 30 июля 2010

У меня есть окно с 2 дочерними кнопками, и я изначально пытался заставить их текст менять цвет при наведении курсора, но когда я вставил MessageBox () в сообщение WM_MOUSEMOVE, я обнаружил, что перестаю получать сообщение окна, когда мой курсор находится на одной из кнопок. MSDN говорит, что WM_MOUSEMOVE отправляется окну, в котором находится курсор, поэтому ... Я должен что-то делать не так.

HWND hparent;
HWND hplaybtt;
HWND hexitbtt;
HINSTANCE hinstance;

LRESULT CALLBACK MainProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

void MakeWindow () {
 WNDCLASSEX wc;
 wc.cbSize        = sizeof (WNDCLASSEX);
 wc.style         = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc   = MainProc;
 wc.cbClsExtra    = 0;
 wc.cbWndExtra    = 0;
 wc.hCursor       = LoadCursor( NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
 wc.lpszMenuName  = NULL;
 wc.lpszClassName = L"Window";
 wc.hInstance     = hinstance;
 wc.hIcon         = NULL;
 wc.hIconSm       = NULL;
 RegisterClassEx (&wc);

 hparent = CreateWindowEx (0, L"Window", L"Slot Machine", WS_OVERLAPPEDWINDOW, 0, 0, 300, 300,
  NULL, NULL, hinstance, NULL);
 hplaybtt = CreateWindowEx (0, L"Button", L"Play", WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 110, 125, 80, 50,
  hparent, (HMENU) 101, hinstance, NULL);
 hexitbtt = CreateWindowEx (0, L"Button", L"Exit", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 110, 175, 80, 50,
  hparent, (HMENU) 102, hinstance, NULL);

 ShowWindow (hparent, SW_SHOW);
}

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
 hinstance = hInstance;
 MSG Msg;

 MakeWindow (); 

 while (GetMessage (&Msg, NULL, 0, 0)) {
  TranslateMessage(&Msg);
        DispatchMessage(&Msg);
 }     

 return Msg.wParam;
}

LRESULT CALLBACK MainProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
 PAINTSTRUCT ps;
 COLORREF cr = RGB (255, 0, 0);
 COLORREF white = RGB (255, 255, 255);
 HDC hdc;
 LPDRAWITEMSTRUCT dis;

    switch(Msg) {
  case WM_DRAWITEM:
   dis = (LPDRAWITEMSTRUCT) lParam;
   FillRect (dis->hDC, &dis->rcItem, (HBRUSH) GetStockObject (BLACK_BRUSH));
   SetBkMode (dis->hDC, TRANSPARENT);
   SetTextColor (dis->hDC, white);
   TextOut (dis->hDC, 25, 15, L"Play", 4);
   MessageBox (hWnd, L"hi", NULL, MB_OK);
   break;
  case WM_PAINT:
   hdc = BeginPaint (hparent, &ps);
   SetTextColor (hdc, cr);
   TextOut (hdc, 105, 50, L"Slot Machine", 12);
   EndPaint (hparent, &ps);
   break;
  case WM_MOUSEMOVE:
   POINT p;
   p.x = LOWORD (lParam);
   p.y = HIWORD (lParam);

   MessageBox (hWnd, L"This is the slot machine game.", L"About", MB_OK);

   break;
  case WM_DESTROY:
   PostQuitMessage(WM_QUIT);
   break;
  default:
   return DefWindowProc(hWnd, Msg, wParam, lParam);
 }
 return 0;
}

Ответы [ 2 ]

0 голосов
/ 30 июля 2010

Всякий раз, когда у вас есть элементы управления на кнопках, похожих на окна, - если вы хотите правильно поддерживать фокусировку клавиатуры, вам нужно настроить цикл сообщений на что-то более похожее на это:

while (GetMessage (&Msg, NULL, 0, 0) >0)
{
  if(!IsDialogMessage(hwnd,&msg))
  {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
  }
}

Это пример того, как обращаться с сообщениями клавиатуры (и мыши), которые имеют значение для главного окна, а не с элементами управления, к которым они обычно отправляются. Обрабатывать их в цикле сообщений.

В этом случае замените IsDialogMessage () на вызов функции, которая будет обрабатывать эффекты наведения мыши (и вызовите IsDialogMessage (), чтобы TAB и ENTER переключались между элементами управления и активировали стандартную кнопку).

0 голосов
/ 30 июля 2010

Как сказал Люк, вам нужно "подклассить" wndproc кнопок.

http://msdn.microsoft.com/en-us/library/ms633570%28VS.85%29.aspx#subclassing_window

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