Назад | Начало урока | Вперед
Содержание

Глава 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) //{

{
AFX_MSG_MAP(CSeaBattleDlg) ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//
}
}AFX_MSG_MAP
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 - выходит одно или другое окно-сообщение.

Подсказка


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz