Учебное пособие: Основы графического вывода
RECT rcPaint; // неверный прямоугольник, может быть пустым!
// остальные поля используются Windows:
BOOLfRestore;
BOOL fIncUpdate;
BYTE rgbReserved[ 16 ];
} PAINTSTRUCT;
Полученный контекст устройства будет соответствовать только неверной области. Система координат остается связана с внутренней областью окна, а неверная область только ограничивает ту зону, в которой осуществляется реальное рисование; рисование вне этой области просто не приводит ни к какому эффекту.
Начиная с Windows 3.x для задания областей, нуждающихся в перерисовке используются не неверные прямоугольники, а неверные области (region), которые могут быть сложной формы. В этом случае прямоугольник rcPaint может быть указан пустым, в то время как неверная область реально существует.
Кроме этого, функция BeginPaint выполняет еще несколько операций:
если fErase равен TRUE, тогда функция BeginPaint вызывает обработку сообщения WM_ERASEBKGND с параметрами wParam= hDC, lParam= 0
неверный прямоугольник маркируется верным. Для этого BeginPaint вызывает функцию ValidateRect.
Если вам надо обязательно рисовать на всем устройстве (окне), а не только в зоне неверного прямоугольника, то перед вызовом функции BeginPaint, вы можете маркировать нужный прямоугольник или область как нуждающуюся в перерисовке.
2) Иногда необходимо получить хендл контекста для всей внутренней области окна. Для этого вы можете воспользоваться следующим способом:
HDC hDC;
hDC = GetDC (hWnd);
...
ReleaseDC (hWnd, hDC);
Этот способ часто применяется для рисования во внутренней области окна при обработке иных сообщений, чем WM_PAINT. Если вы собираетесь использовать его при обработке сообщения WM_PAINT, то помните про:
восстановление фона окна (так как обычно это делает BeginPaint)
удалите неверные прямоугольники после рисования (так, например, вы можете вызвать ValidateRect (hWnd, NULL); для маркирования всего окна верным).
3) Еще реже приходится рисовать во внешней (неклиентной, non–client) части окна, тогда вы можете воспользоваться таким способом:
HDC hDC;
hDC = GetWindowDC (hWnd);
...
ReleaseDC (hWnd, hDC);
Применяя такой контекст устройства вы можете рисовать, например, на иконке, когда ваше приложение минимизировано.
Интересная особенность этой функции — если в качестве хендла окна ей передать NULL, то функция возвратит хендл контекста, соответствующего всему дисплею.
4) В некоторых случаях надо получить доступ ко всему устройству, например принтеру. Для этого вы должны использовать пару функций CreateDC...DeleteDC следующим образом:
HDChDC;