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);
}

08-27 01:52