Mega Code Archive

 
Categories / Delphi / API
 

Non vcl bitmap buffering

Question: How do I create a non VCL memory display context and bitmap for additional drawing performance? Answer: You will need to use low level Windows API functions. Example: procedure TForm1.Button1Click(Sender: TObject); var dc : hdc; MemDc : hdc; MemBitmap : hBitmap; OldMemBitmap : hBitmap; begin {Get the handle to the screen's dc} dc := GetDc(0); {Create and retrieve a handle to a memory dc based on the screen} MemDc := CreateCompatibleDc(dc); {Create a bitmap that is compatible with the display.} {Note: if you pass "MemDc" to CreateCompatibleBitmap()} {instead of "dc", you will get a monochrome bitmap!} MemBitmap := CreateCompatibleBitmap(dc, 100, 100); {Release the screen dc} ReleaseDc(0, dc); {Select the bitmap surface into the MemDc} {remembering the default bitmap} OldMemBitmap := SelectObject(MemDc, MemBitmap); {Draw on the MemoryDc} PatBlt(MemDc, 0, 0, 100, 100, WHITENESS); Ellipse(MemDc, 0, 0, 100, 100); {Copy the MemDc to the Form Canvas} BitBlt(Form1.Canvas.Handle, 100, 100, 100, 100, MemDc, 0, 0, SRCCOPY); {Select the default bitmap back into the memory dc} SelectObject(MemDc, OldMemBitmap); {Note: You can now use the memory bitmap handle with} {functions such as GetDiBits()} {Delete the Memory Bitmap} DeleteObject(MemBitmap); {Delete the MemoryDc} DeleteDc(MemDc); end;