2013-05-09 2 views
1

Я работаю над проектом, переводящим старый код MFC Windows 95 на C++ 11 с использованием Cairo. Поскольку я не знаком с MFC, я запутался в разных координатных пространствах для рисования в оригинальной программе, и сложно найти информацию и примеры, объясняющие эти функции.MFC Device Context SelectObject Рисование к растровому изображению

Итак, вот что я вижу. В коде кажется, что в какой-то момент появляется новый контекст устройства CDC, который создается с помощью CreateCompatibleDC. Затем создается растровый объект. Затем это растровое изображение устанавливается в новый контекст устройства с помощью функции SelectObject. Из того, что я могу почерпнуть, это растровое изображение, зависящее от устройства DDB.

Например:

bmp_dc = new CDC(); 
    bmp_dc->CreateCompatibleDC(NULL); 

    int num_bits_per_pixel = bmp_dc->GetDeviceCaps(NUMBITSPIXEL); 
    int num_planes = bmp_dc->GetDeviceCaps(NUMPLANES); 
    c_bmp = new CBitmap(); 
    c_bmp->CreateBitmap(width, height,num_planes,num_bits_per_pixel,NULL); 

    bmp_dc->SelectObject(c_bmp); 

Этот новый контекст устройства затем получает розданы на ряд классов, которые выполняют операции рисования, используя его (bmp_dc-> MoveTo(), LineTo, Ellipse и т.д.). Мой вопрос в том, что все эти операции рисования, которые используют этот контекст устройства, получают рисование непосредственно в растровое изображение, а не на экран дисплея? И, полагают ли они, что растровый верхний левый угол является источником при рисовании?

Я заметил, что есть несколько вызовов функций BitBlt, которые происходят позже, и я думаю, что они вытаскивают растровое изображение на фактический экран, используя координаты экранов экрана. Но я действительно не уверен, и надеялся на некоторое разъяснение. Благодаря!

ответ

2

Похоже, вы прекрасно понимали!

Код использует CreateCompatibleDC, чтобы создать постоянный DC памяти, который является тем же самым форматом, что и физический дисплей (он передает NULL в качестве аргумента, что означает использование DC-файла dektop). Затем, чтобы рисовать в растровое изображение, необходимо выбрать растровое изображение в память DC, используя SelectObject, как вы сказали.

Тогда любой чертеж в DC фактически рисует растровое изображение «внутри» памяти DC.

Наконец, BitBlt может отображать содержимое растрового изображения (из памяти DC) на устройство отображения. Это классическая реализация двойного буферизированного рисунка, чтобы избежать мерцания во время отображения.

Все команды рисования используют одну и ту же систему координат - верхний левый - начало координат (0,0).

Есть ли что-то, что противоречит этому? Если да, возможно, вы можете разместить еще несколько кодов.

+1

Большое спасибо за информативный ответ, это очень ценится! :) – user1930581

Смежные вопросы