 At the moment I have no software that can help in trying to fix this problem. I have altered the code for the DrawButton function so that is uses the ReleaseDC API call. The code that reduces how fast the GC builds up you can replace the function with the following code. As said his will not fix the GC problem it will just reduce slightly the effect.
Private Declare Function ReleaseDC Lib "user32.dll" ( _<br />
ByVal hwnd As Int32, _<br />
ByVal hdc As Int32) As Int32<br />
<br />
Private Sub DrawButton(ByVal g As Graphics, ByVal state As state)<br />
Dim windowTheme As IntPtr = openThemeData(Me.Handle, "Window")<br />
Dim btn_width As Integer = GetSystemMetrics(SM_CXSIZE)<br />
Dim btn_height As Integer = GetSystemMetrics(SM_CYSIZE)<br />
Dim pos As Point<br />
Select Case parent.FormBorderStyle<br />
Case FormBorderStyle.SizableToolWindow, FormBorderStyle.FixedToolWindow<br />
pos = New Point(wnd_size.Width - ((bindex - 1) * btn_width / 1.5) - 12 - (btn_width - 18), 5)<br />
Case FormBorderStyle.None<br />
Case Else<br />
pos = New Point(wnd_size.Width - ((bindex - 1) * btn_width) - 12 - (btn_width - 18), 5)<br />
End Select<br />
<br />
' real button size<br />
btn_width -= 2<br />
btn_height -= 4<br />
<br />
Dim hDC As IntPtr<br />
Select Case parent.FormBorderStyle<br />
Case FormBorderStyle.SizableToolWindow, FormBorderStyle.FixedToolWindow<br />
'small caption button<br />
hDC = g.GetHdc()<br />
If bhelpbutton = True Then<br />
Select Case state<br />
Case state.Normal<br />
drawThemeBackground(windowTheme, hDC, 23, 1, New RECT(New Rectangle(pos.X, pos.Y, btn_width / 1.5, btn_height / 1.5)), IntPtr.Zero)<br />
Case state.Hot<br />
drawThemeBackground(windowTheme, hDC, 23, 2, New RECT(New Rectangle(pos.X, pos.Y, btn_width / 1.5, btn_height / 1.5)), IntPtr.Zero)<br />
Case state.Pushed<br />
drawThemeBackground(windowTheme, hDC, 23, 3, New RECT(New Rectangle(pos.X, pos.Y, btn_width / 1.5, btn_height / 1.5)), IntPtr.Zero)<br />
Case state.Disabled<br />
drawThemeBackground(windowTheme, hDC, 23, 4, New RECT(New Rectangle(pos.X, pos.Y, btn_width / 1.5, btn_height / 1.5)), IntPtr.Zero)<br />
End Select<br />
ElseIf bimageonly = False Then<br />
Select Case state<br />
Case state.Normal<br />
drawThemeBackground(windowTheme, hDC, 15, 1, New RECT(New Rectangle(pos.X, pos.Y, btn_width / 1.5, btn_height / 1.5)), IntPtr.Zero)<br />
Case state.Hot<br />
drawThemeBackground(windowTheme, hDC, 15, 2, New RECT(New Rectangle(pos.X, pos.Y, btn_width / 1.5, btn_height / 1.5)), IntPtr.Zero)<br />
Case state.Pushed<br />
drawThemeBackground(windowTheme, hDC, 15, 3, New RECT(New Rectangle(pos.X, pos.Y, btn_width / 1.5, btn_height / 1.5)), IntPtr.Zero)<br />
Case state.Disabled<br />
drawThemeBackground(windowTheme, hDC, 15, 4, New RECT(New Rectangle(pos.X, pos.Y, btn_width / 1.5, btn_height / 1.5)), IntPtr.Zero)<br />
End Select<br />
End If<br />
ReleaseDC(Me.Handle.ToInt32(), hDC.ToInt32())<br />
hDC = New IntPtr(GetWindowDC(parent.Handle.ToInt32))<br />
g = Graphics.FromHdc(hDC) 'm.HWnd));<br />
If bhelpbutton = False Then<br />
If Not bimagelist Is Nothing Then<br />
If bimagelist.Images.Count = 1 Then<br />
If state <> state.Disabled Then<br />
g.DrawImage(bimagelist.Images(0), pos.X, pos.Y)<br />
Else<br />
ControlPaint.DrawImageDisabled(g, bimagelist.Images(0), pos.X, pos.Y, Color.Transparent)<br />
End If<br />
ElseIf bimagelist.Images.Count = 4 Then<br />
Select Case state<br />
Case state.Disabled<br />
g.DrawImage(bimagelist.Images(3), pos.X, pos.Y)<br />
Case state.Hot<br />
g.DrawImage(bimagelist.Images(1), pos.X, pos.Y)<br />
Case state.Normal<br />
g.DrawImage(bimagelist.Images(0), pos.X, pos.Y)<br />
Case state.Pushed<br />
g.DrawImage(bimagelist.Images(2), pos.X, pos.Y)<br />
End Select<br />
ElseIf bimagelist.Images.Count > 0 And bimagelist.Images.Count <> 4 Then<br />
g.DrawImage(bimagelist.Images(0), pos.X, pos.Y)<br />
End If<br />
End If<br />
End If<br />
g.Dispose()<br />
ReleaseDC(Me.Handle.ToInt32(), hDC.ToInt32())<br />
Case FormBorderStyle.None<br />
'draw nothing because their is not title bar to draw to<br />
Case Else<br />
hDC = g.GetHdc<br />
'regular size caption button<br />
If bhelpbutton = True Then<br />
Select Case state<br />
Case state.Normal<br />
drawThemeBackground(windowTheme, hDC, 23, 1, New RECT(New Rectangle(pos.X, pos.Y, btn_width, btn_height)), IntPtr.Zero)<br />
Case state.Hot<br />
drawThemeBackground(windowTheme, hDC, 23, 2, New RECT(New Rectangle(pos.X, pos.Y, btn_width, btn_height)), IntPtr.Zero)<br />
Case state.Pushed<br />
drawThemeBackground(windowTheme, hDC, 23, 3, New RECT(New Rectangle(pos.X, pos.Y, btn_width, btn_height)), IntPtr.Zero)<br />
Case state.Disabled<br />
drawThemeBackground(windowTheme, hDC, 23, 4, New RECT(New Rectangle(pos.X, pos.Y, btn_width, btn_height)), IntPtr.Zero)<br />
End Select<br />
ElseIf bimageonly = False Then<br />
Select Case state<br />
Case state.Normal<br />
drawThemeBackground(windowTheme, hDC, 15, 1, New RECT(New Rectangle(pos.X, pos.Y, btn_width, btn_height)), IntPtr.Zero)<br />
Case state.Hot<br />
drawThemeBackground(windowTheme, hDC, 15, 2, New RECT(New Rectangle(pos.X, pos.Y, btn_width, btn_height)), IntPtr.Zero)<br />
Case state.Pushed<br />
drawThemeBackground(windowTheme, hDC, 15, 3, New RECT(New Rectangle(pos.X, pos.Y, btn_width, btn_height)), IntPtr.Zero)<br />
Case state.Disabled<br />
drawThemeBackground(windowTheme, hDC, 15, 4, New RECT(New Rectangle(pos.X, pos.Y, btn_width, btn_height)), IntPtr.Zero)<br />
End Select<br />
End If<br />
ReleaseDC(Me.Handle.ToInt32(), hDC.ToInt32())<br />
hDC = New IntPtr(GetWindowDC(parent.Handle.ToInt32))<br />
g = Graphics.FromHdc(hDC) 'm.HWnd));<br />
If bhelpbutton = False Then<br />
If Not bimagelist Is Nothing Then<br />
'offset x, y values to center image in button<br />
pos.Offset(Math.Sqrt(btn_width) - 1, Math.Sqrt(btn_height) - 1)<br />
If bimagelist.Images.Count = 1 Then<br />
If state <> state.Disabled Then<br />
g.DrawImage(bimagelist.Images(0), pos.X, pos.Y)<br />
Else<br />
ControlPaint.DrawImageDisabled(g, bimagelist.Images(0), pos.X, pos.Y, Color.Transparent)<br />
End If<br />
ElseIf bimagelist.Images.Count = 4 Then<br />
Select Case state<br />
Case state.Disabled<br />
g.DrawImage(bimagelist.Images(3), pos.X, pos.Y)<br />
Case state.Hot<br />
g.DrawImage(bimagelist.Images(1), pos.X, pos.Y)<br />
Case state.Normal<br />
g.DrawImage(bimagelist.Images(0), pos.X, pos.Y)<br />
Case state.Pushed<br />
g.DrawImage(bimagelist.Images(2), pos.X, pos.Y)<br />
End Select<br />
ElseIf bimagelist.Images.Count > 0 Then<br />
g.DrawImage(bimagelist.Images(0), pos.X, pos.Y)<br />
End If<br />
End If<br />
End If<br />
g.Dispose()<br />
ReleaseDC(Me.Handle.ToInt32(), hDC.ToInt32())<br />
End Select<br />
System.GC.GetTotalMemory(True)<br />
End Sub 'DrawButton
|