我必须重新设计我们的SysTabControl32,所以我尝试使用TCS_OWNERDRAWFIXED和WM_DRAWITEM。一切运行正常,但系统似乎仍覆盖Tabs。
不幸的是,代码是在Visual Objects中,这使得事情变得更加复杂。在过去的几个小时里,我已经尝试了很多东西,现在我还是一窍不通。也许你们中的一些人能帮上忙或者给妈妈一点提示。
以下是一些图片:
“裸体”选项卡控件与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)发布于 2019-11-17 16:22:44
这是我自定义绘制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
https://stackoverflow.com/questions/55850330
复制相似问题