BeginPaint(hWnd.Sps); //Этот оператор пошлет сообщение WM_ERASEBKGND //и очистит окно, после чего удалит дефектную область EndPaint(hWnd.&ps); //Оператор освобождает созданный в ps контекст InvalidateRect(hWnd.&Rl.TRUE); //Формируется регион обновления ValidateRect(hWnd.&R): //и посылается WM_PAINT. break;
case WM_PAINT: //Демонстрация отсечения лучей. {
Res - GetUpdateRgn(hWnd.hUpd.TRUE); //В регион hUpd копируется связанная
HRGN - CreateRectRgn(0.0.20.20); //с окном область обновления
//При щелчке правой кнопкой она совпадает с рабочей областью.
HDC hdc - BeginPaint(hWnd.Äps);
//Дефектная область занесена в контекст hdc.
//Если GetUpdateRgnO вызвать здесь - получим пустой регион.
HRGN hClp - CreateRectRgn(0.0.85.85); //Создали регион С1р и занесли
SelectClipRgn(hdc.hClp); // в hdc как регион отсечения. Если оператор
//SelectClipRgnO закомментировать, то следующий оператор прочитает
//регион отсечения из контекста, который совпадет с hUpd
Res - GetClipRgn(hdc.hClp);
if(Res-ERROR) {DeleteObject(hClp):hClp - NULL;}
//Если в Res не NULLREGION, а код ошибки ERROR, то регион отсутствует
//и не влияет на отсечение.
//OffsetRgn(hClр.30.30); Если убрать этот комментарий, то будет видно, //что перенос региона hClp после считывания его формы в контекст не //влияет на выполнение отсечения.
HPEN hpen - CreatePen(PS__S0LID.2.0); //Лучи рисуются, но HPEN oldPen - (HPEN)SelectObject(hdc.hpen); //видны только участки, //попадающие в пересечение регионов hUpd и hClp for ( int i - 0; i<8;i++) {
MoveToEx(hdc.0.0.NULL); LineTo(hdc.32*1.250);
Работа с окнами произвольной формы
MoveToEx(hdc.0.0.NULL); LineTo(hdc.250.32*1 ); }
SelectObject(hdc.oldPen); EndPaint(hWnd.&ps);
//Штрихуем регионы. Чтобы изображения регионов не отсекались, hdc - GetDC(hWnd); //запрашиваем контекст без дефектной области. HBRUSH hbrUpd - CreateHatchBrush(HS_BDIAGONAL.RGB(0.0.255)); HBRUSH hbrClp - CreateHatchBrush(HS_FDIAGONAL.RGB(255.0.0)); SetBkModeC hdc.TRANSPARENT);
FillRgn( hdc. hUpd. hbrUpd); //Регион обновления - синяя штриховка.