progs.biz  
Начало>WinAPI>API>Урок 28
C#
VB.NET
Visual C++.NET
ASP.NET
Visual C++ 6
WinAPI
C/C++
Delphi
C++ Builder
Java
SQL
PHP
DirectX
Visual Basic 6.0
Ассемблер
Интернет
Сист. прогр-ние
Pocket PC
Обзор книг
Обзор программ

Бьерн Страуструп. Язык программирования С++. Специальное издание
Бьерн Страуструп. Язык программирования С++. Специальное издание
Заказать на Озоне



Яндекс-цитирования

Windows API
Урок 28. Пример с пропаданием цвета

Сейчас мы посмотрим, почему надо обязательно удалять кисть (и другие объекты GDI - перья и др.). Делаем мы это, как вы помните из предыдущего урока, посредством вызова API-функции DeleteObject.

Закомментируйте эту строчку в вашем коде:

    ...
    //DeleteObject(br);
    ...

Теперь мы нашу кисть не уничтожаем.

Остается вызвать код по созданию кисти (т. е. функцию CreateSolidBrush) много-много раз. Можно, например, запустить программу и изменять размер окна - тогда будет вызываться обработчик для WM_PAINT. Но это очень долгий путь, так у нас кисти быстро не кончатся. Давайте поступим по-другому. А именно, будем вызывать WM_PAINT по таймеру, причем установим частоту работы таймера большой. Делаем это вот так:

LONG WINAPI WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
    ...
    switch (Message){
    ...
    case WM_TIMER:
        // Перерисовываем окно по таймеру.
        InvalidateRect(hWnd, NULL, TRUE);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        br = CreateSolidBrush(RGB(255, 0, 0));
        SelectObject(hdc, br);
        Ellipse(hdc, 10, 10, 40, 40);
        // Закомментировали удаление кисти.
        //DeleteObject(br);
        EndPaint(hWnd, &ps);
        break;

Разумеется, таймер мы должны создать (см. урок 6). При создании таймера укадите интервал как можно меньше (например, установите его равным 1 миллисекунде, т. е. уствновите в 1).

Компилируем и запускаем программу. Сначала все будет вроде точно также. Но это только первое время. Если подождать некоторое время (минуты две-три или около того), то наш кружок станет белого цвета!

Круг белого цвета

Это потому, что краска кончилась ;). Точнее сказать не краска, а кисти, которых может быть только ограниченное число. Так что не забывайте вызывать функцию DeleteObject.

Рассылки нашего сайта на Subscribe.Ru
Visual C++, MFC
C# и .NET
VB.NET
ASP.NET new!
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


 
 
Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2008 сайт progs.biz
© 2002-2008 Игорь Алексеев