C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Урок 8. Рисуем по всему окну (класс CWindowDC) / Уроки C++ .NET / Visual C++ .NET

Visual C++.NET
Урок 8. Рисуем по всему окну (класс CWindowDC)

Область окна можно условно разделить на две части - это внутренность окна (так называемая клиентская часть) и рамка окна (куда входит собственно рамка, заголовок, строка состояния, строка меню и др.).

Как нарисовать некоторый примитив в клиентский части окна мы рассматривали в уроке 5. Сейчас мы посмотрим, как можно рисовать по всему окну.

Для рисования по всему окну применяется класс CWindowDC. Он является потомком класса CDC. В своем конструкторе этот класс вызывает API-функцию CWindowDC, которая возвращает контекст устройства для всего окна. В своем деструкторе же этот класс вызывает API-функцию ReleaseDC.

Давайте нарисуем кружок в заголовке окна About нашей программы. Этот кружок будет появлятся при нажатии на кнопку. Добавьте эту кнопку в диалоговое окно About. В обработчике для кнопки напишите следующие код:

void CAboutDlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    //Берем все окно.
    CWindowDC dc(this);
    //Рисуем кружок.
    dc.Ellipse(0, 0, 20, 20);
}

Теперь при нажатии на кнопке в диалоговом окне About в заголовке появится белый кружок:

Белый кружок в заголовке окна

В приведенном примере мы в конструктор класса CWindowDC передаем указатель на все окно this.

Для того, чтобы посмотреть, что в конструкторе дйествительно происходит вызов API-функции GetWindowDC, поставьте точку останова на строке

    ...
    CWindowDC dc(this);
    ...

и запустите программу по F5. Когда вы остановитесь на этой строке, то для захода в конструктор нажмите F11. Вы окажетесь в следующем коде из библиотеки MFC:

CWindowDC::CWindowDC(CWnd* pWnd)
{
    ASSERT(pWnd == NULL || ::IsWindow(pWnd->m_hWnd));

    if (!Attach(::GetWindowDC(m_hWnd = pWnd->GetSafeHwnd())))
        AfxThrowResourceException();
}

Видите? Тут мы как раз и вызываем API-функцию GetWindowDC. Кстати, чуть пониже в коде видно, что в деструкторе вызывается API-функция ReleaseDC:

CWindowDC::~CWindowDC()
{
    ASSERT(m_hDC != NULL);
    ::ReleaseDC(m_hWnd, Detach());
}