PolyBtn,一個多邊形按鈕類
介紹
CPolyBtn是一個簡單的CButton衍生工具,允許你建立按鈕,不是矩形或圓形或任何其他典型的幾何形狀;使用CPolyBtn,您可以通過提供一系列定義多邊形的點來指定按鈕形狀。
它能做些什麼呢?
CPolyBtn做所有正常按鈕的事情:翻轉,點陣圖,工具提示,焦點顏色,填充顏色,禁用顏色,等等。
我怎麼使用它?
你在對話方塊上建立一個按鈕,然後建立一個CPolyBtn型別的成員變數。你知道,標準的東西。然後,在CDialog的InitInstance中,在呼叫CDialog::InitInstance之前,建立CPoint物件的std::vector,每個多邊形點一個,這些點按順時針順序排列,然後將這個向量分配給CPolyBtn。CPolyBtn將確定每條邊的高亮和陰影顏色,設定區域並處理其他一切。
// make a triangle button std::vector<CPoint> pts; const int triEdgeSize = 16; pts.push_back(CPoint(0,0)); pts.push_back(CPoint(triEdgeSize,0)); pts.push_back(CPoint(0,triEdgeSize)); m_zoomInBtn.SetPoints(pts); m_zoomInBtn.SetBMPOffset(2,2); m_zoomInBtn.SetBMPID(IDB_ZOOM_IN, RGB(255,255,255), IDB_ZOOM_IN_DISABLED, RGB(255,255,255));
此時,您還可以新增點陣圖、設定文字位置等。
對於那些需要控制的使用者,CPolyBtn還提供了一種方法來手動指定每條邊的顏色(普通的、高亮的、聚焦的、禁用的等等)。當然,這種方法需要更多的工作。但如果你需要這麼大的控制權,還有一個選擇。
其他選項
隱藏,複製程式碼// optionally set the colors used. void SetColors(COLORREF highlight, COLORREF down, COLORREF focus, COLORREF disabled, COLORREF rollover); //set the color to fill with. default ::GetSysColor(COLOR_BTNFACE); void SetFillColor(COLORREF fillClr); // draw bitmap at this offset void SetBMPOffset(int x, int y); // draw window text at this offset void SetTextOffset(int x, int y); // optional tooltip void SetTooltipText(LPCTSTR lpszText, BOOL bActivate = TRUE); void ActivateTooltip(BOOL bEnable = TRUE); // when using the SetPoints method, you can decide to highlight lines // that are more than -45 degrees below horizontal (default false) void AllowHighlightOnGtrNeg45(bool b); // should the button change color when the mouse moves over ? (default false) void AllowRollover(bool b);
問題
一般來說,我不太喜歡畫邊的方式。因為沒有縮小多邊形的好方法,所以很難像普通的按鈕那樣畫出按鈕的邊緣,因為按鈕的邊緣實際上是兩條平行線,但顏色不同。所以,這裡的邊總是一個畫素寬。這個問題的另一個例子是在“焦點”渲染中:通常,按鈕焦點是通過在邊框內繪製一個虛線矩形來表示的。但是,由於沒有簡單的方法來確定“內部”對所有任意多邊形意味著什麼,CPolyBtn就不麻煩了;它通過使用PS_DOT鋼筆樣式繪製邊緣來處理焦點。(當然,有很多複雜的方法可以找到一個多邊形的內部,但這比我想要做的更多,而且我也不需要它)。
無論如何……
如果你有任何改進,歡迎分享!
記住,要善待對方。
歷史
- 2003年2月24日:初始版本
許可證
本文沒有附帶明確的許可,但可能包含文章文字或下載檔案本身的使用條款。如果有疑問,請通過下面的討論區聯絡作者。可以在這裡找到作者可能使用的許可證列表。
本文轉載於:http://www.diyabc.com/frontweb/news13967.html