加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

mfc界面美化之—异形窗口

(2014-06-11 18:41:07)
标签:

异形窗口

窗口美化

mfc

mfc界面美化

mfc异形窗口

分类: MFC
异型窗口
一 .前言
我们都知道windows窗口都是矩形的,那怎么做一个非矩形的个性化的窗口呢?
在绝大多数的Windows应用程序中,其窗体都是使用的正规正矩的矩形窗体,例如我们常用的,“qq”,“office”"360",等等。矩形窗体,具有编程实现简单,风格简洁的优点,所以在普通文档应用程序和简单小游戏中使用足矣。但在某些娱乐游戏程序中使用就略显呆板些了,这时若用不规则窗体替代原先的矩形窗体,将会使这类程序更添情趣。典型的例子有windows 自代的Media Player,新版本的Media Player有个控制面板的选项,选中这些面板,播放器就以选中的面板形状出现,这时的播放器比以前版本的Media Player的古老矩形界面要生动有趣的多了。 要实现不规则窗体不是太难,知道了基本原理后,你也可以创建各种有趣的不规则窗体。
我们有很多游戏的登陆窗口都是异形的窗口,这样看起来跟加酷,下面我们来做一个异形的
二、实现原理
我们的异形窗口怎么实现的呢,这是一个很简单的方法,不像很多人写的很复杂,原理很简单。我们利用一张位图贴上矩形窗口之后,然后设置窗口的属性和透明色,就会让窗口看起来是异形的,实际上我们所有的窗口都是矩形的,通过一些特殊处理就变成透明的了。

本博文,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

1. 大致了解MFC框架的基本运作原理;

2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制;

3. 熟悉OOP理论和技术;

本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助。 

至少知道的操作:

*Bitmap Functions:位图操作

Coordinate Functions:坐标操作

Color and Color Palette Functions:颜色/调色板操作

Simple Drawing Functions:简单绘图操作,如:绘制矩形框

fillrect function 贴图操作 

CBrush  function 画刷操作


三·  操作步骤

我们的任务是做一个360加速球http://s12/mw690/002tf7aDgy6JAXEFAin5b&690

我们先给这个加速球截图,使用ps 把图片扣出来,把背景色调为黑色RGB(0,0,0)http://s4/mw690/002tf7aDgy6JAXO7rYD23&690图片格式BMP



1.用类向导新建一个mfc关于对话框应用程序。

http://s2/mw690/002tf7aDgy6JAXuWPDj81&690
2.修改对话框的属性border 为none.
http://s2/mw690/002tf7aDgy6JAXuSUpP71&690
3.改变窗口大小。大致和我们的图片大小差不多就行了。
http://s8/mw690/002tf7aDgy6JAXzAlTN07&690
4.在对话框的消息响应中添加一个ON_WM_CTLCOLOR消息响应。
http://s8/mw690/002tf7aDgy6JAY9XpXx87&690


5.在这个对画框的类中添加一个CBrush m_brush;

6.把这张图片添加到资源目录,更改ID:   IDB_BITMAPBJ

7.OnCtlColor消息响应函数如下:

HBRUSH CjixinckDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);


// TODO:  在此更改 DC 的任何特性

CBitmap bitmap;

bitmap.LoadBitmapW(IDB_BITMAPBJ);

m_brush.CreatePatternBrush(&bitmap);

return m_brush;

// TODO:  如果默认的不是所需画笔,则返回另一个画笔

//return hbr;

}

我们先运行一下,结果如下,我们改变窗口的大小,直到合适为止。

http://s16/mw690/002tf7aDgy6JAZkP4OHdf&690

http://s16/mw690/002tf7aDgy6JAZyzy1hbf&690

关键的来了

8.在OnInitDialog()函数中添加如下代码。

{

SetWindowLong(this->m_hWnd, GWL_EXSTYLE, GetWindowLong(this->m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);    //改变窗口属性

SetLayeredWindowAttributes(RGB(0,0,0),235,1);     //设置窗口的透明色

}

两个函数的使用介绍

SetWindowLong    函数使用http://baike.baidu.com/view/1080272.htm?fr=aladdin

SetLayeredWindowAttributes 函数使用:http://baike.baidu.com/view/1329156.htm?fr=aladdin


9.我们在次运行一下。你看,奇迹发生了。http://s7/mw690/002tf7aDgy6JB027gjk96&690 ,这次就是一个360加速球了。是不是很简单。

现在我们的窗口还不能移动,我们添加一个OnLButtonDown消息响应函数   里面实现如下


void ClechatDlg::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值


PostMessage( WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);   //只需要发送一个消息

CDialog::OnLButtonDown(nFlags, point);

}

这个消息的  介绍 WM_SYSCOMMAND  http://baike.baidu.com/view/2451868.htm?fr=aladdin

http://s6/mw690/002tf7aDgy6JB0z9C2Vf5&690这一次,这个加速球就可以移动了。


这样一个异形窗口就做好了。你可以做其他样式的异形窗口,随意发挥;

总结一下关键点:

1.图形要做一个纯色背景,以用来透明化  

 2 .贴图在这个窗口上  

 3.改变窗口的属性和设置透明色 

源码下载: http://pan.baidu.com/s/1gdeNULH 

---兴趣是最好的老师————如果你爱好编程,请坚持下去,不要放弃









0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有