The OwnerDrawHandler interface provides an elegant way to let user paints the cell. The CellOwnerDraw property requires an object that implements the OwnerDrawHandler interface. Use the Def(exCellOwneDraw) property to assign an owner draw object for the entire column. The control calls DrawCell method when an owner draw cell requires painting. The inteface definition is like follows:
[ uuid(BA219E1D-D1CD-4682-81AA-7E1D9D37B187), pointer_default(unique) ] interface IOwnerDrawHandler : IUnknown { [id(1), helpstring("The source paints the cell.")] HRESULT DrawCell( long hDC, long left, long top, long right, long bottom, long Item, long Column, IDispatch* Source ); [id(2), helpstring("The source erases the cell's background.")] HRESULT DrawCellBk( long hDC, VARIANT* Options, long left, long top, long right, long bottom, long Item, long Column, IDispatch* Source ); }
Use the DrawCellBk method to erase the cell's background. The DrawCell method is called before painting the cell's caption.
The following sample shows how to paint a gradient color into the cells:
Option Explicit Implements IOwnerDrawHandler Private Type RECT left As Long top As Long right As Long bottom As Long End Type Private Const ETO_OPAQUE = 2 Private Declare Sub InflateRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal Y As Long) Private Declare Function ExtTextOut Lib "gdi32" Alias "ExtTextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long, ByVal wOptions As Long, lpRect As RECT, ByVal lpString As String, ByVal nCount As Long, lpDx As Long) As Long Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long Private Declare Function OleTranslateColor Lib "olepro32" (ByVal c As Long, ByVal p As Long, c As Long) As Long Private Const DT_VCENTER = &H4 Private Const DT_CENTER = &H1 Private Const DT_WORDWRAP = &H10 Private Sub DrawGradient(ByVal hdc As Long, ByVal left As Long, ByVal top As Long, ByVal right As Long, ByVal bottom As Long, ByVal c1 As Long, ByVal c2 As Long) On Error Resume Next Dim x As Long, rg, gg, bg, r1, r2, g1, g2, b1, b2 Dim rc As RECT With rc .left = left .right = right .top = top .bottom = bottom End With OleTranslateColor c1, 0, c1 OleTranslateColor c2, 0, c2 r1 = c1 Mod 256 r2 = c2 Mod 256 b1 = Int(c1 / 65536) b2 = Int(c2 / 65536) g1 = Int(c1 / 256) Mod 256 g2 = Int(c2 / 256) Mod 256 For x = left To right Step 2 rc.left = x SetBkColor hdc, RGB(r1 + (x - left) * (r2 - r1) / (right - left), g1 + (x - left) * (g2 - g1) / (right - left), b1 + (x - left) * (b2 - b1) / (right - left)) ExtTextOut hdc, rc.left, rc.top, ETO_OPAQUE, rc, " ", 1, x Next End Sub Private Sub Form_Load() With Grid1 .BeginUpdate .LinesAtRoot = False .SortOnClick = False .MarkTooltipCells = True .ShowFocusRect = False .MarkSearchColumn = False .ShowFocusRect = True .ColumnAutoResize = True .BackColor = vbWhite .SelBackColor = vbWhite .SelForeColor = vbBlue Set .Picture = LoadPicture(App.Path + "\exontrol.gif") .PictureDisplay = LowerRight .SelBackMode = exTransparent .SelBackColor = vbWhite ' Adds few columns With .Columns .Add("Name").Width = 242 With .Add("Description") .Width = 356 .HeaderImage = 2 .Editor.EditType = MemoType .Editor.Appearance = RaisedApp End With End With ' Adds few items With .Items Dim h As HITEM, h2 As HITEM, h3 As HITEM h = .AddItem("My Desktop") .CellBold(h, 0) = True ' Defines the cell that becomes the title for the divider .ItemHeight(h) = .ItemHeight(h) + 4 .ItemDivider(h) = 0 .CellBackColor(h) = &HFF6531 .ItemForeColor(h) = vbWhite .ItemDividerLine(h) = EmptyLine Set .CellOwnerDraw(h, 0) = Me h2 = .InsertItem(h, , "Hard Disk Drives") .CellBold(h2, 0) = True .ItemDivider(h2) = 0 .ItemDividerLine(h2) = DotLine .CellBackColor(h2) = vbBlue .ItemHeight(h2) = .ItemHeight(h2) + 4 .CellForeColor(h2, 0) = &HFF6531 .CellForeColor(h2, 0) = vbWhite Set .CellOwnerDraw(h2, 0) = Me h3 = .InsertItem(h2, , "Scratch (C:)" & vbCrLf & "1.95 GB" & vbCrLf) .CellPicture(h3, 0) = LoadPicture(App.Path + "\hard.gif") .CellSingleLine(h3, 0) = False .CellValue(h3, 1) = "You can add hardware devices to your Windows CE–based target platform that are not directly supported by Windows CE. However, if you do, you must supply device drivers for the additional devices." .CellSingleLine(h3, 1) = False .CellToolTip(h3, 0) = "This is a bit of text that shoud appear when the cursor is over a cell." h3 = .InsertItem(h2, , "Main (E:)" & vbCrLf & "15 GB" & vbCrLf) .CellPicture(h3, 0) = LoadPicture(App.Path + "\hard.gif") .CellForeColor(h3, 0) = RGB(128, 128, 128) .CellSingleLine(h3, 0) = False .CellValue(h3, 1) = "Windows CE versions 1.01 and later provide kernel support to enable stream interface drivers to access additional built-in hardware devices." .CellSingleLine(h3, 1) = False .CellBackColor(h3, 1) = RGB(196, 196, 196) .CellForeColor(h3, 1) = vbBlack Set .CellOwnerDraw(h3, 1) = Me .ExpandItem(h2) = True h2 = .InsertItem(h, , "Devices with Removable Storage") .CellBold(h2, 0) = True .ItemDivider(h2) = 0 .ItemDividerLine(h2) = DotLine .CellBackColor(h2) = vbBlue .ItemHeight(h2) = .ItemHeight(h2) + 4 .CellForeColor(h2, 0) = vbWhite Set .CellOwnerDraw(h2, 0) = Me h3 = .InsertItem(h2, , vbCrLf & "3½ Floppy (A:)" & vbCrLf) .CellPicture(h3, 0) = LoadPicture(App.Path + "\floppy.gif") .CellSingleLine(h3, 0) = False With .CellEditor(h3, 1) .EditType = ColorType End With .CellValue(h3, 1) = .CellBackColor(.ItemParent(h3), 0) .CellData(h3, 1) = True h3 = .InsertItem(h2, , vbCrLf & "CD Reader" & vbCrLf) .CellPicture(h3, 0) = LoadPicture(App.Path + "\floppy.gif") .CellSingleLine(h3, 0) = False With .CellEditor(h3, 1) .EditType = ColorType End With .CellValue(h3, 1) = .CellBackColor(.ItemParent(h3), 0) .CellData(h3, 1) = True .ExpandItem(h2) = True .ExpandItem(h) = True h = .AddItem("Folder Options") .CellBold(h, 0) = True .ItemDivider(h) = 0 .CellBackColor(h) = &HFF6531 .ItemForeColor(h) = vbWhite .ItemHeight(h) = .ItemHeight(h) + 4 Set .CellOwnerDraw(h, 0) = Me h2 = .InsertItem(h, , "Web View") .CellImage(h2, 0) = 2 .CellBold(h2, 0) = True .ItemDivider(h2) = 0 .ItemDividerLine(h2) = DotLine .ItemHeight(h2) = .ItemHeight(h2) + 4 .CellForeColor(h2, 0) = vbWhite .CellBackColor(h2) = vbBlue Set .CellOwnerDraw(h2, 0) = Me h3 = .InsertItem(h2, , "Enable Web content in folders") .CellHasRadioButton(h3, 0) = True .CellImage(h3, 0) = 1 .CellRadioGroup(h3, 0) = 1234 .CellState(h3, 0) = 1 .CellEditorVisible(h3, 1) = False h3 = .InsertItem(h2, , "Use Windows Classic folders") .CellHasRadioButton(h3, 0) = True .CellRadioGroup(h3, 0) = 1234 .CellImage(h3, 0) = 2 .CellEditorVisible(h3, 1) = False .ExpandItem(h2) = True .ExpandItem(h) = True End With .EndUpdate End With End Sub Private Sub Grid1_Change(ByVal Item As EXGRIDLibCtl.HITEM, ByVal ColIndex As Long, NewValue As Variant) With Grid1.Items If .CellData(Item, ColIndex) Then .CellBackColor(.ItemParent(Item), 0) = NewValue End If End With End Sub Private Sub IOwnerDrawHandler_DrawCellBk(ByVal hDC As Long, Options As Variant, ByVal left As Long, ByVal top As Long, ByVal right As Long, ByVal bottom As Long, ByVal Item As Long, ByVal Column As Long, ByVal Source As Object) End Sub Private Sub IOwnerDrawHandler_DrawCell(ByVal hdc As Long, ByVal left As Long, ByVal top As Long, ByVal right As Long, ByVal bottom As Long, ByVal Item As Long, ByVal Column As Long, ByVal Source As Object) With Source.Items ' Draws the background cell by gradient DrawGradient hdc, left, top, right / 2, bottom, vbWhite, .CellBackColor(Item, Column) DrawGradient hdc, right / 2, top, right, bottom, .CellBackColor(Item, Column), vbWhite ' Gets the caption cell Dim str As String str = .CellValue(Item, Column) ' Draws the caption cell Dim rc As RECT With rc .left = left .right = right .top = top .bottom = bottom End With SetTextColor hdc, .CellForeColor(Item, Column) rc.top = rc.top + 2 DrawText hdc, str, Len(str), rc, DT_CENTER Or DT_WORDWRAP End With End Sub
The following sample erase the cell's background, but let the control paints the cell's content:
Implements IOwnerDrawHandler Private Declare Function MoveToEx Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal Y As Long, lpPoint As POINTAPI) As Long Private Declare Function LineTo Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal Y As Long) As Long Private Type RECT left As Long top As Long right As Long bottom As Long End Type Private Const ETO_OPAQUE = 2 Private Declare Sub InflateRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal Y As Long) Private Declare Function ExtTextOut Lib "gdi32" Alias "ExtTextOutA" (ByVal hDC As Long, ByVal x As Long, ByVal Y As Long, ByVal wOptions As Long, lpRect As RECT, ByVal lpString As String, ByVal nCount As Long, lpDx As Long) As Long Private Declare Function SetBkColor Lib "gdi32" (ByVal hDC As Long, ByVal crColor As Long) As Long Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hDC As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long Private Declare Function SetTextColor Lib "gdi32" (ByVal hDC As Long, ByVal crColor As Long) As Long Private Declare Function OleTranslateColor Lib "olepro32" (ByVal c As Long, ByVal p As Long, c As Long) As Long Private Const DT_VCENTER = &H4 Private Const DT_CENTER = &H1 Private Const DT_WORDWRAP = &H10 Private Const DT_SINGLELINE = &H20 Private Type POINTAPI x As Long Y As Long End Type Private Sub DrawGradient(ByVal hDC As Long, ByVal left As Long, ByVal top As Long, ByVal right As Long, ByVal bottom As Long, ByVal c1 As Long, ByVal c2 As Long) On Error Resume Next Dim x As Long, rg, gg, bg, r1, r2, g1, g2, b1, b2 Dim rc As RECT With rc .left = left .right = right .top = top .bottom = bottom End With OleTranslateColor c1, 0, c1 OleTranslateColor c2, 0, c2 r1 = c1 Mod 256 r2 = c2 Mod 256 b1 = Int(c1 / 65536) b2 = Int(c2 / 65536) g1 = Int(c1 / 256) Mod 256 g2 = Int(c2 / 256) Mod 256 For x = left To right Step 2 rc.left = x SetBkColor hDC, RGB(r1 + (x - left) * (r2 - r1) / (right - left), g1 + (x - left) * (g2 - g1) / (right - left), b1 + (x - left) * (b2 - b1) / (right - left)) ExtTextOut hDC, rc.left, rc.top, ETO_OPAQUE, rc, " ", 1, x Next End Sub Private Sub Form_Load() With Grid1.Items Set .CellOwnerDraw(.FindItem("Root 2"), 0) = Me End With End Sub Private Sub IOwnerDrawHandler_DrawCell(ByVal hDC As Long, ByVal left As Long, ByVal top As Long, ByVal right As Long, ByVal bottom As Long, ByVal Item As Long, ByVal Column As Long, ByVal Source As Object) End Sub Private Sub IOwnerDrawHandler_DrawCellBk(ByVal hDC As Long, Options As Variant, ByVal left As Long, ByVal top As Long, ByVal right As Long, ByVal bottom As Long, ByVal Item As Long, ByVal Column As Long, ByVal Source As Object) Dim c1 As Long, c2 As Long, c As Long c1 = Source.BackColor c2 = Source.SelBackColor DrawGradient hDC, left, top, (right + left) / 2, bottom, c1, c2 DrawGradient hDC, (right + left) / 2, top, right, bottom, c2, c1 End Sub
Name | Description |