2013-11-23 44 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

相關問題