471,338 Members | 1,491 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,338 software developers and data experts.

display an image with BitBlt (in Paint-method)

Hi,

In the override of the Paint-method of a DataGridTextBoxColumn I want to
show an image with BitBlt, to see what I can gain there on performance.
The problem is: It doesn't show me the image in the DataGrid-Cell's, but a
black background...

Does anybody has any idea what I am doing wrong?

Thanks a lot in advance,

Pieter
Declare Auto Function BitBlt Lib "GDI32.DLL" ( _
ByVal hdcDest As IntPtr, _
ByVal nXDest As Integer, _
ByVal nYDest As Integer, _
ByVal nWidth As Integer, _
ByVal nHeight As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXSrc As Integer, _
ByVal nYSrc As Integer, _
ByVal dwRop As Int32) As Boolean
Private Const SRCCOPY As Integer = &HCC0020

Protected Overloads Overrides Sub Paint(ByVal g As Graphics, ByVal
bounds As Rectangle, ByVal source As CurrencyManager, ByVal rowNum As
Integer, ByVal backBrush As Brush, ByVal foreBrush As Brush, ByVal
alignToRight As Boolean)
Dim rectB As New Rectangle
rectB = bounds
rectB.Width = rectB.Width + 1
Dim g3 As Graphics
g3 = Graphics.FromImage(fe.BackgroundImage)
'fe.BackgroundImage is a bitmap I read from a stream (PixelFormat =
Format32bppPArgb)
Dim HDC1 As IntPtr = g.GetHdc
Dim HDC2 As IntPtr = g3.GetHdc
Me.BitBlt(HDC1, 0, 0, rectB.Width, rectB.Height, HDC2, 0, 0,
SRCCOPY)
g.ReleaseHdc(HDC1)
g3.ReleaseHdc(HDC2)
....
Jul 28 '05 #1
2 2242
Hi,

You need to create a compatible device context. See my post on the 19th of
July under Graphics.DrawIMage uses More memory

James

--
Create interactive diagrams and flowcharts with ERM Diagram at
http://www.crainiate.net

Take the ERM Tour at http://www.flowchartcontrol.com
"DraguVaso" <pi**********@hotmail.com> wrote in message
news:eM**************@tk2msftngp13.phx.gbl...
Hi,

In the override of the Paint-method of a DataGridTextBoxColumn I want to
show an image with BitBlt, to see what I can gain there on performance.
The problem is: It doesn't show me the image in the DataGrid-Cell's, but a
black background...

Does anybody has any idea what I am doing wrong?

Thanks a lot in advance,

Pieter
Declare Auto Function BitBlt Lib "GDI32.DLL" ( _
ByVal hdcDest As IntPtr, _
ByVal nXDest As Integer, _
ByVal nYDest As Integer, _
ByVal nWidth As Integer, _
ByVal nHeight As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXSrc As Integer, _
ByVal nYSrc As Integer, _
ByVal dwRop As Int32) As Boolean
Private Const SRCCOPY As Integer = &HCC0020

Protected Overloads Overrides Sub Paint(ByVal g As Graphics, ByVal
bounds As Rectangle, ByVal source As CurrencyManager, ByVal rowNum As
Integer, ByVal backBrush As Brush, ByVal foreBrush As Brush, ByVal
alignToRight As Boolean)
Dim rectB As New Rectangle
rectB = bounds
rectB.Width = rectB.Width + 1
Dim g3 As Graphics
g3 = Graphics.FromImage(fe.BackgroundImage)
'fe.BackgroundImage is a bitmap I read from a stream (PixelFormat =
Format32bppPArgb)
Dim HDC1 As IntPtr = g.GetHdc
Dim HDC2 As IntPtr = g3.GetHdc
Me.BitBlt(HDC1, 0, 0, rectB.Width, rectB.Height, HDC2, 0,
0,
SRCCOPY)
g.ReleaseHdc(HDC1)
g3.ReleaseHdc(HDC2)
...

Jul 28 '05 #2
Here's some code I use to copy part of a bitmap image to the ClipRectangle
passed for repainting. Note that v_BackImage is my background bitmap I
defined as a private variable in my overall class.

Private Sub me_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim hdcControl As IntPtr = e.Graphics.GetHdc
Dim hdcBitmapDC As IntPtr = gph.GetHdc
Dim hdcBitmapHandle As IntPtr = v_BackImage.GetHbitmap 'This takes
up 85% of time
SelectObject(hdcBitmapDC, hdcBitmapHandle)
BitBlt(hdcControl, e.ClipRectangle.X, e.ClipRectangle.Y,
e.ClipRectangle.Width, e.ClipRectangle.Height, hdcBitmapDC,
e.ClipRectangle.X, e.ClipRectangle.Y, &HCC0020)
DeleteObject(hdcBitmapHandle)
gph.ReleaseHdc(hdcBitmapDC)
e.Graphics.ReleaseHdc(hdcControl)
exit sub

'**** Explaination of above *********
' BitBlt copies the graphic data to a Device Context. A Device
Context is a data structure maintained by GDI. A device context is
'associated with a particular display device, such as a printer or
video display. For a video display, a device context is usually
'associated with a particular window on the display, but it can also
be an offscreen display.

'What you do, is create a Device Context and then associate a Bitmap
with the Device Context ( with SelectObject ). Then you
' draw to the Device Context ( using BitBlt ) to alter the Bitmap.
You can't use GDI functions to directly draw to a bitmap.

'After using a Device Context, you need to clean stuff up ( release
and delete ) or else the device context stays locked and
' other attempts to draw again will fail. Also not cleaning up will
result in memory leaks.
--
Dennis in Houston
"James Westgate" wrote:
Hi,

You need to create a compatible device context. See my post on the 19th of
July under Graphics.DrawIMage uses More memory

James

--
Create interactive diagrams and flowcharts with ERM Diagram at
http://www.crainiate.net

Take the ERM Tour at http://www.flowchartcontrol.com
"DraguVaso" <pi**********@hotmail.com> wrote in message
news:eM**************@tk2msftngp13.phx.gbl...
Hi,

In the override of the Paint-method of a DataGridTextBoxColumn I want to
show an image with BitBlt, to see what I can gain there on performance.
The problem is: It doesn't show me the image in the DataGrid-Cell's, but a
black background...

Does anybody has any idea what I am doing wrong?

Thanks a lot in advance,

Pieter
Declare Auto Function BitBlt Lib "GDI32.DLL" ( _
ByVal hdcDest As IntPtr, _
ByVal nXDest As Integer, _
ByVal nYDest As Integer, _
ByVal nWidth As Integer, _
ByVal nHeight As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXSrc As Integer, _
ByVal nYSrc As Integer, _
ByVal dwRop As Int32) As Boolean
Private Const SRCCOPY As Integer = &HCC0020

Protected Overloads Overrides Sub Paint(ByVal g As Graphics, ByVal
bounds As Rectangle, ByVal source As CurrencyManager, ByVal rowNum As
Integer, ByVal backBrush As Brush, ByVal foreBrush As Brush, ByVal
alignToRight As Boolean)
Dim rectB As New Rectangle
rectB = bounds
rectB.Width = rectB.Width + 1
Dim g3 As Graphics
g3 = Graphics.FromImage(fe.BackgroundImage)
'fe.BackgroundImage is a bitmap I read from a stream (PixelFormat =
Format32bppPArgb)
Dim HDC1 As IntPtr = g.GetHdc
Dim HDC2 As IntPtr = g3.GetHdc
Me.BitBlt(HDC1, 0, 0, rectB.Width, rectB.Height, HDC2, 0,
0,
SRCCOPY)
g.ReleaseHdc(HDC1)
g3.ReleaseHdc(HDC2)
...


Jul 29 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

7 posts views Thread by Philipp Lenssen | last post: by
reply views Thread by Qindong Zhang | last post: by
1 post views Thread by Tan | last post: by
2 posts views Thread by David | last post: by
3 posts views Thread by den 2005 | last post: by
3 posts views Thread by Ladislav Andel | last post: by
reply views Thread by rosydwin | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.