Конференция "WinAPI" » WinApi, WM_PAINT [D7, WinXP]
 
  • R1ka © (19.05.08 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_ © (20.05.08 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_ © (20.05.08 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 © (20.05.08 14:21) [3]
    слишком много, не могу разобрать, мождешь обхяснить в чем ошибка моего кода или твоего первого?
  • Rouse_ © (20.05.08 14:48) [4]
    Ну грубо ты делаешь DeleteObject хотя обьект ты не создавал, после SelectObject нужно вернуть все на место ну и т.п. почитай справку по функциям. В MSDN идут примеры правильного использования...
 
Конференция "WinAPI" » WinApi, WM_PAINT [D7, WinXP]
Есть новые Нет новых   [134433   +22][b:0][p:0.002]