是否可以像DrawFocusRect()那样创建一个XOR笔?

时间:2013-11-23 20:08:19

标签: c winapi gdi

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,这样我只能绘制一行吗?

1 个答案:

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