Я хочу использовать растровое изображение, чтобы прочитать текущее окно просмотра, внести в него некоторые изменения и вывести растровое изображение обратно в представление. Предполагается, что программа читает белое окно и рисует квадрат на этом фоне. Однако изображение, которое я вижу в последнем окне, представляет собой квадрат на черном фоне.mfc bitmap читает полностью черное растровое изображение
void CScribbleView::OnLButtonDown(UINT, CPoint point)
{
//CClientDC dc(this);
//OnPrepareDC(&dc);
HBITMAP initialMap;
RECT t;
BITMAP bmpScreen;
GetClientRect(&t);
initialMap = CreateCompatibleBitmap(GetDC()->m_hDC,t.right-t.left,t.bottom-t.top);
HDC tempDC = CreateCompatibleDC(GetDC()->m_hDC);
SelectObject(tempDC,initialMap);
SelectObject(tempDC,getStockObject(BLACK_PEN);
SelectObject(tempDC,GetStockObject(WHITE_BRUSH));
Rectangle(tempDC,100,100,200,200);
BitBlt(GetDC()->m_hDC,clientR.left,clientR.top,clientR.right-clientR.left,t.bottom-clientR.top,tempDC,0,0,SRCCOPY);
}
Я подозреваю, что растровое изображение не было правильно прочитать из моего оригинального DC. Поэтому позже я решил использовать другой способ получения DC, CClientDC, а не GetClientDC() -> m_hDC.
void CScribbleView::OnLButtonDown(UINT, CPoint point)
{
CClientDC dc(this);
OnPrepareDC(&dc);
HBITMAP initialMap;
RECT t;
BITMAP bmpScreen;
GetClientRect(&t);
initialMap = CreateCompatibleBitmap(dc.m_hDC,t.right-t.left,t.bottom-t.top);
HDC tempDC = CreateCompatibleDC(dc.m_hDC);
SelectObject(tempDC,initialMap);
SelectObject(tempDC,getStockObject(BLACK_PEN);
SelectObject(tempDC,GetStockObject(WHITE_BRUSH));
Rectangle(tempDC,100,100,200,200);
BitBlt(dc.m_hDC,clientR.left,clientR.top,clientR.right-clientR.left,t.bottom-clientR.top,tempDC,0,0,SRCCOPY);
}
Теперь новая программа ничего не показывает; это тот же белый фон, с которого я изначально начинался. В чем разница между этими двумя DC и как я могу исправить свою проблему?
Хорошо, кажется, что функция CreateCompatibleBitmap не создает битовый массив, который содержит то же изображение, которое находится в окне клиента. Вместо этого он просто создает изображение, которое является размером окна клиента со всеми цветами пикселей, инициализированными нулем (что является черным). – varimax
Чтение текущего окна просмотра - это плохая идея. Чего вы на самом деле пытаетесь достичь? –
Это долгая история. Я делаю программу рисования, такую как Paint. Сейчас я работаю над рисованием прямоугольников. Первоначально, когда я нажимаю и перетаскиваю мышь, я бы нарисовал новый прямоугольник в функции OnMouseMove. Однако это оставляет кучу отсталых прямоугольников. Поэтому я решил сохранить представление клиента в растровом изображении в момент нажатия мыши. В функции OnMouseMove я просто нарисую верх над просмотром, который я сохранил, прикрывая предыдущий прямоугольник, созданный при перетаскивании. – varimax