首 页 ┆ 源码下载 ┆ IT学院 ┆ 字体下载 ┆ 模板下载 ┆ 源码发布 ┆ 广告合作 ┆ 网站地图 ┆ 虚拟主机 ┆ 中文域名
► 设为首页
► 加入收藏
► 联系我们
源码下载 >> ASP源码 | PHP源码 | ASP.net源码 | JSP源码 | CGI源码 | VC/C++源码 | VB源码 | Delphi源码 | Flash源码
文章学院 >> 网络编程 | 网页设计 | 图形图象 | 数据库 | 服务器 | 网络媒体 | 网络安全 | 操作系统 | 办公软件 | 软件开发 | 黑客知识
字体下载 >> 精制字体 | 非英字体 | 艺术字体 | 著名字体 | 哥特式 | 简单字体 | 手写体 | 节假日 | 图案字体 | 精度像素 | 中文字体
模板下载 >> 企业门户 | 数码网络 | 休闲娱乐 | 影视音乐 | 旅游名胜 | 文化艺术 | 电子商务 | 个性展示 | 登陆导航 | Flash模板
►►您当前的位置:源码园 → IT学院 → 软件开发 → VC编程 → 文章内容

创建非矩形窗口的简单方法

作者:佚名  来源:网上收集  发布时间:2007-3-27 10:18:39
创建非矩形窗口的简单方法
赵湘宁
本文范例程序

提出问题:    

    为了创建不同形状窗口的应用程序,象MP3播放器,我设置对话框的背景为 “TRANSPARENT”(透明)(使用SetBkMode)并在WM_CTLCOLORDLG消息处理器中创建一支“空笔”(NULL)来绘制对话框背景。然后我用TransparenBlt将自己的位图(bitmap)放到对话框上。开始显示对话框时透明,但关闭这个对话框下层的其它窗口时,重画后显示的是前一个窗口部分,而不是下层的窗口的图形。那么如何才能做到真正的透明?
    

    SetBkMode这个函数在绘制窗口时确实使背景透明,但Windows假设每一个窗口必须是矩形的。如果你改变窗口大小,或关闭或移动后面的窗口,Windows是不会重画你窗口下面的像素的,因为它已经假设你的窗口将它们置灰了。换句话说,每一个窗口负责完整地绘制自身,包括背景。(事实上,Windows在擦除窗口背景时恰好发送WM_ERASEBKGND消息)
那么那些形状怪异的音乐播放器的怪异形状是如何实现的呢?它们并不是使用透明(TRANSPARENT)绘制模式(尽管那样做也行得通),而是调用SetWindowRgn函数。这个特别的函数可以创建非矩形窗口。在SetWindowRgn函数中指定一个区域(HRGN),这个区域的形状就是窗口的形状。指定的区域可以是矩形、椭圆形、多边形、园角矩形或其它任何组合形状。图三列出了一个你可以使用的Windows函数列表,你可以使用这些函数创建和处理区域。调用SetWindowRgn函数时,你重写绘制约定:只负责绘制区域内部。Windows负责绘制区域外部以及其它的一些行为,如鼠标点击和改变光标。
本文附带的一个小程序,NonRect,示范了SetWindowRgn的使用方法(见图四)。NonRect是一个经过精简的标准MFC程序:带主框架类,CMainFrame,有一个OnSize处理器,其中含有如下代码:

CRect rc;
GetWindowRect(&rc);
rc -= rc.TopLeft(); //normalize
m_rgn.CreateRoundRectRgn(rc.left,rc.top,
rc.right,rc.bottom, 50,50);
SetWindowRgn(m_rgn,TRUE);

这段代码产生一个园角矩形窗口,见图五
图五

如果你改变窗口的大小,移动它或关闭它下面的其它窗口,会发现窗口的角不在了:Windows用适当的背景重画缺角,并且当你点击窗口缺角时,Windows激活下面的窗口(如果有的话)。当然,一个真的非矩形窗口是不会有标题条、菜单或边缘的,因为这些元素在非矩形窗口中出现是不对劲的。NonRect只是一个粗糙的demo程序,意在说明SetWindowRgn的使用方式。如果要让NonRect成为真正的非矩形窗口应用,就要去掉所有的菜单、边缘及其它不必要的东西,并要自己绘制窗口-也包括所有非客户区域。一般来说,一旦你决定使用SetWindowRgn函数,那么很多事情就得由以自己做了,你必须自己实现所有的菜单,最小/最大化按钮,边缘(如果有的话)及非客户区的点击测试。尤其是你要重载不是全部也是大多数的WM_NCXXX消息。

[] [返回上一页] [打 印]
  • 上一篇文章:如何让一个打开的文档成为活动文档
  • 下一篇文章:美化你的应用程序的外观界面

  • 相关文章:
  • 应用程序中添加“Coolbars”的简单方法
  • [图文]创建非矩形窗口的简单方法
  • [组图]学习Word制作名片简单方法
  • 将Linux代码移植到Windows的简单方法
  • 解除QQ手机捆绑的超简单方法
  • [图文]Flash模拟360度互动环景的简单方法(4)
  • [组图]Flash模拟360度互动环景的简单方法(3)
  • [组图]Flash模拟360度互动环景的简单方法(2)
  • [图文]Flash模拟360度互动环景的简单方法(1)
  • 小编教你简单方法查找黑客的老巢--小编教你简单方法...
  • 不使用信用卡注册iTunes商店账号(简单方法)--信用卡...
  • DOS下清除熊猫的简单方法--DOS,清除,熊猫,简单,方法...
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 源码发布
Copyright © 2003-2009 Ymyasp.Com. All Rights Reserved .
备案序号:粤ICP备07029071号