PolyBtn,一个多边形按钮类

Sample Image - polybtn.gif

介绍

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

原文地址:https://www.cnblogs.com/Dincat/p/13485124.html