Если обратиться конкретно к контексту устройства Windows, ответ на основной вопрос, который вы задаете, кажется «да и нет».
Контекст устройства в основном создает режим, в котором будет выполняться рисование -- т.е. в любой момент времени у него будут текущие настройки для таких вещей, как:
- Цвет фона
- Цвет переднего плана
- Ширина линии
- шаблон линии
- шрифт
(и так далее для еще нескольких вещей).
Теперь, насколько есть поверхность для рисования: да,Я считаю, что к каждому контексту устройства всегда прикреплена поверхность для рисования.В общем случае контекста устройства для окна эта поверхность рисования будет частью экранного буфера, в котором отображается окно.В случае «совместимого» контекста устройства (например, результат CreateCompatibleDC) это будет довольно бесполезная поверхность для рисования - в частности, это один монохромный пиксель.Он будет установлен либо на черный, либо на белый, в зависимости от того, превышает ли общий уровень яркости того, что вы рисуете на DC, определенный порог или нет (и нет, точный порог я не помню точно).
Это имеет (своего рода) полезное назначение, хотя: в частности, это означает, что DC всегда «пригоден для использования» - никогда не бывает ситуации, в которой отрисовка в DC будет неудачной только потому, что естьнет рисунка поверхности прилагается.В помощь этому нет функции DeselectObject
- вы можете использовать SelectObject
, чтобы выбрать другое растровое изображение в контексте устройства (которое также будет удалять исходный), но нет способаотмените выбор одного растрового изображения из контекста устройства, не выбирая другое в нем - так что к всегда прикреплена поверхность рисования.
В то же время поверхность рисования по умолчанию для совместимого контекста устройства имеет виднастолько близко к бесполезному, что это почти считается отсутствием прикрепленной к поверхности рисования.
Редактировать: Я должен также добавить, что поверхность рисования по умолчанию, выбранная в контексте совместимого устройства, является источником многих проблем,В частности, когда вы создаете совместимый DC для рисования с двойной буферизацией, вы должны сделать что-то вроде этого:
DC memDC = CreateCompatibleDC(windowDC);
BITMAP bmp = CreateCompatibleBitmap(WindowDC, sizeX, sizeY);
SelectObject(memDC, bmp);
Если, однако, вы слегка облажаетесь и делаете это вместо этого:
DC memDC = CreateCompatibleDC(windowDC);
BITMAP bmp = CreateCompatibleBitmap(memDC, sizeX, sizeY);
SelectObject(memDC, bmp);
... все будет успешно, и в какой-то степени все будет работать - за исключением того, что все, что вы рисуете через совместимый DC, будет монохромным.Это восходит к этому однопиксельному монохромному растровому изображению.Поскольку для совместимого DC по умолчанию выбран монохромный рисунок, при запросе совместимого изображения вы получите монохромный рисунок указанного размера.В первой версии вы запрашиваете растровое изображение, совместимое с растровым изображением, выбранным в исходном DC, который обычно будет экраном, поэтому то, что вы создаете, будет иметь полный цвет, для которого установлен экран.