dc:=CreateCompatibleDC(GetDC(Wnd));
rectangle(dc,10,10,100,100);
BitBlt(GetDC(Wnd),0,0,iWidth,iHeight,dc,0,0,srccopy);
.....
Быстрый вывод графики средствами WinAPI
Подскажите пожалуйста как сделать вывод графики на поверхность окна средствами функций CreateCompatibleDC и BitBlt.
Я сделал че то типа:
Код:
Ни че не выводиться(((
Подскажите в чем ошибка!
Код:
invoke BeginPaint,hWnd,addr ps ;Получаем хэндл (DC).
mov hdc,eax ; сохраняем его в переменную
invoke CreateCompatibleDC,hdc ;указываем поверхность для
;рисования
mov hMemDC,eax ;сохраняем его в переменную
invoke SelectObject,hMemDC,hBitmap; выбираем объект для
;отображения на поверхности (в моем случае bmp-файл)
invoke GetClientRect,hWnd,addr rect ;выбираем отображение в
;клиентской области окна
invoke BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY ;отображаем
;картинку в клиентской области окна
invoke DeleteDC,hMemDC ;освобождаем DC
mov hdc,eax ; сохраняем его в переменную
invoke CreateCompatibleDC,hdc ;указываем поверхность для
;рисования
mov hMemDC,eax ;сохраняем его в переменную
invoke SelectObject,hMemDC,hBitmap; выбираем объект для
;отображения на поверхности (в моем случае bmp-файл)
invoke GetClientRect,hWnd,addr rect ;выбираем отображение в
;клиентской области окна
invoke BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY ;отображаем
;картинку в клиентской области окна
invoke DeleteDC,hMemDC ;освобождаем DC
насколько я понял то что ты написал на Delphi будет примерно так (
но я гружу не картинку из файла, а просто вывожу прямоугольник к примеру):
Код:
var
ps: tpaintstruct;
dc, mydc: hdc;
lprect: TRect;
pen: hpen;
...
dc:=beginpaint(handle,ps);
mydc:=CreateCompatibleDC(dc);
pen:=CreatePen(ps_solid,1,rgb(0,0,0));
rectangle(mydc,10,10,100,100);
GetClientRect(handle,lprect);
BitBlt(dc,lprect.Left,lprect.Top,lprect.Right,lprect.Bottom,
mydc,0,0,srccopy);
deletedc(mydc);
endpaint(handle,ps);
ps: tpaintstruct;
dc, mydc: hdc;
lprect: TRect;
pen: hpen;
...
dc:=beginpaint(handle,ps);
mydc:=CreateCompatibleDC(dc);
pen:=CreatePen(ps_solid,1,rgb(0,0,0));
rectangle(mydc,10,10,100,100);
GetClientRect(handle,lprect);
BitBlt(dc,lprect.Left,lprect.Top,lprect.Right,lprect.Bottom,
mydc,0,0,srccopy);
deletedc(mydc);
endpaint(handle,ps);
Почему прямоугольник не выводиться я понять не могу:confused:
Подскажи иначе я об стенку убьюсь:)
Код:
SetRect(&rect, 0, 0, 10, 10);
hDC = GetDC(hwnd);
hBrush = CreateSolidBrush(0x0000FF00);
FillRect(hDC, &rect, hBrush);
ReleaseDC(hDC)
hDC = GetDC(hwnd);
hBrush = CreateSolidBrush(0x0000FF00);
FillRect(hDC, &rect, hBrush);
ReleaseDC(hDC)
На основной контекст выводится нормально.
А на совместимый - ....
Код:
pen:=CreatePen(ps_solid,1,rgb(0,0,0));
Получается что ты получил чем ты будешь рисовать, но не взял в руки.
Получается что ты получил чем ты будешь рисовать, но не взял в руки.
Еще надо добавить
Код:
SelectObject(mydc,pen)
потом
Код:
rectangle(mydc,10,10,100,100);
deletedc(mydc);
endpaint(handle,ps);
deletedc(mydc);
endpaint(handle,ps);
Или просто
Код:
rectangle(mydc,10,10,100,100);
GetClientRect(handle,lprect);
BitBlt(dc,lprect.Left,lprect.Top,lprect.Right,lprect.Bottom,
mydc,0,0,srccopy);
deletedc(mydc);
endpaint(handle,ps);
GetClientRect(handle,lprect);
BitBlt(dc,lprect.Left,lprect.Top,lprect.Right,lprect.Bottom,
mydc,0,0,srccopy);
deletedc(mydc);
endpaint(handle,ps);
Но в последнем примере кода я не очень уверен :)
Только я немного сомневаюсь что нужно одновременно и CompatibleDC и BeginPaint/EndPaint
Держите рабочий код:
Код:
void Paint(HDC hdc);
// WndProc
/* ... */
case WM_PAINT: {
RECT rc;
PAINTSTRUCT ps;
GetClientRect(hwnd,&rc);
HDC hdc=BeginPaint(hwnd,&ps);
HDC MEMDC=CreateCompatibleDC(hdc);
HBITMAP MEMBMP=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
SelectObject(MEMDC,MEMBMP);
Paint(MEMDC);
BitBlt(hdc,0,0,rc.right,rc.bottom,MEMDC,0,0,SRCCOPY);
EndPaint(hwnd,&ps);
DeleteDC(MEMDC);
DeleteObject(MEMBMP);
} break;
/* ... */
void Paint(HDC hdc) {
;/* Рисуем ...*/
}
// WndProc
/* ... */
case WM_PAINT: {
RECT rc;
PAINTSTRUCT ps;
GetClientRect(hwnd,&rc);
HDC hdc=BeginPaint(hwnd,&ps);
HDC MEMDC=CreateCompatibleDC(hdc);
HBITMAP MEMBMP=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
SelectObject(MEMDC,MEMBMP);
Paint(MEMDC);
BitBlt(hdc,0,0,rc.right,rc.bottom,MEMDC,0,0,SRCCOPY);
EndPaint(hwnd,&ps);
DeleteDC(MEMDC);
DeleteObject(MEMBMP);
} break;
/* ... */
void Paint(HDC hdc) {
;/* Рисуем ...*/
}
Ещё раз повторяю: если мы не льём битмапы из памяти на экран, то CreateCompatible...()-функции тут на фиг не нужны. Всё гораздо проще.
Решилось перехватом сообщения WM_PAINT
Код:
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
[size=1][color=red]ЗЫ. Проблема решена. Тема закрыта.[/color][/size]