我正在使用股票Trackbar控件。我想自定义刻度线。
我在这里做了一个实验,只是试图在正确的位置绘制:
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
,则更新rect(NMCUSTOMDRAW->rc
)始终为空rect。我检查了一下,对于其他项(TBCD_CHANNEL
和TBCD_THUMB
),我得到了一个有效的矩形,可以代替通道和拇指来绘制。
好:TBCD_TICS
的意义何在?
所以也许我可以通过其他方式获得报价位置。好吧,这里有TBM_GETTICPOS,似乎可以使用。除了文档中提到的内容:
第一个和最后一个刻度线的位置无法通过此消息直接获得。
那么我如何获得第一个和最后一个刻度位置?它们与通道的开始和结束不对应,刻度线略微插入。也许我们可以从通道的侧面计算出插入量,但这似乎很脆弱(尤其是在缩放比例不同的显示器上)。
答案 0 :(得分:3)
那我如何获得第一个和最后一个刻度位置?
获取它们的旧方法(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);