自定义轨迹栏刻度
Custom trackbar ticks
我正在使用库存 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
,则更新矩形 (NMCUSTOMDRAW->rc
) 始终为空矩形。我检查了,对于其他项目(TBCD_CHANNEL
和 TBCD_THUMB
),我得到了一个有效的矩形并且可以代替通道和拇指绘制。
好的:如果 TBCD_TICS
没有给我一个可以绘制的矩形,那么它有什么意义呢?
也许我可以通过其他方式获得刻度位置。好吧,有 TBM_GETTICPOS,这似乎可行。除了文档提到这个:
The positions of the first and last tick marks are not directly available via this message.
那么我怎样才能得到第一个和最后一个报价位置呢?它们与通道的开始和结束不对应,刻度略微嵌入。也许我们可以从通道的两侧计算插入,但这似乎很脆弱(尤其是在不同比例的显示器上)。
So how can I get the first and last tick positions?
获取它们的旧方法(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);
我正在使用库存 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
,则更新矩形 (NMCUSTOMDRAW->rc
) 始终为空矩形。我检查了,对于其他项目(TBCD_CHANNEL
和 TBCD_THUMB
),我得到了一个有效的矩形并且可以代替通道和拇指绘制。
好的:如果 TBCD_TICS
没有给我一个可以绘制的矩形,那么它有什么意义呢?
也许我可以通过其他方式获得刻度位置。好吧,有 TBM_GETTICPOS,这似乎可行。除了文档提到这个:
The positions of the first and last tick marks are not directly available via this message.
那么我怎样才能得到第一个和最后一个报价位置呢?它们与通道的开始和结束不对应,刻度略微嵌入。也许我们可以从通道的两侧计算插入,但这似乎很脆弱(尤其是在不同比例的显示器上)。
So how can I get the first and last tick positions?
获取它们的旧方法(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);