Canvas does not allow drawing

I want to draw a screenshot from the entire screen onto the TForm1 canvas.

This code works well in Delphi XE3

procedure TForm1.Button1Click(Sender: TObject); var c,scr: TCanvas; r,r2: TRect; begin c := TCanvas.Create; scr := TCanvas.Create; c.Handle := GetWindowDC(GetDesktopWindow); try r := Rect(0, 0, 200, 200); form1.Canvas.CopyRect(r, c, r); finally ReleaseDC(0, c.Handle); c.Free; end; 

Now I want to first copy the screenshot to another canvas. Is there any way to do this without getting this error?

 procedure TForm1.Button1Click(Sender: TObject); var c,scr: TCanvas; r,r2: TRect; begin c := TCanvas.Create; scr := TCanvas.Create; c.Handle := GetWindowDC(GetDesktopWindow); try r := Rect(0, 0, 200, 200); scr.CopyRect(r,c,r); <-- Error, canvas does not allow drawing form1.Canvas.CopyRect(r, scr, r); <-- Error, canvas does not allow drawing finally ReleaseDC(0, c.Handle); c.Free; end; 
+4
source share
2 answers

If you need to work with an additional canvas, you will have to assign an HDC, for example.

 var WindowHandle:HWND; ScreenCanvas,BufferCanvas: TCanvas; r,r2: TRect; ScreenDC,BufferDC :HDC; BufferBitmap : HBITMAP; begin WindowHandle := 0; ScreenCanvas := TCanvas.Create; BufferCanvas := TCanvas.Create; ScreenDC:=GetWindowDC(WindowHandle); ScreenCanvas.Handle := ScreenDC; BufferDC := CreateCompatibleDC(ScreenDC); BufferCanvas.Handle := BufferDC; BufferBitmap := CreateCompatibleBitmap(ScreenDC, GetDeviceCaps(ScreenDC, HORZRES), GetDeviceCaps(ScreenDC, VERTRES)); SelectObject(BufferDC, BufferBitmap); try r := Rect(0, 0, 200, 200); BufferCanvas.CopyRect(r,ScreenCanvas,r); form1.Canvas.CopyRect(r, BufferCanvas, r); finally ReleaseDC(WindowHandle, ScreenCanvas.Handle); DeleteDC(BufferDC); DeleteObject(BufferBitmap); BufferCanvas.Free; ScreenCanvas.Free; end; end; 
+3
source

This is the time to throw my decision to the bank!

 procedure TForm1.FormClick(Sender: TObject); var ScreenCanvas: TCanvas; begin ScreenCanvas := TCanvas.Create; try ScreenCanvas.Handle := GetWindowDC(GetDesktopWindow); Win32Check(ScreenCanvas.HandleAllocated); Canvas.CopyRect(Canvas.ClipRect, ScreenCanvas, ScreenCanvas.ClipRect); finally ReleaseDC(GetDesktopWindow, ScreenCanvas.Handle); ScreenCanvas.Free; end; end; 
0
source

All Articles