«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!

             ——既瑜


天气预报(南京)


我的分类(专题)

首页(183)
【趣味文摘】(22)
【五子连珠】(13)
【技术文档】(136)
【电脑技术】(6)
【疑难问题】(1)
【我的心情】(5)


最新日志
花语(中英文对照版)
各种花的花语
NTFS格式的7个精彩问答(pconli
童言无忌,有趣得一蹋
给MM修电脑的三个步骤[转载]
J2EE 面试题综合
JAVA编程规则
[转] P2P之UDP穿透NAT的原理与
[转]词法分析器
文件加密技术
一个让人发狂的PI求解C程序
[转]直线生成算法之DDA
[转]利用内核对象----互斥量实现应用
[转]如何正确的计算文件收发进度
双机调试VC程序
[转]分治法优化大整数乘法 C++实现
浮点数值的内存结构
[转]双链表实现大整数的加法与乘法[VC
拜占廷将军问题[转]
某人的挂QQ的程序源代码,虽然没用了,拿

最新回复
回复:vc中的CString的操作
回复:[转]分治法优化大整数乘法 C++
回复:[转]分治法优化大整数乘法 C++
回复:花语(中英文对照版)
回复:基本排序算法比较与选择[转载]
回复:c++中强制类型转换操作符小结
回复:c++中强制类型转换操作符小结
何必那么执着于是大头猫还是愤怒的小鸟,淡
回复:浮点数值的内存结构
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:32位位图到24位位图的转换
dren, ages 16 and 20
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:各种花的花语

留言板
签写新留言

不是0-1背包喔
桂花的花语``
谢谢
提议
提议

统计
blog名称:★既瑜★
日志总数:183
评论数量:636
留言数量:-25
访问次数:1406299
建立时间:2005年3月12日

链接


http://www.nju.edu.cn
http://bbs.nju.edu.cn 
http://www.t7-online.com
http://www.csdn.net
http://www.91f.net
http://www.crsky.com
我的MSN BLOG 

联系我

  OICQ:215768265
  njucs2001@hotmail.com
  erichoo1982@gmail.com

 

W3CHINA Blog首页    管理页面    写新日志    退出


[【技术文档】]在Windows95/98中实现苹果窗口界面
既瑜(224499) 发表于 2005/3/16 16:49:29

在Windows95/98中实现苹果窗口界面 高波 马惠业 有没有想过在Windows环境下实现苹果电脑窗口界面的风格?下面就以实现苹果电脑窗口风 格为例,进行一次奇妙的旅行。  原 理  仔细观察苹果窗口,发现和Windows窗口的区别主要体现在标题栏和控制按钮(即最小化、 恢复、关闭按钮)。所以我们应该把主要精力集中在这两点上,直接对Windows窗口已有的 标题栏和控制按钮进行修改。  由于标题栏和控制按钮都属于非客户区,所以关键是获得非客户区的CDC,可以通过GetWi ndowDC()来获得。GetWindowDC()可以获得整个窗口的CDC,当然也包括非客户区的CDC,得 到此CDC后,确定标题条的确切位置,就可以在标题栏上为所欲为了。如图1所示,在标题 栏的位置装入一幅位图(截取了苹果窗口的一幅位图),在位图上加上文字标题(此标题 具有3D效果,感觉还不错吧,其实就是把相同的字用不同的颜色和坐标写了两次)和控制 按钮(实际也是一幅位图,只不过在鼠标单击时显示另一幅位图,看起来就像是一个按钮 ),由于控制按钮是自己加的,所以要由自己负责单击按钮的处理。到此为止,虽然准备 好了窗口的标题栏和按钮,但还没有机会显示。我们知道要在窗口的客户区上画东东,只 需响应Windows的客户区重画消息,在此消息处理函数中实现具体的操作。同理,要在非客 户区上画东东,也只需响应Windows的非客户区重画消息,在消息处理函数中完成标题栏和 按钮的绘制。  具体实现  采用VC6.0在Windows98下实现这种技术。  下面以生成一个苹果界面风格的对话框为例对这种方法进行详细的阐述。  1、用APPWIZARD(应用程序向导)生成一个新的应用程序(SDI与MDI均可),在 RESOURC E VIEW里面添加一个DIALOG资源。  2、添加一个新的对话框类。在ClassWizard中选择添加新类,输入类名CTestDlg并且选取 基类CDIALOG。这样就建立起对话框类和对话框资源之间的联系。  3、在RESOURCE VIEW 中加入按钮和标题栏和背景位图。  在主菜单中的INSERT 菜单项下面选择RESOURCE,然后选择添加BITMAP,这样你就可以在R ESOURCEVIEW 中看到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 addmember 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_CXSMSIZE rect.top += GetSystemMetrics(SM_CYFRAME)+1; rect.bottom =rect.top +GetSystemMetrics(SM_CYSIZE)-4; rect.left =rect.right -GetSystemMetrics(SM_CXFRAME) -GetSystemMetrics(SM_CXS IZE))-1; 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 addmember 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(); }

阅读全文(2584) | 回复(0) | 编辑 | 精华


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144765464 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号