-
как скопировать 1 в 1 битмап в памяти по хэндлу, без преобразований в DIB и изменений палитры? локальную копию системного битмапа так сказать
-
-
не, не то + устарело
-
-
Хотя нет. А у тебя задача какая просто массив байт получить?
-
накидал 2 варианта 1 Function CopyBitmap(Const H:HBITMAP):HBITMAP;
Var memdc,copydc:hdc;
B: tagBITMAP;
Begin
GetObject(h,sizeof(tagBITMAP),@B);
result:=CreateBitmapIndirect(b);
memdc:=CreateCompatibleDC(0);
SelectObject(memdc,h);
copydc:=CreateCompatibleDC(0);
SelectObject(copydc,result);
BitBlt(copydc,0,0,b.bmWidth,b.bmHeight,memdc,0,0,SRCCOPY);
DeleteDC(memdc);
DeleteDC(copydc);
end; 2 как утверждает Микрософт должен быть быстрей Function CopyBitmap(Const H:HBITMAP):HBITMAP;
Var memdc,copydc:hdc;
B: tagBITMAP;
Begin
GetObject(h,sizeof(tagBITMAP),@B);
memdc:=CreateCompatibleDC(0);
SelectObject(memdc,h);
result:=CreateCompatibleBitmap(memdc,b.bmWidth,b.bmHeight);
copydc:=CreateCompatibleDC(0);
SelectObject(copydc,result);
BitBlt(copydc,0,0,b.bmWidth,b.bmHeight,memdc,0,0,SRCCOPY);
DeleteDC(memdc);
DeleteDC(copydc);
end; есть тут что нужно добавить\убавить, кроме проверок естественно?
-
после SelectObject будет утечка, DeleteObject результату сделай
-
ЗЫ: результату SelectObject есесно
-
да так то нет утечки, не пищит нигде да и изначальные обекты удаляются вместе с дц, не?
-
сделал покошерней Function CopyBitmap(Const H:HBITMAP):HBITMAP;
Var memdc,copydc,dc:hdc;
B: tagBITMAP;
SO1,SO2:HGDIOBJ;
Begin
dc:=GetDC(0);
GetObject(h,sizeof(tagBITMAP),@B);
result:=CreateCompatibleBitmap(dc,b.bmWidth,b.bmHeight);
memdc:=CreateCompatibleDC(dc);
SO1:=SelectObject(memdc,h);
copydc:=CreateCompatibleDC(dc);
SO2:=SelectObject(copydc,result);
BitBlt(copydc,0,0,b.bmWidth,b.bmHeight,memdc,0,0,SRCCOPY);
SelectObject(memdc,SO1);
SelectObject(copydc,SO2);
DeleteDC(memdc);
DeleteDC(copydc);
ReleaseDC(0,dc)
end;
|