Win32 GDI DrawFocusRect(HDC, const RECT*)
函数在所需的devince上下文中绘制矩形的虚线轮廓。关于这个函数很酷的是它使用XOR函数绘制点,这样当你在同一设备上下文和矩形上再次调用它时,它会自行删除:
RECT rc = { 0, 0, 100, 100 };
DrawFocusRect(hdc, &rc); // draw rectangle
DrawFocusRect(hdc, &rc); // erase the rectangle we just drew
我希望获得与DrawFocusRect()
相同的虚线效果,但我只想要一条线,而不是整个矩形。我尝试通过将RECT
的高度1传递给DrawFocusRect()
来做到这一点,但这不起作用,因为它在顶行的顶部对矩形的“底线”进行异或,因此没有任何颜色被绘制。 / p>
我可以创建一个与DrawFocusRect()
达到相同效果的普通HPEN,这样我只能绘制一行吗?
答案 0 :(得分:3)
如@IInspectable所评论,您想使用SetROP2()
。另一半的战斗是创造正确的笔。以下是整个事情的震撼:
HPEN create_focus_pen()
{
LONG width(1);
SystemParametersInfo(SPI_GETFOCUSBORDERHEIGHT, 0, &width, 0);
LOGBRUSH lb = { }; // initialize to zero
lb.lbColor = 0xffffff; // white
lb.lbStyle = BS_SOLID;
return ExtCreatePen(PS.GEOMETRIC | PS.DOT, width, &lb, 0, 0);
}
void draw_focus_line(HDC hdc, HPEN hpen, POINT from, POINT to)
{
HPEN old_pen = SelectObject(hdc, hpen);
int old_rop = SetROP2(R2_XORPEN);
MoveToEx(hdc, from.x, from.y, nullptr);
LineTo(hdc, to.x, to.y);
SelectObject(hdc, old_pen);
SetROP2(old_rop);
}