`
happmaoo
  • 浏览: 4547584 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

---===在Windows95/98中实现苹果窗口界面(vc6)===---

阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

在Windows95/98中实现苹果窗口界面


高波 马惠业


有没有想过在Windows环境下实现苹果电脑窗口界面的风格?下面就以实现苹果电脑窗口风格为例,进行一次奇妙的旅行。
原 理
仔细观察苹果窗口,发现和Windows窗口的区别主要体现在标题栏和控制按钮(即最小化、恢复、关闭按钮)。所以我们应该把主要精力集中在这两点上,直接对Windows窗口已有的标题栏和控制按钮进行修改。
由于标题栏和控制按钮都属于非客户区,所以关键是获得非客户区的CDC,可以通过GetWindowDC()来获得。GetWindowDC()可以获得整个窗口的CDC,当然也包括非客户区的CDC,得到此CDC后,确定标题条的确切位置,就可以在标题栏上为所欲为了。如图1所示,在标题栏的位置装入一幅位图(截取了苹果窗口的一幅位图),在位图上加上文字标题(此标题具有3D效果,感觉还不错吧,其实就是把相同的字用不同的颜色和坐标写了两次)和控制按钮(实际也是一幅位图,只不过在鼠标单击时显示另一幅位图,看起来就像是一个按钮),由于控制按钮是自己加的,所以要由自己负责单击按钮的处理。到此为止,虽然准备好了窗口的标题栏和按钮,但还没有机会显示。我们知道要在窗口的客户区上画东东,只需响应Windows的客户区重画消息,在此消息处理函数中实现具体的操作。同理,要在非客户区上画东东,也只需响应Windows的非客户区重画消息,在消息处理函数中完成标题栏和按钮的绘制。
具体实现
采用VC6.0在Windows98下实现这种技术。
下面以生成一个苹果界面风格的对话框为例对这种方法进行详细的阐述。
1、用APPWIZARD(应用程序向导)生成一个新的应用程序(SDI与MDI均可),在 RESOURCE VIEW里面添加一个DIALOG资源。
2、添加一个新的对话框类。在ClassWizard中选择添加新类,输入类名CTestDlg并且选取基类CDIALOG。这样就建立起对话框类和对话框资源之间的联系。
3、在RESOURCE VIEW 中加入按钮和标题栏和背景位图。
在主菜单中的INSERT 菜单项下面选择RESOURCE,然后选择添加BITMAP,这样你就可以在RESOURCEVIEW 中看到BITMAP项,下面点击鼠标右键,选择IMPORT,从已有的位图文件中选出苹果风格的按钮和标题栏,并且分别赋予不同的ID。
4、在自己创建的CTestDlg类中添加新的按钮和新的标题栏。
(1)首先在CTestDlg的构造函数中装入位图资源。程序如下:
CTestDlg::CTestDlg(int nID,
CWnd* pParent /*=NULL*/)
: CDialog(nID, pParent)
{
//{{AFX_DATA_INIT(CTestDlg)
// NOTE: the ClassWizard will add
member initialization here
//}}AFX_DATA_INIT
m_bPressed=FALSE;
//load the bitmap of button_down
m_bitmapPressed.LoadBitmap(IDB_BUTTONDOWN);
//load the bitmap of button_up
m_bitmapUnpressed.LoadBitmap(IDB_BUTTONUP);
//load the bitmap of caption
m_bitmapCaption.LoadBitmap(IDB_CAPTION);
//load the bitmap of background
m_bmpBk.LoadBitmap(IDB_BKGROUND);
}
(2)分别得到标题栏和按钮的位置。
首先得到按钮的位置:
void CTestDlg::GetButtonRect(CRect& rect)
{
GetWindowRect(&rect);
// for small caption use SM_CYDLGFRAME
rect.top += GetSystemMetrics(SM_CYFRAME)+1;
// for small caption use SM_CYSMSIZE
rect.bottom =rect.top +GetSystemMetrics
(SM_CYSIZE)-4;
// for small caption use SM_CXDLGFRAME
rect.left =rect.right -GetSystemMetrics
(SM_CXFRAME) -
// for small caption use SM_CXSMSIZE
GetSystemMetrics(SM_CXSIZE))-1;
// for small caption use SM_CXSMSIZE
rect.right =rect.left +GetSystemMetrics
(SM_CXSIZE)-3;
}
然后得到标题栏的位置:
void CTestDlg::GetCaptionRect(CRect &rect)
{
GetWindowRect(&rect);
// for small caption use SM_CYSMSIZE
rect.bottom =rect.top +GetSystemMetrics
(SM_CYSIZE)+3;
}
5.在按钮和标题栏对应的位置上分别画出苹果风格的按钮和标题栏。
首先画出按钮:
void CTestDlg::DrawButton()
{
// if window isn't visible or is minimized, skip
if (!IsWindowVisible() || IsIconic())
return;
// get appropriate bitmap
CDC memDC;
CDC* pDC = GetWindowDC();
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(m_bPressed ?
&m_bitmapPressed : &m_bitmapUnpressed);
// get button rect and convert it into non
-client area coordinates
CRect rect, rectWnd;
GetButtonRect(rect);
GetWindowRect(rectWnd);
rect.OffsetRect(-rectWnd.left, -rectWnd.top);
int width,height;
BITMAP *pBitMap;
pBitMap = new BITMAP;
if (m_bPressed)
m_bitmapPressed.GetBitmap(pBitMap);
else
m_bitmapUnpressed.GetBitmap(pBitMap);
width=pBitMap->bmWidth;
height=pBitMap->bmHeight;
// draw it
pDC->StretchBlt( rect.left, rect.top, rect.Width(),
rect.Height(), &memDC, 0, 0,
width,height,SRCCOPY );
memDC.DeleteDC();
ReleaseDC(pDC);
delete pBitMap;
}
然后画出标题栏:
void CTestDlg::DrawCaption()
{
if (!IsWindowVisible() || IsIconic())
return;
// get appropriate bitmap
CDC memDC;
CDC* pDC = GetWindowDC();
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(m_bitmapCaption);
// get button rect and convert it into non
-client area coordinates
CRect rect, rectWnd;
GetCaptionRect(rect);
GetWindowRect(rectWnd);
rect.OffsetRect(-rectWnd.left, -rectWnd.top);
// draw the caption
int width,height;
BITMAP *pBitMap;
pBitMap = new BITMAP;
m_bitmapCaption.GetBitmap(pBitMap);
width=pBitMap->bmWidth;
height=pBitMap->bmHeight;
pDC->StretchBlt( rect.left, rect.top, rect.Width(),
rect.Height(), &memDC, 0, 0, width,
height, SRCCOPY );
//get the the text of the caption and
draw it with 3D style
pDC->SetBkColor(RGB(209,209,209));
CString caption;
GetWindowText(caption);
caption = “ "+caption+“ ";
rect.OffsetRect(0,4);
//draw the text of the caption with gray color
pDC->SetTextColor(RGB(128,128,128));
pDC->DrawText
(caption,rect,DT_CENTER|DT_VCENTER);
//move the coordinate to left and up
rect.OffsetRect(-1,-1);
pDC->SetBkMode(TRANSPARENT);
//draw the text of the caption with white color
pDC->SetTextColor(RGB(255,255,255));
//255,255,255 128,128,128
pDC->DrawText
(caption,rect,DT_CENTER|DT_VCENTER);
memDC.DeleteDC();
ReleaseDC(pDC);
delete pBitMap;
}
6.处理鼠标点击按钮的消息。
要响应鼠标左键在标题栏上的单击,需要添加相应的消息映射函数。
通过在OnNcLButtonDown中给关闭按钮换一副图像,来实现按钮被按下的效果,同时完成窗口的关闭。
void CTestDlg::OnNcLButtonDown
(UINT nHitTest, CPoint point)
{
if (nHitTest == HTCAPTION)
{
// see if in area we reserved for button
CRect rect;
GetButtonRect(rect);
if (rect.PtInRect(point))
{
m_bPressed = !m_bPressed;
DrawButton();
CDialog::OnCancel();
}
}
CDialog::OnNcLButtonDown(nHitTest, point);
}
7.处理窗口非客户区的重画。
这里主要是对标题栏和按钮的重画。通过ClassWizard给对话框添加非客户区重画的消息映射函数。
void CTestDlg::OnNcPaint()
{
// draw caption first
CDialog::OnNcPaint();
// then draw button on top
DrawCaption();
DrawButton();
}
8.给对话框加上背景,在此为一幅位图:
void CTestDlg::OnPaint()
{
CPaintDC dc(this);
// device context for painting
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(m_bmpBk);
CRect rect, rectWnd
GetWindowRect(rect);
GetClientRect(rect);
int width,height;
BITMAP *pBitMap;
pBitMap = new BITMAP;
m_bmpBk.GetBitmap(pBitMap);
width=pBitMap->bmWidth;
height=pBitMap->bmHeight;
dc.StretchBlt( rect.left, rect.top, rect.Width(),
rect.Height(),
&memDC, 0, 0,width,height, SRCCOPY );
}
至此为止,一个具有苹果窗口风格的对话框就新鲜出炉了!怎么样?味道还不错吧?
但是,如果每次要用到对话框的时候都如此这般,岂不是太...那个了吧!不要惊慌,只需稍做改变就可一劳永逸了。将此对话框的构造函数的说明部分改为下面黑体所示即可,就这么简单。(用黑体表示强调的部分)
CTestDlg::CTestDlg(int nID, CWnd
* pParent /*=NULL*/)
: CDialog(nID, pParent)
{
//{{AFX_DATA_INIT(CTestDlg)
// NOTE: the ClassWizard will add
member initialization here
//}}AFX_DATA_INIT
m_bPressed=FALSE;
m_bitmapPressed.LoadBitmap
(IDB_BUTTONDOWN);
m_bitmapUnpressed.LoadBitmap
(IDB_BUTTONUP);
m_bitmapCaption.LoadBitmap(IDB_CAPTION);
m_bmpBk.LoadBitmap(IDB_BKGROUND);
m_brushButton.CreateSolidBrush
(RGB(192,192,255));
}
以后,凡是用到对话框的时候,在VC的资源编辑器中把对话框设置好,把父类改为此对话框类即可,当然,要把此对话框类包括在你的Project中,图1所示的对话框就是继承于此对话框。
在CMyDialog的.h文件中将CDialog 改为CTestDlg:
Class CMyDialog: public CTestDlg
void CNewapple1Doc::OnDialog1()
{
// TODO: Add your command handler code here
CMyDialog dlg;
dlg.DoModal();
}


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=5681


分享到:
评论

相关推荐

    vc换肤,制作仿苹果电脑的窗口界面

    当我们谈论“vc换肤”和“制作仿苹果电脑的窗口界面”时,这涉及到使用Visual C++这一强大的编程环境来实现对应用程序外观的定制,旨在创建类似Mac OS X系统的视觉效果。以下是一些关于这个主题的关键知识点: 1. *...

    VC6风格界面

    ...................\在Windows95,98中实现苹果窗口界面.doc ...................\在单文档中添加系统菜单项.doc ...................\在单文档程序中动态切换多个窗体.doc ...................\在对话框上加...

    VC语言 MFC界面实现 苹果棋小游戏 源代码

    在这个场景中,我们讨论的是使用VC++编程语言,结合MFC(Microsoft Foundation Classes)库来实现苹果棋的小游戏源代码。 首先,VC++是微软公司开发的一种集成开发环境,它基于C++编程语言,提供了丰富的功能和工具...

    2种方案的VC 界面换肤模块.rar

     加载皮肤文件实现界面换肤:选择“界面修改”/“加载界面文件”命令,在打开的窗口中选择皮肤文件(.ski),即可更换界面皮肤.  另外还有加载组件库实现界面换肤,使用的是WndDll.dll,请下载源码具体测试吧。  ...

    vc实现界面换肤模块

    在实现界面换肤时,我们需要对MFC中的CWnd、CDC、CBrush等类有深入理解,这些类分别代表窗口、设备上下文和画刷,是绘制界面的基础。 2. **自定义控件绘图**: 换肤的关键在于控件的自定义绘制。我们需要覆盖控件...

    VC2008实现仿苹果工具栏

    在实现过程中,我们可以遵循以下步骤: 1. **创建工程**:在VC2008中新建一个MFC应用程序,选择对话框应用程序或者基于窗口的应用程序。 2. **引入GDI+支持**:在工程中包含GDI+的头文件,如gdiplus.h,并链接相应...

    VC苹果mac工具栏

    在开发针对苹果Mac平台的应用程序时,Visual Studio (VC) 提供了跨平台支持,使得开发者可以使用相同的代码库在Windows和Mac上构建应用。"VC苹果mac工具栏"是这个话题的核心,它涉及到如何在Mac应用中创建和管理...

    Swift编程-UI控件-TabBarController(一)

    在Swift编程中,UI控件是构建iOS应用界面的关键元素,而TabBarController是苹果iOS SDK中的一个核心组件,用于实现底部导航栏的切换效果。在这个“Swift编程-UI控件-TabBarController(一)”的视频教程中,我们将深入...

    VC 实例 标题栏与菜单栏.rar

    在VC++编程环境中,MFC(Microsoft Foundation Classes)是一个强大的库,它为Windows应用程序开发提供了便利。本实例“VC 实例 标题栏与菜单栏”着重探讨如何使用MFC来实现应用程序的标题栏和菜单栏功能。这些是...

    PIPTest.zip

    在Objective-C中实现PiP功能,首先需要理解苹果提供的AVFoundation框架,它是iOS多媒体处理的核心。AVPlayer和AVPlayerLayer是AVFoundation中的关键组件,用于播放视频。当用户希望开启PiP模式时,我们可以创建一个...

    NAO机器人深层开发的环境搭建

    - **2.3** 在环境变量窗口中,新建一个系统变量,命名为`PYTHONPATH`,值设置为`C:\Program Files\Aldebaran\SDK1.6.0\lib`。 - **2.4** 测试环境变量是否正确配置:打开Python IDLE工具,尝试导入`naoqi`模块,如果...

    C++消消乐小游戏 windows程序设计课程设计

    C++消消乐小游戏是一款基于Windows平台,利用VC6环境下的Win32 API开发的趣味性编程项目,旨在提升开发者对C++语言和Windows系统编程的理解。在这个项目中,开发者不仅需要掌握基本的C++语法,还要熟悉Windows API...

    VC俄罗斯方块源码(自己写的)VS2010的工程

    5. **图形界面**:使用WinAPI或MFC库创建窗口,绘制方块和游戏板,处理窗口消息。 6. **算法实现**:包括方块生成算法、方块旋转算法、碰撞检测算法和行消除算法。 7. **数据结构**:可能使用二维数组或自定义的数据...

    自动平移所有窗口,视图和控件

    标题中的“自动平移所有窗口,视图和控件”是指在编程中实现的一种功能,它允许用户在界面上通过某种交互方式(如鼠标或键盘)使得程序中的窗口、视图或者控件自动移动,以适应不同的显示需求。这种功能在多窗口或多...

    visual c++ VC++制作 矩形圆角按钮.zip

    2. **MacButtons.cpp**: 可能包含实现苹果Mac风格按钮的代码,尽管在Windows平台上,可能是为了模拟Mac OS的外观和感觉。 3. **LCMailerDlg.cpp**: 对话框类的实现,通常处理与对话框相关的用户交互,包括按钮点击等...

    动画对话框窗口

    标题中的“动画对话框窗口”指的是在计算机图形用户界面中,使用动画效果来增强对话框窗口的视觉表现力和用户体验的技术。这种技术通常应用于软件开发,尤其是使用C++、Objective-C这类编程语言进行Windows平台应用...

    扩展拆分器窗口类

    标题中的“扩展拆分器窗口类”指的是在编程中,特别是在Windows应用程序开发中,使用的一种特殊类型的窗口控件。拆分器窗口(Splitter Window)通常用于将一个窗口区域分割成两个或更多个独立的部分,用户可以动态...

    TabBar Demo

    在iOS应用开发中,`TabBar`是一种常见的用户界面元素,用于展示多个主要功能选项,让用户可以方便地在不同的视图之间切换。本`TabBar Demo`是Objective-C(简称OC)实现的一个示例,旨在帮助开发者理解并掌握`TabBar...

    iOS开发中控制屏幕旋转的编写方法小结

    在iOS开发中,控制屏幕旋转是一项常见的需求,特别是在构建用户界面时,为了提供良好的用户体验,开发者需要能够根据应用的需求来限制或允许用户设备的横竖屏切换。在不同的iOS版本中,实现这一功能的方法有所不同。...

Global site tag (gtag.js) - Google Analytics