创建一个非矩形按钮

//动态创建一个按钮

_hwndArrowButton = CreateWindow(L"BUTTON",//窗口类型,为按钮

                                                            NULL,

                                                            WS_VISIBLE |WS_POPUP | BS_OWNERDRAW,//按钮样式
                                                            428,66,50,50,//按钮位置和大小

                                                             _hWnd,//父窗口句柄

                                                             (HMENU)ID_ARROW_UP,//按钮的资源ID

                                                             g_hInstance,

                                                             NULL);
//设置此按钮窗口的区域

SetupRegion(_hwndArrowButton , IDB_ARROW, RGB(255,255,255) );

 

//设置区域函数实现如下(来源于网络,有修改)

void SetupRegion(HWND hWnd, int buttonId, COLORREF TransColor)
{
    HDC hDC;
    hDC = GetWindowDC(hWnd);
   
    //创建与传入DC兼容的临时DC
    HDC memDC= ::CreateCompatibleDC(hDC);
  
    HBITMAP hOldMemBmp = LoadBitmap(g_hInstance, MAKEINTRESOURCE(buttonId));
    //将位图选入临时DC
   SelectObject(memDC,hOldMemBmp);
  
    //创建总的窗体区域,初始region为0
    HRGN wndRgn = ::CreateRectRgn(0,0,0,0);

    //取得位图参数,这里要用到位图的长和宽 
    BITMAP bit;
    GetObject(hOldMemBmp,sizeof(BITMAP),&bit);
   
    int y;
    for(y=0;y<bit.bmHeight ;y++)
    {
        //保存临时region
        HRGN rgnTemp;
      
        int iX = 0;
        do
        {
            //跳过透明色找到下一个非透明色的点.
            while (iX < bit.bmWidth && GetPixel(memDC,iX, y) == TransColor)
                iX++;
          
            //记住这个起始点
            int iLeftX = iX;
          
            //寻找下个透明色的点
            while (iX < bit.bmWidth && GetPixel(memDC,iX, y) != TransColor)
                ++iX;
          
            //创建一个包含起点与终点间高为1像素的临时“region”
            rgnTemp = CreateRectRgn(iLeftX, y, iX, y+1);
          
            //合并到主"region".
            CombineRgn(wndRgn,wndRgn,rgnTemp, RGN_OR);
          
            //删除临时"region",否则下次创建时和出错
            DeleteObject(rgnTemp);
        }while(iX <bit.bmWidth );
        iX = 0;
    }
  
    if(hOldMemBmp)
        SelectObject(memDC,hOldMemBmp);
  
    if(SetWindowRgn(hWnd,wndRgn,TRUE)==0)
    {
        return;
    }
    SetForegroundWindow(hWnd);       
}

 

参数1:被设置按钮(窗口)的句柄

参数2:位图图片资源ID

参数3:位图图片中需要镂空掉的颜色,本例中使用的是RGB(255,255,255)白色,也就是说矩形图片中不需要的部分填充成一种颜色,该函数就会忽略掉该颜色的区域来设置窗口。

在EasyX图形设置一个矩形返回按钮通常涉及以下步骤: 1. 引入 EasyX 的头文件:首先确保你已经包含了EasyX库的头文件,如`#include "easyui.h"`。 2. 创建窗口和控件:使用`LW("窗口名字")`创建一个窗口,并在窗口上添加一个控件,比如`LB("返回")`来表示矩形按钮,其"返回"是你想要显示的文字。 3. 设置形状和样式:使用`SetShape(LB, SHAPE_RECT);`将按钮设置矩形形状。然后,你可以调整边框样式、颜色和大小,例如`SetStyle(LB, WS_BORDER | WS_TABSTOP);`设置带边框的可按tab切换。 4. 定义事件处理:为了让按钮具有点击事件,你需要定义一个回调函数来处理`OnClick`事件,例如`void OnReturnButtonClick()`。在EasyX,这通常通过`AddEvent()`函数完成。 5. 添加事件处理:`AddEvent(LB, EV_CLICKED, OnReturnButtonClick);`将事件绑定到你的回调函数。 6. 显示和更新:最后,调用`Draw()`函数来显示你的窗口和所有控件,然后在需要的地方更新它们(如循环)。 示例代码: ```cpp #include "easyui.h" void OnReturnButtonClick() { // 在这里编写你的返回操作逻辑 } int main() { // 创建窗口 LW("返回按钮窗口"); // 创建矩形按钮 LB("返回", 10, 10, 80, 30); SetShape(LB, SHAPE_RECT); SetStyle(LB, WS_BORDER | WS_TABSTOP); // 绑定点击事件 AddEvent(LB, EV_CLICKED, OnReturnButtonClick); // 显示窗口 Draw(); // 循环或等待用户关闭窗口 while (!IsWindowClose()); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值