首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SysTabControl32的WM_DRAWITEM是否已覆盖?

SysTabControl32的WM_DRAWITEM是否已覆盖?
EN

Stack Overflow用户
提问于 2019-04-25 21:23:31
回答 1查看 200关注 0票数 0

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

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2019-11-17 16:22:44

这是我自定义绘制SysTabControl32的诀窍

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55850330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档