|
9. Kontext zariadenia |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Na prednáške:
Kreslenie do kontextu zariadenia
Kontext zariadenia - anglicky device context, je abstrakcia zariadenie (obrazovky, tlačiarne, pamäťovej bitmapy a pod). Do kontextu kreslíme pomocou GDI (Graphic Device Interface) funkcií Windows:
function WindowProc(Handle:
HWND; Msg, wParam, lParam: Longint): Longint; stdcall; var DC: HDC; begin case Msg of WM_DESTROY: if Handle=MainWindow then begin MainWindow:=0; PostQuitMessage(0); end; WM_COMMAND: if (wParam shr 16=BN_CLICKED) and (wParam and $FFFF=1) then begin DC:=GetDC(MainWindow); Rectangle(DC, 200, 100, 300, 200); ReleaseDC(MainWindow, DC); end; end; Result:=DefWindowProc(Handle, Msg, wParam, lParam); end; |
GetDC(HandleOkna): HDC // vráti kontext, ktorý zodpovedá oknu
ReleaseDC(MainWindow, DC) // po skončení kreslenia treba kontextu uvoľniť - je to dôležité
Ak chceme zmeniť farbu výplne, musíme vytvoriť vlastnú výplň (brush) a nastaviť ju ako výplň, s ktorou bude kontext zariadenia kresliť:
function WindowProc(Handle:
HWND; Msg, wParam, lParam: Longint): Longint; stdcall; var DC: HDC; Brush, OldBrush: HBrush; begin case Msg of WM_DESTROY: if Handle=MainWindow then begin MainWindow:=0; PostQuitMessage(0); end; WM_COMMAND: if (wParam shr 16=BN_CLICKED) and (wParam and $FFFF=1) then begin DC:=GetDC(MainWindow); Brush:=CreateSolidBrush($00FFFF); OldBrush:=SelectObject(DC, Brush); Rectangle(DC, 200, 100, 300, 200); SelectObject(DC, OldBrush); DeleteObject(Brush); ReleaseDC(MainWindow, DC); end; end; Result:=DefWindowProc(Handle, Msg, wParam, lParam); end; |
Funkcia SelectObject(DC, Handle): HGDIOBJ nastaví grafický objekt do kontextu zariadenia ako objekt, s ktorým sa bude realizovať kreslenie. Funkcia vráti handle ekvivalentného grafického objektu (v tomto prípade výplne), ktorý bol v kontexte nastavený ešte predtým, ako sme funkciu zavolali.
TCanvas ako Device Context
function WindowProc(Handle:
HWND; Msg, wParam, lParam: Longint): Longint; stdcall; var DC: HDC; Canvas: TCanvas; begin case Msg of WM_DESTROY: if Handle=MainWindow then begin MainWindow:=0; PostQuitMessage(0); end; WM_COMMAND: if (wParam shr 16=BN_CLICKED) and (wParam and $FFFF=1) then begin DC:=GetDC(MainWindow); Canvas:=TCanvas.Create; Canvas.Handle:=DC; Canvas.Brush.Color:=clYellow; Canvas.Rectangle(200, 100, 300, 200); Canvas.Free; ReleaseDC(MainWindow, DC); end; end; Result:=DefWindowProc(Handle, Msg, wParam, lParam); end; |
Iná ukážka - odchytenie obrazovky:
procedure
TForm1.Button1Click(Sender: TObject); var DC: HDC; Bitmap: TBitmap; begin DC:=GetDC(0); try Bitmap:=TBitmap.Create; try Bitmap.Width:=Screen.Width; Bitmap.Height:=Screen.Height; BitBlt( Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, DC, 0, 0, SRCCOPY); Bitmap.SaveToFile('D:\ScreenShot.bmp'); Canvas.StretchDraw(ClientRect, Bitmap); finally Bitmap.Free; end; finally ReleaseDC(0, DC); end; end; |
Tlač
uses ..., Printers; procedure TForm1.Button1Click(Sender: TObject); var Text: string; TextHeight: Integer; Size: Integer; Y: Integer; begin Printer.BeginDoc; Printer.Canvas.Rectangle( 10, 10, Printer.PageWidth-10, Printer.PageHeight-10); Printer.Canvas.Font.Name:='Arial'; Size:=8; Y:=0; while True do begin Printer.Canvas.Font.Size:=Size; Text:=IntToStr(Size)+' Ahoj'; TextHeight:=Printer.Canvas.TextHeight(Text); if Y+TextHeight>Printer.PageHeight-20 then Break; Printer.Canvas.TextOut( (Printer.PageWidth-Printer.Canvas.TextWidth(Text)) div 2, Y, Text); Size:=Size+4; Y:=Y+TextHeight; end; Printer.EndDoc; end; |
© 2003 Ľubomír SALANCI