-
Почему следующий код отрисовывает битмап только один раз, при следующем WM_PAINT все стирается?
procedure DrawBitmap(var PS: PAINTSTRUCT);
var
BDC: HDC;
BMP: HBITMAP;
begin
BDC := CreateCompatibleDC(ps.hdc);
BMP := SelectObject(BDC, MyBitmap);
BitBlt(ps.hdc, 0, 0, ps.rcPaint.Right, ps.rcPaint.Bottom, BDC, 0, 0, SRCCOPY);
DeleteObject(BMP);
ReleaseDC(myWnd, BDC);
end;
function myWinProc(hWnd: HWND; Msg: TMessage): LRESULT; stdcall;
var
myPaint: PAINTSTRUCT;
begin
case Msg.Msg of
WM_PAINT:
begin
BeginPaint(hWnd, myPaint);
DrawBitmap(myPaint);
EndPaint(hWnd, myPaint);
end;
WM_DESTROY:
PostQuitMessage(0);
end;
result := DefWindowProc(hwnd, Msg.Msg, Msg.wParam, msg.lParam);
end;
-
BDC := CreateCompatibleDC(ps.hdc);
BMP := SelectObject(BDC, MyBitmap);
BitBlt(ps.hdc, 0, 0, ps.rcPaint.Right, ps.rcPaint.Bottom, BDC, 0, 0, SRCCOPY);
SelectObject(BMP, MyBitmap);
DeleteDC(BDC);
-
точнее не так, немного перепутал. вот тебе код отрисовки картинки на форме: procedure ShowPicture;
function Rect(Left, Top, Right, Bottom: Integer): TRect;
begin
Result.Left := Left;
Result.Top := Top;
Result.Right := Right;
Result.Bottom := Bottom;
end;
var
Bitmap: HBITMAP;
BitmapSize: TSize;
DC, BitmapDC, OldDC: HDC;
bLeft, bTop: Cardinal;
_Rect: TRect;
S: String;
Pen: HPEN;
begin
Bitmap := LoadBitmap(HInstance, MAKEINTRESOURCE(200));
if Bitmap <> 0 then
try
BitmapSize := PictureSize;
DC := GetDC(Handle);
try
BitmapDC := CreateCompatibleDC(DC);
try
OldDC := SelectObject(BitmapDC, Bitmap);
try
bLeft := (Width - BitmapSize.cx);
bTop := 0;
StretchBlt(DC, 0, 0, bLeft, BitmapSize.cy, BitmapDC, 0, 0, 1, BitmapSize.cy, SRCCOPY);
BitBlt(DC, bLeft, bTop, BitmapSize.cx, BitmapSize.cy, BitmapDC, 0, 0, SRCCOPY);
SetBkMode(DC, OPAQUE);
if hFontBold <> 0 then
SelectObject(DC, hFontBold);
S := INFO1;
_Rect := Rect(10, 6, 230, 31);
DrawText(DC, PChar(S), Length(S), _Rect, DT_WORDBREAK);
if hFontNormal <> 0 then
SelectObject(DC, hFontNormal);
S := INFO2;
_Rect := Rect(10, 40, 280, 70);
DrawText(DC, PChar(S), Length(S), _Rect, DT_WORDBREAK + DT_NOCLIP);
S := INFO3;
_Rect := Rect(10, 55, 280, 100);
DrawText(DC, PChar(S), Length(S), _Rect, DT_WORDBREAK + DT_NOCLIP);
Pen := CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW));
try
SelectObject(DC, Pen);
MoveToEx(DC, 6, 127, nil);
LineTo(DC, 349, 127);
finally
DeleteObject(Pen);
end;
Pen := CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT));
try
SelectObject(DC, Pen);
MoveToEx(DC, 348, 128, nil);
LineTo(DC, 5, 128);
finally
DeleteObject(Pen);
end;
finally
SelectObject(OldDC, Bitmap);
end;
finally
DeleteDC(BitmapDC);
end;
finally
ReleaseDC(Handle, DC);
end;
finally
DeleteObject(Bitmap);
end;
end;
-
слишком много, не могу разобрать, мождешь обхяснить в чем ошибка моего кода или твоего первого?
-
Ну грубо ты делаешь DeleteObject хотя обьект ты не создавал, после SelectObject нужно вернуть все на место ну и т.п. почитай справку по функциям. В MSDN идут примеры правильного использования...
|