Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
2-1240853850
AlexDan
2009-04-27 21:37
2009.06.14
Базы и форточка.


2-1240904761
rar
2009-04-28 11:46
2009.06.14
Копирование файла


15-1239175665
Usov
2009-04-08 11:27
2009.06.14
Проблема отображения на сервере параметров с POST запроса


2-1240671432
AlexDan
2009-04-25 18:57
2009.06.14
SQL запрос


2-1240600979
kami
2009-04-24 23:22
2009.06.14
Преимущества нескольких соединений (TCP или UDP ) над одним





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский