资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 软件开发 >
Advertisement
文章正文

长久的困惑:如何自己绘制 标题栏 上的系统按钮!

类型:转载   责任编辑:asp.net   日期:2007/05/23


热门软件下载:


   

如何自己绘制标题栏上的   最小化,最大化和关闭按钮?或者自己添加一个按钮。  
   
  前提:  
          1.不使用第三方的东西。  
          2.不使用用热点。  
          3.保留原窗口的风格:即拥有WS_CAPTION,WS_MENU   ......  
          4.如果使用hook,请告知哪个API

网友回答:

发表者:DentistryDoctor

WM_NCPAINT

发表者:roger_ding

在WM_NCPAINT里直接返回,可以看到上面得button都不会出现了,所以在这个消息里自己画就好了

发表者:snaill

屏蔽系统按钮实在是个比较麻烦的问题,以前见过几个例子都是你说的情况,移动就出来了  
  刚才看有人问怎么屏蔽,有这样的回答,你可以试试  
  CMenu*   pSysMenu   =   GetSystemMenu(FALSE);  
  if   (   pSysMenu   !=   NULL   )  
  {  
  pSysMenu->ModifyMenu(SC_CLOSE,   MF_BYCOMMAND|MF_GRAYED);  
  }  
   
  另外的办法就是做一个没有caption的窗口,然后自己画,并处理HitTest,比较麻烦不过如果没什么事还是很长经验的:〉

发表者:DentistryDoctor

VC知识库在线杂志      
   
   
     [   本文属于第13期,   适合中级读者   ]  
   
  美化你的应用程序的外观界面    
  作者:桂林电子工业学院990312 隋振国    
  下载本文源程序1  
      
    二、定义全局变量及函数:  
   
       CRect   m_rtButtExit; //关闭按钮位置  
     CRect   m_rtButtMax; //最大化按钮位置  
     CRect   m_rtButtMin; //最小化按钮位置  
     CRect   m_rtButtHelp; //帮助按钮位置  
     CRect   m_rtIcon; //图标位置  
     void   DrawTitleBar(CDC   *pDC); //画非客户区主函数  
    三、函数实现:  
    本例需要对以下消息进行重载DefWindowProc、ON_WM_NCMOUSEMOVE、ON_WM_NCLBUTTONDOWN。  
    函数实现体如下:    
  //主函数,可根据实际情况进行自绘窗体void   CTitleBarDlg::DrawTitleBar(CDC   *pDC)      
            {  
            if   (m_hWnd)  
            {  
            CBrush   Brush(RGB(0,100,255));  
            CBrush*   pOldBrush   =   pDC->SelectObject(&Brush);  
            CRect   rtWnd,   rtTitle,   rtButtons;  
            GetWindowRect(&rtWnd);  
            ……………………………..  
            //因代码过长,未贴,见源程序  
            ……………………………...  
            }  
            }  
     
  //将消息进行过滤,对可能影响界面初始及更新的消息,产生重画消息执行DrawTitleBar函数   LRESULT   CTitleBarDlg::DefWindowProc(UINT   message,   WPARAM   wParam,   LPARAM   lParam)    
            {  
            LRESULT   lrst=CDialog::DefWindowProc(message,   wParam,   lParam);  
            if   (!::IsWindow(m_hWnd))  
            return   lrst;  
            if   (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||  
            message==   WM_NCACTIVATE   ||message   ==   WM_NOTIFY)  
            {  
            CDC*   pWinDC   =   GetWindowDC();  
            if   (pWinDC)  
            DrawTitleBar(pWinDC);  
            ReleaseDC(pWinDC);  
            }  
            return   lrst;  
            }  
   
  //实现标题栏按钮的鼠标移动效果   void   CTitleBarDlg::OnNcMouseMove(UINT   nHitTest,   CPoint   point)    
            {  
            CDC*   pDC   =   GetWindowDC();  
            if   (pDC)  
            {  
            ……………………………..  
            //因代码过长,未贴,见源程序  
            ……………………………...  
            }  
            ReleaseDC(pDC);  
            CDialog::OnNcMouseMove(nHitTest,   point);  
            }  
   
  //实现非客户区,用户鼠标点击操作   void   CTitleBarDlg::OnNcLButtonDown(UINT   nHitTest,   CPoint   point)    
            {  
            //检测各按钮是否按到  
            if   (m_rtIcon.PtInRect(point))  
            AfxMessageBox("欢迎访问FlySnowStdio主页");  
            else   if   (m_rtButtHelp.PtInRect(point))  
            SendMessage(WM_HELP);  
            else   if   (m_rtButtExit.PtInRect(point))  
            SendMessage(WM_CLOSE);  
            else   if   (m_rtButtMin.PtInRect(point))  
            SendMessage(WM_SYSCOMMAND,   SC_MINIMIZE,   MAKELPARAM(point.x,   point.y));  
            else   if   (m_rtButtMax.PtInRect(point))  
            {  
            if   (IsZoomed())  
            SendMessage(WM_SYSCOMMAND,   SC_RESTORE,   MAKELPARAM(point.x,   point.y));  
            else  
            {  
            SendMessage(WM_SYSCOMMAND,   SC_MAXIMIZE,   MAKELPARAM(point.x,   point.y));  
            Invalidate();  
            }  
            }  
            else   if   (!IsZoomed())  
            Default();  
            }  
   
    四、总结  
  本例为对话框应用程序,单文档的基本原理也相似。对于包含菜单项的程序,可以采用自画菜单,将整个程序的界面融为一体,在此不做过多介绍,本人已经完成,请与我联系。如果你想使你的程序更漂亮,也可以尽情放至贴图到背景上,愿你的程序多姿多彩。本文是在百忙中匆匆完成,错误之处希望大家批评指正!    
   
  上述程序在Win2000   Advanced   Server   +   VC6   +   SP5   2002.3下编译运行通过。Win98测试顺利运行。      
     
 

发表者:huaboy408

不知道你用的是哪个版本的MSN,没什么特别之处啊,就是对话框上面的菜单啊

发表者:codewarrior

两种办法,其一,就是把对话框的风格设成没有标题栏,你自己在客户区画,这个方法可以参考网上关于如何模拟金山毒霸的界面的帖子。  
  其二,就是在WM_NCPAINT里面自己绘制,不过如果是frame窗口的话,需要设置风格,否则系统的关闭按钮会坚持不懈地跑出来捣乱。  
  最后,一个小tip,DC有一个DramFrameControl函数,可以方便地画那些按钮。

发表者:roger_ding

GetSystemMenu可以得到系统菜单,TrackPopupMenu   就可以了

发表者:zhoujiamurong

mark

发表者:ywybetter

顶一下

发表者:bugbugbug

我也碰到相同的问题,对了各位有谁做过一体化菜单阿。


 

 
热门推荐笔记本: LG笔记本
相关文章:
webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
©2007 popbb.net All Rights Reserved