9. Kontext zariadenia
Domovská stránka Programovanie v C++ OOP a Windows Ročníkový projekt Princípy počítačov Princípy databáz Všeličo Kontakt

 

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;

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