Глава 4
Далее посмотрим класс главного окна:
class CSeaBattle02Dlg : public CDialog
{
Объявлено всего четыре переменных. Их назначение ясно из
Конструктор практически пустой, ему нечего делать:
CSeaBattle02Dlg::CSeaBattle02Dlg(CWnd* pParent /*=NULL*/)
Теперь посмотрим функцию главного окна:
hInst = AfxGetInstanceHandle();
//замостим голубыми плитками 50х50 все главное окно
//выведем в главное окно текст
//Красивые Кнопки
m_SingleWnd.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(220, 18, 220+142, 18+68), this, 0);
return TRUE; // return TRUE unless you set the focus to a control
С этой функцией все ясно из кода. Здесь происходит закрашивание клиентской области
Затем на помощь выходит специально созданный нами класс CButWnd. При помощи функции SetMode() в эти новые маленькие окна на территории главного загружаются картинки и новые окна получают статус дочерних по отношению к главному окну. И далее при помощи функции OnPaint() класса CButWnd эти окна выводятся вместе с главным окном. В них мы видим две картинки. И эти картинки реагируют, когда на них наезжает курсор.
Не оставим без внимания и функцию:
GetClientRect(&rect);
dc.BitBlt(dc.m_ps.rcPaint.left, dc.m_ps.rcPaint.top,
dc.SetBkMode(TRANSPARENT);
dc.SetBkMode(OPAQUE);
Эта функция без параметров, берет контекст для рисования главного окна
CPaintDC dc(this); // device context for painting, определяет
размер клиентской части окна (холст) GetClientRect(&rect), и рисует все то, что должно быть в окне при помощи BitBlt().
Еще функция выводит значение 100 в свои координаты используется вызов Format()
Такова техника создания дочерних окон и вывод в них картинок.
Далее надо рассмотреть вопрос о том, чтобы при нажатии на картинку, происходила
Код в программе Prog06.
Назад |
Начало урока |
Вверх |
Вперед
CDC m_FonDC;
CButWnd m_ShipWnd, m_SingleWnd;
CBitmap *pOld;
их объявления.
: CDialog(CSeaBattle02Dlg::IDD, pParent)
{
BOOL CSeaBattle02Dlg::OnInitDialog()
{
HINSTANCE hInst;
RECT rect;
CDC* dc;
int i, j;
CBitmap bmp;
CPicture m_Fon;
//займемся рисованием
GetClientRect(&rect);
dc = GetDC();
m_FonDC.CreateCompatibleDC(dc);
bmp.CreateCompatibleBitmap(dc, rect.right+150, rect.bottom);
ReleaseDC(dc);
pOld = m_FonDC.SelectObject(&bmp);
//загрузим фон - голубую плитку 50х50
m_Fon.Load(JPG_BACKGROUND);
m_Fon.Render(&m_FonDC, CRect(0, 0, 50, 50));
for(i=0; i<=rect.right/50+3; i++)
m_FonDC.SetBkMode(TRANSPARENT);
m_FonDC.TextOut(32, 306, "Текст");
m_FonDC.TextOut(262, 306, "Еще текст");
//заголовок окна
SetWindowText("Морской бой. Автор: Волков Алексей");
m_ShipWnd.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(0, 0, 103, 88), this, 0);
m_ShipWnd.SetMode(BT_SHIPS, this);
m_SingleWnd.SetMode(BT_SINGLE, this);
окна голубым цветом (в двойном цикле), выводится две надписи в указанных координатах,
и создаются два окна: кнопки-картинки.
void CSeaBattle02Dlg::OnPaint()
{
RECT rect;
CString str;
dc.m_ps.rcPaint.bottom-dc.m_ps.rcPaint.top,
&m_FonDC, dc.m_ps.rcPaint.left,
dc.m_ps.rcPaint.top, SRCCOPY);
str.Format("%d", 100);
dc.TextOut(77, 306, str);
класса CString.
А так же вывод картинки в само главное окно и вывод текста в главное окно.
соответствующая реакиця. Для этого надо задействовать функцию ReceiveMessage().
Содержание