VC++界面编程之--使用分层窗口实现界面皮肤
|
使用分层界面来实现界面皮肤的好处是:可以保证图片边缘处理不失真,且能用于异形窗口上,如一些不规则的窗口,你很难用SetWindowRgn来达到理想效果。 在很多情况下,界面的漂亮与否,取决于PS的制作及创意,而界面编程所需要做的就是将图片完整无缺的展示给用户。 分层窗口的好处就是:用一层窗口来描绘窗口背景,以确保背景图片不会失真,而另一层窗口用来放置控件,除控件之外的区域全是透明的。为什么要这么麻烦呢?因为我们将要用到UpdateLayeredWindow来实现窗口背景描绘,一旦执行这个函数后,窗口的控件将会被覆盖,不会再显示。所以我们要再加一层透明窗口,来放置控件,以确保控件不会受到UpdateLayeredWindow的影响。 这样一来,窗口绘图将不会影响到控件,并且可以达到窗口透明,控件不透明的效果。当然这个只是个别的窗口实现效果需求,这里不做重点讨论。 这里我用了两个窗口类来完成此项工作,CThemedLayerWnd和CThemedAlphaWnd。CThemedLayerWnd负责截取正常窗口的创建消息,并在正常窗口创建之前,创建CThemedAlphaWnd;CThemedAlphaWnd主要负责窗口的描绘,也就是使用UpdateLayeredWindow来让Windows自己描绘窗口皮肤。 正常窗口只需要继承模板类CThemedLayerWnd,并将CThemedLayerWnd加入到自己的窗口消息链中即可: [cpp] view plaincopy
在正常窗口执行Create函数时,提前创建CThemedAlphaWnd,这样一来,CThemedAlphaWnd就是CThemedLayerWnd的父窗口,CThemedLayerWnd理所当然成为子窗口,并自动将窗口位置置于CThemedAlphaWnd之上,这也正是我们想要的效果。 [cpp] view plaincopy
这里还有个关键的问题,窗口上面是有控件的,如果控件要获取父窗口的背景画刷该怎么办?而CThemedLayerWnd是透明的,你是没办法获取到透明背景的。所以需要截取CThemedLayerWnd的WM_PAINT消息,当控件想要通过WM_PAINT来获取窗口背景时,将窗口皮肤图片传递给控件。 [cpp] view plaincopy
分层窗口带来的不便之处就是:你对窗口的操作都是介于两个窗口之间的,所以你需要在此上面多花费一些功夫,比如移动窗口,实际是移动两个窗口。再比如正常窗口调用CenterWindow,实际是让CThemedLayerWnd来移动窗口,你不得不重写CenterWindow来先移动CThemedAlphaWnd然后再来移动CThemedLayerWnd。 凡事皆有取舍,一切都根据实际需求做出取舍。正如分层窗口一样,丧失了一些正常窗口的普通函数操作能力,但换来了界面皮肤的完美显示。 本文代码免费下载链接:http://download.csdn.net/detail/renstarone/6361907 |
from:http://blog.csdn.net/renstarone/article/details/12371309
VC++界面编程之--使用分层窗口实现界面皮肤的更多相关文章
- [置顶] VC++界面编程之--使用分层窗口实现界面皮肤
使用分层界面来实现界面皮肤的好处是:可以保证图片边缘处理不失真,且能用于异形窗口上,如一些不规则的窗口,你很难用SetWindowRgn来达到理想效果. 在很多情况下,界面的漂亮与否,取决于PS的制作 ...
- 精通 VC++ 实效编程280例 - 01 窗口
窗口是屏幕上的一个矩形区域.窗口分为3种:重叠窗口.弹出窗口和子窗口.每个窗口都有由系统绘制的“非客户区”和应用程序绘制的“客户区”.在 MFC 中,CWnd 类为各种窗口提供了基类. 1 通过 HW ...
- Java Swing界面编程(21)---事件处理:窗口事件
WindowLIstener是专门处理窗口的事件监听窗口.一个窗口的全部变化.如窗口的打开.关闭等都能够使用这个接口进行监听. 实现WIndowListener: package com.beyole ...
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ...
- Linux C 程序 GTK+图形界面编程(22)
GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...
- android应用的界面编程----View与ViewGroup的概念
1 UI OverView Android中所有的UI元素都是通过View与ViewGroup来构建的,View是指屏幕中一块可与用户进行交互的空白,类似于java界面编程中的JPanel.为了界面布 ...
- Python入门 —— 03GUI界面编程
GUI(Graphical User Interface) 即图形用户接口,又称图形用户接口. 是指采用图形方式显示的计算机操作用户界面.GUI 是屏幕产品的视觉体验和互动操作部分. "你的 ...
- [matlab] MATLAB 界面编程 傻瓜教程
>_<:在 MATLAB 的命令窗口(Command Window)中运行 guide 命令,来打开 GUIDE 界面,如下: >_<:然后,选择空模板(Blang GUI), ...
- 界面编程模仿篇(QQ登录界面逼真篇)
写了好多天的爬虫,偷空前前后后用了两天的时间(排除吃饭睡觉)写完了这个QQ登录界面,看起来还凑和着吧,如果是的大神的,莫见笑,纯属业余作品,废话先不多说,截图如下,其中第二幅图片中的红色方框部份有待完 ...
随机推荐
- 基于SIM 卡卡基不同制作工艺的研究
1 国内外现行的SIM 卡卡基制作工艺 SIM 卡由卡基和芯片两部分组成.卡基上有植入芯片的台阶式芯片槽,SIM 卡的芯片通过多点焊接植入台阶式芯片槽之中与卡基组成SIM 卡,然后经过个性化数据处理, ...
- IAR Embedded Workbench for ARM 6.50.6 & 6.60.1 破解补丁
IAR EWARM 6.50.6 & 6.60.1 破解 破解原理和方法见:http://blog.csdn.net/chivalrys/article/details/8564568 IAR ...
- char[]转换成wchar_t的转换方法(GNU Libc规定wchar_t为32位)
wchar_t是C/C++的字符数据类型,是一种扩展的字符存储方式,wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码.unicode编码的字符一般以wchar_t类型存储. ...
- 滚动条QScroolBar实现滚屏功能(屏幕过大,覆盖wheelEvent来处理滑轮事件)
环境:Qt5 编译器:Qt Creator 需求:如图 显示区域win 600*300 需要显示的Widget控件show 590*550 则有600*250的show界面无法显示 使用滑块控制sho ...
- Trie三兄弟——标准Trie、压缩Trie、后缀Trie
1.Trie导引 Trie树是一种基于树的数据结构,又称单词查找树.前缀树,字典树,是一种哈希树的变种.应用于字符串的统计与排序,经常被搜索引擎系统用于文本词频统计.用于存储字符串以便支持快速模式匹配 ...
- 让Apache支持中文Directory的最简方法
解决方法很简单,一句话,将httpd.conf配置文件的字符编码转换成UTF-8即可. 转换方法也很简单,在记事本中选择 文件->另存为,弹出的窗口中选择编码为UTF-8即可. 重新启动下apa ...
- android天气查询(二)之网络json数据的获取
前面一篇文章介绍了如何使用ksoap获取天气信息,但是使用的网络资源受到了限制,所以我们这里会采用第二种方法,可以无限制的获取.http://m.weather.com.cn/data/1010101 ...
- 使用回调接口实现ActiveX控件和它的容器程序的通讯
本文阅读基础:有一定的C++基础知识(了解继承.回调函数),对MFC的消息机制有一定了解,对COM的基础知识有一定了解,对ActiveX控件有一定了解. 一. 前言 ActiveX控件和它的容器程序如 ...
- JAVA GUI学习 - JTable表格组件学习_A ***
public class JTableKnow_A extends JFrame { public JTableKnow_A() { this.setBounds(300, 100, 400, 300 ...
- C++基础梳理--Class、Struct、Union
C++学习一段时间后,反过头来看我发现我忘了一下最基础的东西:strcut(结构体),union(联合体)我学会了类的一堆东西却忘了这两个最基础的: 现在就好好的重新学习一下这里的东西: 一.Clas ...