高波 马惠业
有没有想过在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()
关键词:在Windows95/98中完成苹果窗口界面