我正在使用库存的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
, ifdwItemSpec == TBCD_TICS
中,更新矩形 ( NMCUSTOMDRAW->rc
) 始终是一个空矩形。我检查了,对于其他项目(TBCD_CHANNEL
和TBCD_THUMB
),我得到了一个有效的矩形,并且可以代替通道和拇指进行绘制。
好的:那么,TBCD_TICS
如果它没有给我一个可以绘制的矩形,那有什么意义呢?
所以也许我可以通过另一种方式获得刻度位置。好吧,有TBM_GETTICPOS,这似乎可行。除了文档提到这一点:
第一个和最后一个刻度线的位置不能通过此消息直接获得。
So how can I get the first and last tick positions? They do not correspond with the start and end of the channel, the ticks are inset slightly. Perhaps we can calculate the insert from the sides of the channel, but that seems fragile (especially on differently scaled displays).