【问题标题】:Is it possible to create an XOR pen like DrawFocusRect()?是否可以创建像 DrawFocusRect() 这样的 XOR 笔?
【发布时间】:2013-12-08 15:45:05
【问题描述】:

Win32 GDI DrawFocusRect(HDC, const RECT*) 函数在所需的设备上下文上绘制矩形的虚线轮廓。这个函数很酷的地方在于它使用 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,这样我就可以只画一条线?

【问题讨论】:

  • SetROP2R2_XORPEN 绘图模式在与其他线条绘制 API 一起使用时应该达到相同的效果。
  • 非常感谢@IInspectable。知道使用什么系统颜色来绘制焦点矩形吗?如果可能的话,我想使用相同的...

标签: c winapi gdi


【解决方案1】:

正如@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);
}

【讨论】:

  • 只是一个小提示:HDC应该作为第一个参数传递给SetROP2
猜你喜欢
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多