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.
|