2013-11-23 42 views
2

Win32 GDI DrawFocusRect(HDC, const RECT*)函数在所需的devince上下文中绘制矩形的虚线轮廓。这个功能很酷的事情是这样,当你把它称为第二次在同一设备上下文和矩形,它会清除自身使用XOR函数绘制点:是否有可能创建一个像DrawFocusRect()的XOR笔?

RECT rc = { 0, 0, 100, 100 }; 
DrawFocusRect(hdc, &rc); // draw rectangle 
DrawFocusRect(hdc, &rc); // erase the rectangle we just drew 

我想达到相同点线效应为DrawFocusRect()但我只想要一条线,而不是一个完整的矩形。我试图通过将高度为RECTRECT传递给DrawFocusRect()但这不起作用,因为它将rectange的“底线”异或在顶线上,所以没有任何东西被绘制。

我可以创建一个与DrawFocusRect()达到相同效果的普通HPEN,因此我可以绘制一条线吗?

+1

['SetROP2'(http://msdn.microsoft.com/en-us/library/windows/desktop/dd145088.aspx)用'R2_XORPEN'当与其他线绘制API一起使用时,drawmode应该达到相同的效果。 – IInspectable

+0

非常感谢@IInspectable。任何想法用什么系统颜色绘制焦点矩形?我想尽可能使用同一个... – 0xbe5077ed

回答

2

作为@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); 
} 
+0

只是一个小小的评论:HDC应该作为第一个参数传递给SetROP2 – AntonK

相关问题