【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2558|回复: 2

[转帖]让你的软件界面更漂亮 [VC]

[复制链接]
发表于 2006-1-12 15:33:55 | 显示全部楼层 |阅读模式
们使用过很多的软件, 给我们留下印象很深的是那些界面漂亮且迷人的软件, 国外的软件象QickTime,国产的象金山词霸等,它们的软件界面设计风格都有独特之处。本人跟据自已的经验和大家探讨一下软件的漂亮界面实现的原理并提供DEMO程序。
一、漂亮界面实现的原理

  用图象元素自绘窗口标题样栏,边框,系统按钮(最大化、最小化、关闭按钮)还有按窗口中的控件。图象当然是美工画的,但要你教美工怎么去画,是不是不能理解? ,呆会我会告诉你你如何去教美工画.请先仔细看下图。




  明白了吧,被红线抱括的部分都是要画的图象。画得好不好会直接影响你的软件界面
二、原理说玩了,来说一下实现的基本知识

  1、VC软件绘图技术:


CBitmap* pBitmap = new CBitmap;
BITMAP BmpInfo;
CBitmap* pOldBitmap;
CDC* pDisplayMemDC=new CDC;
pDisplayMemDC->CreateCompatibleDC(pDC);

pBitmap->LoadBitmap(IDB_TITLE_LEFT);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pBitmap->GetBitmap(&BmpInfo);

// x,y为绘图位置 ,必要时此语句要有For(..;..;..)控制
pDC->BitBlt(x,y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);

pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();

ReleaseDC(pDisplayMemDC);//记得执行以下的语句
delete pDisplayMemDC;
delete pBitmap;
  2、坐标的概念:点、窗口坐标和屏幕坐标及转换,很重要!如不清楚请先复习相关知识。

  下图是我写在一个界面,就是基于上述原理实现的:


下面介绍软件如何实现的:

  ①、重载对话框的消息函数:
void OnNcLButtonDown(UINT nHitTest, CPoint point);

//单击标题栏时是响应 void OnNcMouseMove(UINT nHitTest, CPoint point);

//Mous 在标题移动时响应 LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)

  ②、添加关键成员函数为:BOOL DrawTitleBar(CDC *pDC)

  ③、添加完消息涵数后,在.cpp中实现它们的代码(点击查看代码附件):

  好了运行你的序程,即可出现漂亮的界面。说明在设计对话框时最好只选上Title Bars,其它不要.消息函数要手动添加。只本程序是在VC++6.0 +WinXP环境下完成的。
  经过实践证明,仅仅画一个窗口很容易,多窗口程序软件实现统一风格很难。如若有机会的话,我会和大家继续探讨如何将设计好的漂亮窗口子类化,让程序所有的窗口有统一风格,美化窗口的其它控件并可自动随窗口改变而调整大小。我想那才是我们大家关心的。对不?

  本人的联系QQ:34544052  Email:Song_0962@sina.com .
 楼主| 发表于 2006-1-12 15:42:14 | 显示全部楼层
<><STRONG><FONT color=#339900>让你的软件界面更漂亮 [VC][二]</FONT></STRONG></P>
<><STRONG>一、统一风格漂亮界面设计的理论与实现<BR><BR>a.窗口和对话框</STRONG><BR><BR>  Windows操作系中窗口和对话框在我们看来是一样的,就是一个四边形,有标题栏、系统按钮,边框等,可移动和可变大小。实际上窗口和对话框是有的区别的。在创建对话框窗口时的工作中要发生两个主要过程:对话框的过程和其窗口过程。Win32 SDK对话框使用了系统提供的对话框窗口的窗口过程和对话框过程,对话框过程将被窗口过程调用。在MFC下,所有的窗口类都使用了同一个窗口过程,对话框类也一样。MFC对话框过程只处理WM_INITDIALOG消息,其余都让窗口过程处理,我们只能在函数OnInitDialog()中有唯一机会处理我们的对话框的初始化工作。因而我们设计界面时要在窗口过程处理中相关消息实现我们的界面。<BR><BR><STRONG>b. 几个有关对话框窗口消息的处理</STRONG><BR><BR>  1.WM_NCPAINT:重画非客户区消息<BR><BR>  重载此消函数,可以标题栏上为所欲为。<BR><BR>  2. WM_NCLBUTTONDOWN:在非客户区上按下鼠标左键消息<BR><BR>  要想在标题栏相应鼠标左键,可重载此消函数<BR><BR>  3.WM_NCMOUSEMOVE:在非客户区上移动鼠标会产生此消息<BR><BR>  4.WM_SIZE:在窗口改变大小后产生此消息。<BR><BR>  为了使软件更专业,调整对放框大小时,里面的各控件也应合理调整位置和大小,<BR><BR>  重载此消函数可实现目的。还有很几个,其它的不介绍了。<BR><BR><STRONG>c. 统一的界面风格实现</STRONG><BR><BR>  如何运用上述知识请参考我的前一文<a href="http://www.pconline.com.cn/pcedu/empolder/gj/vc/0508/694157.html" target="_blank" >让你的软件界面更漂亮 [VC]</A>[一]中有介绍并有源程序。漂亮界面的统一风格是如何实现的将是本文要讨论主要内容。<BR><BR>  我们知道Windows操作系统窗口风格基本上是一致的,微软的应用软件程序也和操作系统风格基本是统一的。所以使我们的CDialog 也跟其一样,要改变它的界面风格很困难。除非你对MFC了如指掌,甚至要了解操作系统内核。本人在摸索过程中经过无数次碰壁后,终于找到了希望。 <BR>请看下面两幅图:<BR></P>
<></P>
<> 图一</P>
<></P>
< align=center>图二</P>
<>  看了上面两图你是不是对VC有信心了?Visual C++ 可实现你想要的统一风格界面。请看如何实现:<BR><BR>  1.首先要建立漂亮界面主窗口。它也是一个对话框,方法前文有介绍。<BR><BR>  2.处理漂亮界面主窗口的OnInitDialog()函数。很重要!!<BR></P>
<>BOOL CTitleBarDlg::OnInitDialog()<BR>{<BR>//此处 不能修改和添加代码!因为其它对话框的OnInitDialog()要用到<BR><BR>m_ToolTip.Create(this,TTS_ALWAYSTIP);//Create提示 <BR>m_ReSizeFlag = TRUE; <BR><BR>CRect rtWnd;<BR>GetClientRect(&amp;rtWnd);<BR>m_OldWidth = rtWnd.Width();<BR>m_OldHeight = rtWnd.Height();<BR>OldPoint.x = rtWnd.Width();<BR>OldPoint.y = rtWnd.Height();<BR>if(!m_BaseFlag)<BR>{<BR>m_BaseFlag = TRUE;<BR>CDialog::OnInitDialog();<BR><BR>//************************************ <BR><BR>你只能在处修改和添加你所需主窗口初始化的代码<BR>……<BR>//************************************<BR>}<BR><BR>return TRUE;<BR>}</P>
 楼主| 发表于 2006-1-12 15:43:03 | 显示全部楼层
3.建立你的对话框和对话框类。 <BR>  用对话框资源编辑器完成对话框模板。用ClassWizard生成CyourDlg类此时基类只能为CDialog。<BR><BR>  4.修改基类CDialog为漂亮界面类(CtitleBarDlg)<BR><BR>  yourDlg.h yourDlg.cpp 内的CDialog都要改,用Edit/Replace功能快些且安全。<BR><BR>  在yourDlg.h还要包括TitleBarDlg.h<BR><BR>  <STRONG>注意</STRONG>:对话框构造函数第一个参数CtitleBarDlg nID 要删除。否则通Build通不过。<BR><BR>  5. 显示你的窗口<BR>
<>//显示代码<BR>CyouDlg *pMyDlg;<BR>pMyDlg = new CyouDlg;<BR>pMyDlg-&gt;Create(IDD_YOUR_DLG);<BR>pMyDlg-&gt;ShowWindow(SW_SHOW);</P><BR>  这种代码要在适当的时候delete pMyDlg,防内存泄露。由于 pMyDlg没有定义为全局,处理它有一定难度。如果是用DoModal()显示就好了,大家可以去试一下。解决了告诉我!<BR><BR>  6. 完成编译运行。你的对话框的风格是不是和主窗口一样,有没显示出来?<BR><BR><STRONG>二.说明</STRONG><BR><BR>  统一风格的漂亮界面基本达到了目的。但同样也存在几个问题:<BR><BR>  1.漂亮界面界必须是主窗口。我还没有想出方法能让它独立出来。<BR><BR>  2.显示其它子窗口只能是非模式对话框窗口方式。我尝试DoModal显示但没有成功。但我分析MFC后找到了笨方法,MFC也是这么做。<BR><BR>  3.基于述原因,我建立了统一的界面风格的开发模板,只有在此模板上开发就能实现软件漂亮统一的界面风格。需要可和我联系! 若有机会我会和大家继续探讨漂亮界面的实现的其它难点。<BR><BR><STRONG>三、结束语</STRONG><BR><BR>  源代码请参考源代码(<a href="http://www.pconline.com.cn/pcedu/empolder/gj/vc/0509/acc/05-09-12-vc.zip" target="_blank" >附件</A>)<BR>
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-6-22 20:56

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表