在SOUI中非半透明窗口如何实现圆角窗口?
如果SOUI的宿主窗口没有包含子窗口,直接使用窗口的半透明属性:translucent=1就可以解决了,整个窗口形状完全由背景图决定,可以实现完美的圆角。
然后窗口半透明时,窗口中的子窗口(非SWindow)就不能正常显示,所以有时候不得不使用translucent=0,这时窗口就成了方形。
实际上这个问题已经和SOUI没有什么关系了,你的问题变成了窗口如何做圆角,还不是在SOUI中窗口如何做圆角。
网上一搜索一大堆,可惜经常有人要问。
给窗口做圆角或者异形好像只有一个办法:SetWindowRgn,自己创建一个HRGN,再调用这个API就可以了,关键问题是在窗口大小变化时注意重新设置。
好人做到底,这里帖一份专业做圆角的代码:
template <class T>
class CWHRoundRectFrameHelper
{
protected: SIZE m_sizeWnd; void OnSize(UINT nType, CSize size)
{
T *pT = static_cast<T*>(this); if (nType == SIZE_MINIMIZED)
return; if (size == m_sizeWnd)
return; CRect rcWindow, rcClient;
CRgn rgnWindow, rgnMinus, rgnAdd; pT->CSimpleWnd::GetWindowRect(rcWindow);
pT->CSimpleWnd::GetClientRect(rcClient);
pT->CSimpleWnd::ClientToScreen(rcClient); rcClient.OffsetRect(- rcWindow.TopLeft()); rgnWindow.CreateRectRgn(rcClient.left, rcClient.top + , rcClient.right, rcClient.bottom - );
rgnAdd.CreateRectRgn(rcClient.left + , rcClient.top, rcClient.right - , rcClient.top + );
rgnWindow.CombineRgn(rgnAdd, RGN_OR);
rgnAdd.OffsetRgn(, rcClient.Height() - );
rgnWindow.CombineRgn(rgnAdd, RGN_OR);
rgnAdd.SetRectRgn(rcClient.left + , rcClient.top + , rcClient.right - , rcClient.top + );
rgnWindow.CombineRgn(rgnAdd, RGN_OR);
rgnAdd.OffsetRgn(, rcClient.Height() - );
rgnWindow.CombineRgn(rgnAdd, RGN_OR);
pT->CSimpleWnd::SetWindowRgn(rgnWindow);
pT->SetMsgHandled(FALSE);
m_sizeWnd = size;
} public: BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = )
{
BOOL bHandled = TRUE; switch(dwMsgMapID)
{
case :
if (uMsg == WM_SIZE)
{
OnSize((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));
lResult = ;
}
break;
}
return FALSE;
}
};
这是一个模板类,下面给一个SOUI中使用的示例代码:
class CFuckDialog : public SHostDialog , public CWHRoundRectFrameHelper<CFuckDialog>
{
//xxxxx
//HOST消息及响应函数映射表
BEGIN_MSG_MAP_EX(CMainDlg)
CHAIN_MSG_MAP(CWHRoundRectFrameHelper<CFuckDialog >)//重要
CHAIN_MSG_MAP(SHostDialog)
REFLECT_NOTIFICATIONS_EX()
END_MSG_MAP()
//xxxx
};
这样你的Dialog就有圆角了。
在SOUI中非半透明窗口如何实现圆角窗口?的更多相关文章
- 第十三篇:在SOUI中使用有窗口句柄的子窗口
前言: 无论一个DirectUI系统提供的DUI控件多么丰富,总会有些情况下用户需要在DUI窗口上放置有窗口句柄的子窗口. 为了和无窗口句柄的子窗口相区别,这里将有窗口句柄的子窗口称之为真窗口. 每一 ...
- 第三十一篇:SOUI布局之相对于特定兄弟窗口
SOUI中通过pos的标志如:[, {, }, ],这4个标志可以相对于前一个及后一个兄弟窗口,但是有时候希望相对于不是前后窗口的兄弟窗口,比如一个通过一个中心窗口同时定义它的上下左右4个窗口,这个时 ...
- WPF 创建无边框的圆角窗口
原文:WPF 创建无边框的圆角窗口 如题所述,在WPF中要创建一个没有边框且为圆角的窗体,有如下几步工作要进行: 第一步:去掉窗体默认样式的边框 首先将窗体的背景设为透明,将允许透明的属性设置为Tru ...
- CQGUI框架之阴影圆角窗口实现
CQGUI框架之阴影圆角窗口实现 大家好,我是IT文艺男,来自一线大厂的一线程序员 今天给大家讲解基于C++/Qt的CQGUI框架的阴影圆角窗口实现,实现效果如下图所示:: CQGUI开发环境:: M ...
- [Swift通天遁地]一、超级工具-(15)使用SCLAlertView制作强大的Alert警告窗口和Input编辑窗口
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- jquery 获取父窗口的元素 父窗口 子窗口
一.获取页面元素 取父窗口的元素方法:$(selector, window.parent.document); 那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent ...
- 更新记录后关闭子窗口并刷新父窗口的Javascript
有时我们需要在新打开的窗口里面编辑信息,等编辑完了,需要将当前窗口关闭并且刷新父窗口,以使修改生效,本文就是介绍用 javascript 来实现"更新记录后关闭子窗口并刷新父窗口" ...
- JS实现关闭当前子窗口,刷新父窗口
一.JS实现关闭当前子窗口,刷新父窗口 JS代码如下: <script> function refreshParent() { window.opener.location.href = ...
- jQuery 获取父窗口的元素 父窗口 子窗口(iframe)
$("#父窗口元素ID",window.parent.document); 对应javascript版本为window.parent.document.getElementById ...
随机推荐
- Linux的学习日记
CURL 在Ubuntu下尝试安装通过包安装Node.js的时候有这样一种安装方法, 那么有必要学学CURL的知识了. curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Un ...
- Maven+Spring MVC Spring Mybatis配置
环境: Eclipse Neon JDK1.8.0 Tomcat8.0 先决条件: Eclipse先用maven向导创建web工程.参见本站之前随笔. 本机安装完成mysql5:新建用户xuxy03设 ...
- ETL简介
1.ETL的定义 ETL分别是“Extract”.“ Transform” .“Load”三个单词的首字母缩写也就是“抽取”.“转换”.“装载”,但我们日常往往简称其为数据抽取. ETL是BI/DW( ...
- zend studio汉化
在help菜单中选择Install New Software,在 work with栏中添加上这样的地址 http://archive.eclipse.org/technology/babel/upd ...
- codevs2800 送外卖
题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一 ...
- [Qt]用QItemDelegate的来修改QStandardItem字体颜色
1.重写ItemDelegate的Item方法 这里我使用的QListView来显示Log日志,将写好的代理在初始化中就可以直接赋值上. m_LogModel = new QStandardItemM ...
- C和指针 第十三章 习题
1,1标准输入读入字符,统计各类字符所占百分比 #include <stdio.h> #include <ctype.h> //不可打印字符 int isunprint(int ...
- Effective C++ 33 避免遮掩继承而来的名称
首先介绍一个原则LSP(Liskov Substitution Principle),如果Class D以Public方式继承Class B,则所有B对象可以派上用场的任何地方,D对象一样可以派上用场 ...
- 逻辑思维面试题-java后端面试-遁地龙卷风
(-1)写在前面 最近参加了一次面试,对笔试题很感兴趣,就回来百度一下.通过对这些题目的思考让我想起了建模中的关联,感觉这些题如果没接触就是从0到1,考验逻辑思维的话从1到100会更好,并且编程简易模 ...
- HK&&CC JS学习:第一周——NO.2this
1)常用的命名规范: aXXXX:aBtn 说明获取的是一组元素:--类数组 oXXX:oBtn 说明获取的是一个元素->对象 对象有两个重要的特点:属性 和 方 ...