android 异形button,C++:C++Builder中异形按钮的实现

21428521970b596d3f8484d5e5339c84.png

“异形”按钮非常有趣,就是按钮的形状不是标准的长方形或正方形,而有一丝“叛逆”——“异形”嘛,是不是?怎样才能实现“异形”按钮呢?由于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)点是按钮的最左上角,而(宽,高)点是按钮的最右下角。

应该注意的是,一旦将区域句柄赋给按钮,就不能再对区域句柄作任何操作。如果将区域句柄赋给按钮后,修改或删除这个句柄将导致程序崩溃,所以……千万不要这样做,否则,你的程序虽然花哨了一些,但却是“拾了芝麻丢了西瓜”而因小失大!说到这里,考试大提示程序设计首先要注意“稳定性”,至于其它的都次要。

2829f2ca24f0d0090cbba57f30759f23.png

C++:C++Builder中异形按钮的实现.doc

下载Word文档到电脑,方便收藏和打印[全文共1271字]

编辑推荐:

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

下载Word文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用贪心算法实现异形排样的C++示例程序: ```cpp #include <iostream> #include <vector> #include <algorithm> struct Rect { int width; int height; bool isPlaced; // 是否已经放置 int x; // 左上角x坐标 int y; // 左上角y坐标 }; bool compareRect(const Rect& rect1, const Rect& rect2) { // 按照面积从大到小排序 return rect1.width * rect1.height > rect2.width * rect2.height; } bool doesFit(const Rect& rect, int x, int y, int width, int height) { // 检查物体是否适合给定的位置和大小 return (x + rect.width <= width) && (y + rect.height <= height); } void packRects(std::vector<Rect>& rects, int width, int height) { // 按照面积从大到小排序 std::sort(rects.begin(), rects.end(), compareRect); for (int i = 0; i < rects.size(); ++i) { for (int j = 0; j < i; ++j) { if (rects[j].isPlaced) { // 尝试在已放置的矩形周围找到合适的位置 if (doesFit(rects[i], rects[j].x, rects[j].y + rects[j].height, width, height)) { rects[i].x = rects[j].x; rects[i].y = rects[j].y + rects[j].height; rects[i].isPlaced = true; break; } else if (doesFit(rects[i], rects[j].x + rects[j].width, rects[j].y, width, height)) { rects[i].x = rects[j].x + rects[j].width; rects[i].y = rects[j].y; rects[i].isPlaced = true; break; } } } if (!rects[i].isPlaced) { // 如果没有找到合适的位置,则将物体放置在左上角 rects[i].x = 0; rects[i].y = 0; rects[i].isPlaced = true; } } } int main() { int width = 100; // 区域宽度 int height = 100; // 区域高度 std::vector<Rect> rects = { {20, 30, false, 0, 0}, {40, 50, false, 0, 0}, {30, 20, false, 0, 0}, {50, 40, false, 0, 0} }; packRects(rects, width, height); for (const auto& rect : rects) { std::cout << "Width: " << rect.width << ", Height: " << rect.height << ", Position: (" << rect.x << ", " << rect.y << ")" << std::endl; } return 0; } ``` 上述程序,我们定义了一个矩形结构体Rect,包含宽度、高度、是否已经放置、左上角坐标等信息。使用compareRect函数按照矩形面积从大到小进行排序,然后使用doesFit函数检查矩形是否适合给定的位置和大小。 在packRects函数,我们首先对矩形进行排序,然后遍历每个矩形。对于每个矩形,我们尝试在已放置的矩形周围找到合适的位置,如果找到则更新矩形的位置和状态,否则将矩形放置在左上角。 最后,在主函数我们定义了一个区域的宽度和高度,以及一组待排列的矩形。调用packRects函数进行异形排样,并输出每个矩形的宽度、高度和位置信息。 注意:上述代码只是一个简单的示例,实际应用可能需要考虑更多的细节和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值