我必须重新设计我们的 SysTabControl32,所以我尝试使用 TCS_OWNERDRAWFIXED 和 WM_DRAWITEM。一切正常,但似乎选项卡仍然被系统覆盖。
不幸的是,代码在可视对象中,这使事情变得更加复杂。在过去的几个小时里,我已经尝试了很多东西,暂时我一无所知。也许你们中的一些人可以提供帮助或给我一个提示。
这里有一些图片:
带有 TCS_OWNERDRAWFIXED 的“裸”选项卡控件。WM_DRAWITEM 处没有代码。
您会注意到选项卡未填充,但 3D 样式已绘制。这是我的主要问题,因为只要我知道这不应该发生。
带有文本和背景颜色的 Ownerdrawn 选项卡(丑陋但对查看问题很有用)
相同的 TabControl,但设置了 TCS_FLATBUTTONS 和 TCS_EX_FLATSEPARATORS。仍然是灰色背景的问题。
如您所知,WM_DRAWITEM 将在父窗口中捕获。我还尝试在 TabControl 本身中覆盖或忽略 WM_PAINT。但这无济于事。
我也玩过 WM_ERASEBKGND,但我被困在这一点上。
在从 codeplex 到 codeguru 甚至 vbAccelerator 的所有页面上,它都应该可以工作。应该:)不知道它是否是视觉对象,但API是API,这仍然是一个标准控件。
WM_DRAWITEM 包含此代码,看起来还可以。项目是 DRAWITEMSTRUCT。
hdc := item.hdc
tabIndex := item.itemID
lSelected := (item.itemState == ODS_SELECTED)
wBrush := CreateSolidBrush(RGB(128,128,255))
FillRect(hdc, @item.rcItem, wBrush)
DeleteObject(wBrush)
SetBkMode(hdc,TRANSPARENT)
tTI := MemAlloc(_SizeOf(_winTC_ITEM))
tTI.cchTextMax := 255
tTI.pszText := String2Psz(Buffer(255))
tTI.mask := TCIF_TEXT
lr := SendMessage(item.hwndItem, TCM_GETITEM, item.itemID, LONG(_CAST, tTI))
if (lr != 0)
if (lSelected)
SetTextColor(hdc,RGB(255,0,0))
ELSE
SetTextColor(hdc,RGB(0,0,255))
ENDIF
DrawText(hdc,tTI.pszText,-1,@item.rcItem, _OR(DT_SINGLELINE, DT_VCENTER, DT_CENTER))
ENDIF
MemFree(tTI)