`

几种圆角的方法以及透明效果

 
阅读更多
在成长的过程中收集了几种圆角的方法,现在贡献给大家。
方法一:
void CDlgBase::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);


if (!IsIconic())
{
if (m_bIsImageStyle)
{
BOOL bIsMaximize = IsZoomed();
int border_offset[] = {3, 2, 1};
if (bIsMaximize)
{
SetupRegion(border_offset, 0);
}
else
{
SetupRegion(border_offset, 3);
}


}
else
{
int border_offset[] = {5, 3, 2, 1, 1};
SetupRegion(border_offset, 5);
}
}


CRect rc;
GetClientRect(&rc);
OnSize(rc);
InvalidateRect(NULL);
}


// 设置窗口区域
void CDlgBase::SetupRegion(int border_offset[], int nSize)
{
CDC* pDC = GetDC();


CRect rc;
GetWindowRect(rc);
rc.OffsetRect(-rc.left, -rc.top);


CRgn rgn;
rgn.CreateRectRgn(0, 0, rc.Width(), rc.Height());
CRgn rgn_xor;
CRect rcXor;

for (int y = 0; y < nSize; ++y)
{
rcXor.SetRect(0, y, border_offset[y], y + 1);
rgn_xor.CreateRectRgn(0, y, border_offset[y], y + 1);
rgn.CombineRgn(&rgn, &rgn_xor, RGN_XOR);
rgn_xor.DeleteObject();
}


for (int y = 0; y < nSize; ++y)
{
rcXor.SetRect(rc.right - border_offset[y], y, rc.right, y + 1);
rgn_xor.CreateRectRgn(rc.right - border_offset[y], y, rc.right, y + 1);
rgn.CombineRgn(&rgn, &rgn_xor, RGN_XOR);
rgn_xor.DeleteObject();
}


if(m_bIsImageStyle)
{
for (int y = 0; y < nSize; ++y)
{
rcXor.SetRect(0, rc.bottom - y - 1, border_offset[y], rc.bottom - y);
rgn_xor.CreateRectRgn(0, rc.bottom - y - 1, border_offset[y], rc.bottom - y);
rgn.CombineRgn(&rgn, &rgn_xor, RGN_XOR);
rgn_xor.DeleteObject();
}


for (int y = 0; y < nSize; ++y)
{
rcXor.SetRect(rc.right - border_offset[y], rc.bottom - y - 1, rc.right,


rc.bottom - y);
rgn_xor.CreateRectRgn(rc.right - border_offset[y], rc.bottom - y - 1,


rc.right,rc.bottom - y);
rgn.CombineRgn(&rgn, &rgn_xor, RGN_XOR);
rgn_xor.DeleteObject();
}
HWND hWnd = GetSafeHwnd();
SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(RGB(255, 0, 255), 0, LWA_COLORKEY );
}
SetWindowRgn((HRGN)rgn, TRUE);
m_Rgn.DeleteObject();
m_Rgn.Attach(rgn.Detach());
ReleaseDC(pDC);
}


方法二: 此方法是收集DirectUI里面的一种
上面圆角 下面不圆角
void CDlg::OnSize(UINT nType, int cx, int cy) //画圆角
{
CDialog::OnSize(nType, cx, cy);


CSize szRoundCorner;
szRoundCorner.cx=szRoundCorner.cy=7; //赋值越大 圆角度越大


if( !::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0) ) {
RECT rcClient;
::GetClientRect(*this, &rcClient);
RECT rc = { rcClient.left, rcClient.top + szRoundCorner.cx, rcClient.right,


rcClient.bottom };
HRGN hRgn1 = ::CreateRectRgnIndirect( &rc );
HRGN hRgn2 = ::CreateRoundRectRgn(rcClient.left, rcClient.top, rcClient.right + 1,


rcClient.bottom+1 , szRoundCorner.cx,szRoundCorner.cy);
::CombineRgn( hRgn1, hRgn1, hRgn2, RGN_OR );
::SetWindowRgn(*this, hRgn1, TRUE);
::DeleteObject(hRgn1);
::DeleteObject(hRgn2);
}
m_bMoveFirst=TRUE;
Invalidate();
}

四个角都是圆角
void CDlg::OnSize(UINT nType, int cx, int cy) //画圆角
{
CDialog::OnSize(nType, cx, cy);


CSize szRoundCorner;
szRoundCorner.cx=szRoundCorner.cy=7; //赋值越大 圆角度越大


if( !::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0) ) {
RECT rcClient;
::GetClientRect(*this, &rcClient);
RECT rc = { rcClient.left, rcClient.top + szRoundCorner.cx, rcClient.right,


rcClient.bottom };
HRGN hRgn1 = ::CreateRectRgnIndirect( &rc );
HRGN hRgn2 = ::CreateRoundRectRgn(rcClient.left, rcClient.top, rcClient.right + 1,


rcClient.bottom+1 , szRoundCorner.cx,szRoundCorner.cy);
::CombineRgn( hRgn1, hRgn1, hRgn2, RGN_OR );
::SetWindowRgn(*this, hRgn1, TRUE);
::SetWindowRgn(*this, hRgn2, TRUE);
::DeleteObject(hRgn1);
::DeleteObject(hRgn2);
}
m_bMoveFirst=TRUE;
Invalidate();
}

区别就一个地方 添加 ::SetWindowRgn(*this, hRgn2, TRUE);

方法三:直接用圆角函数 里面的参数 自己研究吧
CRgn rgn;
rgn.CreateRoundRectRgn(nBorder,nCaption+nBorder,
rect.right-nBorder, rect.bottom-nBorder, 10,10);
this->SetWindowRgn((HRGN)rgn.m_hObject, TRUE);
rgn.DeleteObject();


还有很多,比如金山的界面库,其它的界面库都有方法,大家好好研究啊,一起进步。


透明就一个函数而与! 本人在其它的界面库看到过比较炫丽的半透明的效果,但貌似不是它,有时间我得研究研究。

typedef BOOL (FAR PASCAL * FUNCTransparent)(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);

void CBaseDlg::SetTrans(int itrans) //窗体透明
{
HMODULE hModule = GetModuleHandle(_T("user32.dll"));
FUNCTransparent SetLayeredWindowAttributes;
SetLayeredWindowAttributes= (FUNCTransparent)GetProcAddress(hModule,"SetLayeredWindowAttributes");

// 设置分层扩展标记
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x80000L);
// 70% alpha
SetLayeredWindowAttributes(GetSafeHwnd(), 0, (255 * itrans) / 100, 0x2);
}

源码下载地址:
http://download.csdn.net/detail/banketree/4235674




加油 加油 加油

























分享到:
评论

相关推荐

    图像批量调整大小工具Fotosizer3.12.0.576单文件专业版

    Fotosizer 是一款批量照片/图像调整工具。它可在几分钟内快速简单的调整数百张照片的...实时预览您正在更改照片的调整大小设置、水印和其它效果。 多语言: Fotosizer 支持 26 种语言。 系统要求: Windows XP、Vista

    Java面试宝典2020修订版V1.0.1.doc

    5、用css3语法中,如何实现一个矩形框的圆角效果和50%红色透明效果?,请写出关键脚本 12 6、Div与Table的区别 13 7、行级标签转块级标签,块级标签转行级标签 13 二、Java基础部分 13 1、java中有哪些基本类型? 13...

    dark-gitlab:用于GitLab和自托管GitLab实例的非常可定制的深色主题。 gitlab.comvednocdark-gitlab的镜像

    黑暗GitLab 为和自托管的GitLab实例提供了有针对性的,可自定义的暗光模式实现。 检查以查看v1.0的路线图。...有几种安装此用户样式的方法。 带触控笔 推荐的方法; 允许完全自定义自定义功能。 安装 单击安

    JQuery&CSS;&CSS;+DIV实例大全.rar

    5.jquery+div漂亮SmartMenu下拉菜单气泡透明效果 6.jQuery+div实现flash炫彩菜单插件下载 7.jquery+div实用漂亮精致的多级导航栏菜单插件代码示例 8.jQuery+ul实现漂亮竖直下拉菜单 9.jquery仿google首页...

    C++MFC教程

    后面几条是我个人的一点意见,你可以根据需要和自身的情况选用适用于自己的方法。 此外我将一些我在选择参考书时的原则: 对于初学者:应该选择一些内容比较全面的书籍,并且书籍中的内容应该以合理的方式安排,...

    flash shiti

    42.图形文件中,哪几种格式的矢量图能被Flash直接引用? A. *.ai B. *.eps C. *.cdr D. *.wmf 43.下图中哪几项可以打开平滑与整平工具? A. 从附属选项中挑选 和 钮 B. 从附属选项中挑选 和 钮 C. 选取...

    易语言模块914个

    和是几与谁最大.ec 响应左键放开.ec 四则混合运算模块.ec 回调函数.ec 图形窗口模块.ec 图片演示-西风.EC 图片演示.EC 图片组操作类.ec 在线更新.ec 在线更新2.ec 在线查找歌词.ec 地理位置查询.ec 堕...

    1345个易语言模块

    API的使用方法.ec API 设置颜色对话框模块.ec ard.ec Arhz_自动更新.ec Base64编解码.ec BASE64编解码模块.ec Bios.ec Bios 信息.ec BMP加密数据.ec BMP滤镜模块.ec BOX.EC BPL专用更新模块.ec BPL综合模 块.ec BPL...

    1350多个精品易语言模块

    API的使用方法.ec API 设置颜色对话框模块.ec ard.ec Arhz_自动更新.ec Base64编解码.ec BASE64编解码模块.ec Bios.ec Bios 信息.ec BMP加密数据.ec BMP滤镜模块.ec BOX.EC BPL专用更新模块.ec BPL综合模 块.ec BPL...

    精易模块[源码] V5.15

    6、优化“时间_取中国星期几”命令,感谢易友【灵魂出窍808】提议。 7、新增“网页_取网络文件尺寸”获取网络文件尺寸,失败返回零。 8、新增“数组_取次数”,取指定数组成员出现相同数量,源码由易友【C盘是头猪】...

Global site tag (gtag.js) - Google Analytics