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

Глава 1

Этой функции передаются координаты курсора и она, если курсор располагается на нашем поле,
рисует корабль начиная от переданной точки в нужном направлении. Направление
определяется переменной m_Direction, которой передается одно из направлений, например
m_Direction == LEFT.

Если расположение курсора не позволяет разместить корабль, то функция ничего не делает.
Размещение корабля делается при помощи функции InvalidateRect(). Пример:

InvalidateRect(CRect(m_Position.x - (m_Decks-1)*20, m_Position.y,

m_Position.x+21, m_Position.y + 21));


void CField::OnMouseMove(UINT nFlags, CPoint point) {
if(m_Mode == OWN_FIELD && m_Operation == PLACEMENT) {
if(m_Position.x == -1 && (point.x/20)*20+80 <= 200) {
m_Position.x = (point.x/20)*20;
m_Position.y = (point.y/20)*20;
m_Draw = true;
InvalidateRect(CRect(m_Position.x, m_Position.y,
m_Position.x+80, m_Position.y+20));
}
if(m_Position.x != (point.x/20)*20 || m_Position.y != (point.y/20)*20) {
if(m_Direction == RIGHT && (point.x/20)*20 + m_Decks*20 <= 200) {
m_Draw = false;
InvalidateRect(CRect(m_Position.x, m_Position.y,
m_Position.x + m_Decks*20, m_Position.y + 20));
UpdateWindow();
m_Position.x = (point.x/20)*20;
m_Position.y = (point.y/20)*20;
m_Draw = true;
InvalidateRect(CRect(m_Position.x, m_Position.y,
m_Position.x + m_Decks*20, m_Position.y + 20));
}
if(m_Direction == TOP && (point.y/20)*20 - (m_Decks-1)*20 >= 0) {
m_Draw = false;
InvalidateRect(CRect(m_Position.x, m_Position.y - (m_Decks-1)*20,
m_Position.x + 21, m_Position.y+21));
m_Position.x = (point.x/20)*20;
m_Position.y = (point.y/20)*20;
UpdateWindow();
m_Draw = true;
InvalidateRect(CRect(m_Position.x+1, m_Position.y - (m_Decks-1)*20,
m_Position.x + 20, m_Position.y+20));
}
if(m_Direction == BOTTOM && (point.y/20)*20 + m_Decks*20 <= 200) {
m_Draw = false;
InvalidateRect(CRect(m_Position.x, m_Position.y,
m_Position.x + 21, m_Position.y + m_Decks*20 + 1));
m_Position.x = (point.x/20)*20;
m_Position.y = (point.y/20)*20;
UpdateWindow();
m_Draw = true;
InvalidateRect(CRect(m_Position.x, m_Position.y,
m_Position.x + 21, m_Position.y + m_Decks*20 + 1));
}
if(m_Direction == LEFT && (point.x/20)*20 - (m_Decks-1)*20 >= 0) {
m_Draw = false;
InvalidateRect(CRect(m_Position.x - (m_Decks-1)*20, m_Position.y,
m_Position.x+21, m_Position.y + 21));
m_Position.x = (point.x/20)*20;
m_Position.y = (point.y/20)*20;
UpdateWindow();
m_Draw = true;
InvalidateRect(CRect(m_Position.x - (m_Decks-1)*20, m_Position.y,
m_Position.x+21, m_Position.y + 21));
}
}
}
CStatic::OnMouseMove(nFlags, point);
}


Анализ:

Обращает на себя внимание, что в этом коде нет сообщений типа:
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_WIN_YOU, 0);

-------------------------------------
void CField::OnMouseMove(UINT nFlags, CPoint point) {

Если курсор движется на нашем поле и значение m_Operation == PLACEMENT, а это означает, надо размещать на поле корабли.

if(m_Mode == OWN_FIELD && m_Operation == PLACEMENT) {

Если координата x переменной m_Position равна -1 и координата x переданной точки, если к ней прибавить 80 пикселов не выйдет за пределы поля

if(m_Position.x == -1 && (point.x/20)*20+80 <= 200) {

То присвоим координаты переданной точки переменной m_Position

m_Position.x = (point.x/20)*20;
m_Position.y = (point.y/20)*20;

Можно рисовать
m_Draw = true;

Рисуем (размещаем корабль в координатах переданной точки)

InvalidateRect(CRect(m_Position.x, m_Position.y, m_Position.x+80, m_Position.y+20));

}

Если координата x переменной m_Position не равна координате x переданной точки или
координата y переменной m_Position не равна координате y переданной точки,

if(m_Position.x != (point.x/20)*20 || m_Position.y != (point.y/20)*20) {

Если направление корабля - вправо и достаточно места для его расположение
if(m_Direction == RIGHT && (point.x/20)*20 + m_Decks*20 <= 200) {

То расположим корабль от переданной точки вправо.
m_Draw = false;
InvalidateRect(CRect(m_Position.x, m_Position.y,
m_Position.x + m_Decks*20, m_Position.y + 20));
UpdateWindow();
m_Position.x = (point.x/20)*20;
m_Position.y = (point.y/20)*20;
m_Draw = true;
InvalidateRect(CRect(m_Position.x, m_Position.y,
m_Position.x + m_Decks*20, m_Position.y + 20));

}
Если направление корабля - вверх и достаточно места для его расположение
if(m_Direction == TOP && (point.y/20)*20 - (m_Decks-1)*20 >= 0) {
То расположим корабль от переданной точки вверх.
m_Draw = false;
InvalidateRect(CRect(m_Position.x, m_Position.y - (m_Decks-1)*20,
m_Position.x + 21, m_Position.y+21));
m_Position.x = (point.x/20)*20;
m_Position.y = (point.y/20)*20;
UpdateWindow();
m_Draw = true;
InvalidateRect(CRect(m_Position.x+1, m_Position.y - (m_Decks-1)*20,
m_Position.x + 20, m_Position.y+20));
}
Если направление корабля - вниз и достаточно места для его расположение
if(m_Direction == BOTTOM && (point.y/20)*20 + m_Decks*20 <= 200) {
То расположим корабль от переданной точки вниз.
m_Draw = false;
InvalidateRect(CRect(m_Position.x, m_Position.y,
m_Position.x + 21, m_Position.y + m_Decks*20 + 1));
m_Position.x = (point.x/20)*20;
m_Position.y = (point.y/20)*20;
UpdateWindow();
m_Draw = true;
InvalidateRect(CRect(m_Position.x, m_Position.y,
m_Position.x + 21, m_Position.y + m_Decks*20 + 1));
}

Если направление корабля - влево и достаточно места для его расположение
if(m_Direction == LEFT && (point.x/20)*20 - (m_Decks-1)*20 >= 0) {

То расположим корабль от переданной точки влево.
m_Draw = false;
InvalidateRect(CRect(m_Position.x - (m_Decks-1)*20, m_Position.y,
m_Position.x+21, m_Position.y + 21));
m_Position.x = (point.x/20)*20;
m_Position.y = (point.y/20)*20;
UpdateWindow();
m_Draw = true;
InvalidateRect(CRect(m_Position.x - (m_Decks-1)*20, m_Position.y,
m_Position.x+21, m_Position.y + 21));
}
}
}
CStatic::OnMouseMove(nFlags, point);
}

Это функции передается координаты курсора и она, если курсор располагается на нашем поле,
рисует корабль начиная от переданной точки в нужном направлении. Направление
определяется переменной m_Direction, которой передается одно из направлений, например
m_Direction == LEFT.


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

Hosted by uCoz