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()
相同的虚线效果,但我只想一条线,而不是整个矩形。我尝试通过将高度为1的RECT
传递给DrawFocusRect()
来执行此操作,但这不起作用,因为它会将矩形的“底线”与顶线顶部异或,因此不会被绘制。是否可以创建与
DrawFocusRect()
效果相同的普通HPEN,以便仅画一条线? 最佳答案
正如@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);
}