Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.14;
Скачать: CL | DM;

Вниз

WinApi, WM_PAINT   Найти похожие ветки 

 
R1ka ©   (2008-05-19 18:46) [0]

Почему следующий код отрисовывает битмап только один раз, при следующем 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;


 
Rouse_ ©   (2008-05-20 10:27) [1]

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);


 
Rouse_ ©   (2008-05-20 10:30) [2]

точнее не так, немного перепутал. вот тебе код отрисовки картинки на форме:

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;


 
R1ka ©   (2008-05-20 14:21) [3]

слишком много, не могу разобрать, мождешь обхяснить в чем ошибка моего кода или твоего первого?


 
Rouse_ ©   (2008-05-20 14:48) [4]

Ну грубо ты делаешь DeleteObject хотя обьект ты не создавал, после SelectObject нужно вернуть все на место ну и т.п. почитай справку по функциям. В MSDN идут примеры правильного использования...



Страницы: 1 вся ветка

Текущий архив: 2009.06.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
15-1239292132
CoderM
2009-04-09 19:48
2009.06.14
Реализация Captcha


15-1239111328
пикассо
2009-04-07 17:35
2009.06.14
книга по синтаксису object pascal


2-1240598283
buzb
2009-04-24 22:38
2009.06.14
Вопрос о Drag-n-Drop


4-1210672933
Nil
2008-05-13 14:02
2009.06.14
Прочитать состояние вывода LPT порта через usbprint.sys


1-1211343260
Julia
2008-05-21 08:14
2009.06.14
TJvInterpreterProgram