0

我必须重新设计我们的 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)
4

1 回答 1

1

这是我自定义绘制 SysTabControl32 的技巧

RECT defaultRect = lpDrawItemStruct->rcItem;
//
// Begin of WM_DRAWITEM, we clear the clip rect
SelectClipRgn(lpDrawItemStruct->hDC, NULL);
..
..
..
// End of WM_DRAWITEM, we create a clip rect to disable default system border
ExcludeClipRect(lpDrawItemStruct->hDC, 
        defaultRect.left - 3,
        defaultRect.top - 2,
        defaultRect.right + 3,
        defaultRect.bottom + 2);

参考: https ://github.com/pladaria/emule/blob/master/srchybrid/ClosableTabCtrl.cpp

于 2019-11-17T08:22:44.367 回答