Что делает SelectObject (dc, hBMP)?

Думаю, я понимаю, что произойдет, если я выберу «объект» в «контекст устройства», и если этот объект является кистью, font, pen < / em>: символы этих объектов в дальнейшем используются для рисования в контексте устройства.

Однако я не понимаю, что происходит после выбора растрового изображения в контексте устройства, не говоря уже о том, почему это необходимо.

У меня есть программа, которая кое-что делает

HDC dc = ::GetDC(hWnd);

ffBitmap   = ::CreateCompatibleBitmap(dc, windowWidth, windowHeight);
ffMemoryDc = ::CreateCompatibleDC(dc);

hOldBitmap          = (HBITMAP) ::SelectObject(ffMemoryDc, ffBitmap);

а затем обращается к ffMemoryDc, а затем * BitBlt * s ffMemoyDc в контекст реального устройства окна.

BitBlt ( dc, 
         0, 0, windowWidth, windowHeight,
         ffMemoryDc,
         0, 0,
         SRCCOPY
       );

Переменная ffBitmap больше нигде во всей программе не упоминается, однако, если я не использую SelectObject (ffBitmap), ничего не будет отрисовано, поэтому это необходимо.

Буду признателен, если кто-нибудь сможет пролить свет на то, что здесь происходит.


person René Nyffenegger    schedule 17.01.2011    source источник
comment
Думайте об этом как о штампе. Создано SelectObject, применено с BitBlt. Дополнительное косвенное обращение важно.   -  person Hans Passant    schedule 17.01.2011


Ответы (1)


Вот как это работает. Растровое изображение, которое вы выбираете в DC, является растровым изображением, которое «закрашено». Цитата MSDN:

Прежде чем приложение сможет использовать контекст устройства памяти для операций рисования, оно должно выбрать растровое изображение правильной ширины и высоты в контексте устройства.

person jpalecek    schedule 17.01.2011
comment
Почему мы не можем просто создать растровое изображение с CreateCompatibleBitmap и передать ему ffMemoryDc в качестве первого параметра? - person Herrgott; 11.07.2021