我正在使用股票跟踪栏控件。我想自定义绘制刻度。
在这里,我做了一个实验,只是想画在正确的地方:
case WM_NOTIFY:
{
NMHDR* nMhdr = (NMHDR*) lParam;
NMCUSTOMDRAW* nMcd = (NMCUSTOMDRAW*) lParam;
if (nMhdr->code == NM_CUSTOMDRAW)
{
switch (nMcd->dwDrawStage)
{
case CDDS_PREPAINT:
{
return CDRF_NOTIFYITEMDRAW;
}
case CDDS_ITEMPREPAINT:
{
if (nMcd->dwItemSpec == TBCD_TICS)
{
FillRect(nMcd->hdc, &nMcd->rc, (HBRUSH) GetStockObject(BLACK_BRUSH));
return CDRF_SKIPDEFAULT;
}
else
{
return CDRF_DODEFAULT;
}
break;
}
default:
{
result = CDRF_DODEFAULT;
break;
}
}
}
break;
}
在我的CDDS_ITEMPREPAINT
中,如果dwItemSpec == TBCD_TICS
,那么更新矩形(NMCUSTOMDRAW->rc
)总是一个空的矩形。我检查了,对于其他项目(TBCD_CHANNEL
和TBCD_THUMB
),我得到了一个有效的矩形,可以绘制代替通道和拇指。
好的:那么,如果它没有给我一个矩形来绘制,那么TBCD_TICS
有什么意义呢?
所以也许我可以用另一种方式获得即时报价位置。嗯,有TBM_GETTICPOS,这似乎可以工作。除了文档提到这一点:
第一个和最后一个刻度线的位置不能通过此消息直接获得。
那么我怎样才能获得第一个和最后一个即时报价位置呢?它们与通道的开始和结束不对应,刻度略微内嵌。也许我们可以从通道的侧面计算插入,但这似乎很脆弱(尤其是在不同比例的显示器上)。
那么如何获得第一个和最后一个即时报价位置呢?
获取它们的旧方法(XP及更早版本)似乎仍然有效(我刚刚在Windows 10上进行了测试):
RECT rectTrackbar;
GetClientRect(hWndTB, &rectTrackbar);
RECT rectThumb;
SendMessage(hWndTB, TBM_GETTHUMBRECT, 0, (LPARAM)&rectThumb);
int nThumbWidth = rectThumb.right - rectThumb.left;
int nXTicFirst = rectTrackbar.left += (nThumbWidth + 2);
int nXTicLast = rectTrackbar.right -= (nThumbWidth + 2 + 1);