C++Builder中异形按钮的实现
“异形”按钮很是有趣,就是按钮的形状不是尺度的长方形或正方形,而有一丝“叛变”——“异形”嘛,是不是?奈何才气实现“异形”按钮呢?由于Window 95增加了对窗口区域观念的支持,使得窗口区域就是所界说的窗口看上去的形状,窗口区域作为窗口的实际界线区域,这样窗口区域不只界说了窗口的可画区域,并且界说了窗口下隐含区域和响应鼠标击键事件的响应窗口区域。
按钮的各类形状是在运行时配置的而不是在设计时配置。设计时按钮的形状仍然是长方形或正方形。
按钮形状的设计分成两个步调:
第一步建设按钮的外形,即界说窗口区域。利用API的区域建设函数就可到达目标。区域建设函数许多,主要有CreateEllipticRgn 、CreatePolygonRgn、 CreateRectRgn、 CreateRoundRectRgn,用于建设差异范例的区域显示。假如需要一个巨大区域形状,那么可以别离利用差异的区域函数建设差异的区域,然后挪用CombineRgn API函数把它们组合起来。所以说,不只可以建设出圆形、三角形的按钮,并且还可以建设出其它各类形状的按钮。
第二步将区域显示应用到窗口上。一旦利用区域函数建设了一个新的区域显示,就可以利用SetWindowsRgn函数将这个区域应用到窗口上。
下面给出圆形、三角形按钮实现的详细代码。为了直观显示结果,将窗体的配景致配置为了玄色(Color配置为clBtnText),并将两个按钮的Cursor配置crCross。在窗体安排两个Button按钮,别离界说为RButton、TButton。实现窗口区域的最佳机缘是在窗体首次建设时,所以将处理惩罚措施放在OnCreate事件中。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//建设园形按钮
HRGN hRgnR = CreateEllipticRgn(0,0,RButton→
Width,RButton→Height);
SetWindowRgn(RButton→Handle,hRgnR,TRUE);
//建设三角形按钮
TrPoint[0].x=TButton→Width/2;
TrPoint[0].y=0;
TrPoint[1].x=0;
TrPoint[1].y=TButton→Height;
TrPoint[2].x=TButton→Width;
TrPoint[2].y=TButton→Height;
HRGN hRgnT = CreatePolygonRgn(TrPoint,3,ALTERNATE);
SetWindowRgn(TButton→Handle,hRgnT,TRUE);
}
个中TrPoint在Unit.h头文件中界说如下:
private: // User declarations
POINT TrPoint[3];
上面的代码在按钮的界线内别离建设了一个园形区域和一个三角形区域,然后作为新的窗口区域把它赋给各自的按钮。在建设园形按钮时利用了椭圆形区域建设函数,要使按钮为园形在设计时该按钮应设计为正方形。别的区域是以按钮坐标的形式界说的,而不是用屏幕坐标。(0,0)点是按钮的最左上角,而(宽,高)点是按钮的最右下角。
应该留意的是,一旦将区域句柄赋给按钮,就不能再对区域句柄作任何操纵。假如将区域句柄赋给按钮后,修改或删除这个句柄将导致措施瓦解,所以……千万不要这样做,不然,你的措施固然花哨了一些,但却是“拾了芝麻丢了西瓜”而因小失大!说到这里,我想,措施设计首先要留意“不变性”,至于其它的都次要。