Глава 4
Для того, чтобы программа реагировала на клик мышью на территории окна-картинки
m_SingleWnd а так же и m_ShipWnd, объявим и определим в главном окне функцию ReceiveMessage().
Сделаем объявление функции в заголовке:
afx_msg HRESULT ReceiveMessage(WPARAM wParam, LPARAM lParam);
Кроме того, поместим в карту сообщений вызов нашей функции, то есть инструкцию:
ON_MESSAGE(WM_STATIC_TO_DLG, ReceiveMessage)
BEGIN_MESSAGE_MAP(CSeaBattle02Dlg, CDialog)
//{
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//
ON_MESSAGE(WM_STATIC_TO_DLG, ReceiveMessage)
END_MESSAGE_MAP()
Сделаем определение функции в cpp файле:
HRESULT CSeaBattle02Dlg::ReceiveMessage(WPARAM wParam, LPARAM lParam)
{
DATA *data;
data = (DATA*)lParam;
switch(wParam)
{
case WM_LBT_DOWN:
SetBtDown((int)lParam);
break;
}
return NULL;
}
Требуется объявить константу в файле stdafx.h.:
#define WM_LBT_DOWN 13345
Функция ReceiveMessage() вызывает еще одну функцию:
void SetBtDown(int but);
void CSeaBattle02Dlg::SetBtDown(int but)
{
int code;
switch(but)
{
case B_PLACEMENT:
m_OwnField.ReceiveMessage(WM_PLACEMENT, 0);
InvalidateRect(CRect(105, 300, 130, 345));
m_Process = PLACE;
break;
case B_SINGLE:
if(m_OwnField.ReceiveMessage(WM_IS_OK, 0))
{
m_Process = SINGLE_PLAY;
code = ::AfxMessageBox("Вы первым начнете???", MB_YESNO);
m_SingleWnd.IsFocus = false;
m_SingleWnd.Invalidate();
}
else
{
::AfxMessageBox("Расставьте сначала свои корабли");
m_SingleWnd.IsFocus = false;
m_SingleWnd.Invalidate();
}
break;
}//end switch
}
Константы, WM_LBT_DOWN и B_SINGLE которые используются в этих функциях, объявлены
в файле stdafx.h. Например к константе B_SINGLE программа обращается как из класса
главного окна, так и из класса CButWnd.
Теперь программа реагирует на клик мышью на территории окна-картинки m_SingleWnd - выходит одно или другое окно-сообщение.
Назад |
Начало урока |
Вверх |
Вперед
Содержание