2013-04-03 113 views
3

我被WinAPI的C++ 學習繪製形狀我試圖上WM_PAINT繪製2橢圓一些代碼:繪製形狀在WinAPI的C++

PAINTSTRUCT ps; 
HDC hdc = BeginPaint(hWnd, &ps); 
HPEN hPen = CreatePen(PS_DASHDOTDOT, 2, NULL);SelectObject(hdc, hPen); 
Ellipse(hdc, 100, 200, 400, 400); 
Ellipse(hdc, 300, 300, 500, 510); 

DeleteObject(hPen); 
EndPaint(hWnd, &ps); 

但輸出是:

enter image description here 結果我期望的是既不是形狀是對方的前面。邊界是點劃線。 任何人都可以告訴我我的錯誤嗎?我很感謝你的幫助。

+1

如果將寬度從2更改爲1,則您的虛線可能會奇蹟般地出現。從['CreatePen()'](http://msdn.microsoft.com/zh-cn/library/windows/desktop/ dd183509(v = vs.85).aspx)documentation:「如果由nWidth指定的值大於1,則fnPenStyle參數必須爲PS_NULL,PS_SOLID或PS_INSIDEFRAME。」 PS_DASHDOTDOT描述進一步說明了這一點:「筆具有交替的破折號和雙點,這種樣式僅在筆寬等於或小於設備單位時纔有效。」關於透明度,考慮一下NULL筆刷。 – WhozCraig

+0

@WhozCraig:非常感謝。我懂了。但是有沒有什麼方法可以讓短劃線更寬?並可以繪製兩種形狀相互重疊,但保持2個形狀的邊界? – suti

+0

自從我使用GDI繪圖以來,它已經過去了十多年。我需要一段時間才能回到它。同心橢圓可能是您在較粗線條(一個在另一個內部繪製)中最好的選擇。對於重疊區域,這需要我花一分鐘來刷新我的頭腦。也許是一個地區。 – WhozCraig

回答

3

Ellipse()(與所有GDI形狀函數一樣)使用當前畫筆填充形狀,這就是爲什麼您的輸出看起來像這樣。有關詳情,請參見setting pen and brush colors

如果你只想要一個無填充的橢圓,先選擇一個空刷:

SelectObject(hdc, GetStockObject(NULL_BRUSH));

3

一個出現在另一個的上面,因爲你不只是畫輪廓,卻盡顯其作爲好。要停止填充它,您可以選擇一個「空心筆刷」,有時稱爲「空筆刷」。

HBRUSH hbrOld = SelectObject(hdc, GetStockObject(HOLLOW_BRUSH)); 
// draw your ellipses here 

只能創建點或虛線筆與widths of 1 or 0。你用了2,所以命令失敗了。

另外,在刪除DC之前,您應該從DC中選擇筆。

+0

非常感謝。現在正在工作。 – suti