设为首页 加入收藏

TOP

1.10 开发技巧与难点分析(4)
2013-10-07 13:27:38 来源: 作者: 【 】 浏览:80
Tags:1.10 开发 技巧 难点 分析

1.10  开发技巧与难点分析(4)

(14)在对话框的WM_SIZE消息中添加代码,当对话框的大小改变时重新绘制对话框的标题、边框及按钮。代码如下:

  1. CPoint pos(30,1);  
  2. m_MinRect.CopyRect(CRect(m_RTitleRc.left+pos.x
    ,(m_TitleDrawHeight   
  3.     +2*m_BorderHeight -m_ButtonHeight)/2+pos.y,
    m_ButtonWidth,m_ButtonHeight));  //最小化按钮区域  
  4. pos.x = 55;  
  5. m_MaxRect.CopyRect(CRect(m_RTitleRc.left+pos.x,
    (m_TitleDrawHeight  
  6.     +2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_
    ButtonWidth,m_ButtonHeight));  //最大化按钮区域  
  7. pos.x = 80;  
  8. m_CloseRect.CopyRect(CRect(m_RTitleRc.left+pos.x,
    (m_TitleDrawHeight  
  9.     +2*m_BorderHeight -m_ButtonHeight)/2+pos.y,m_
    ButtonWidth,m_ButtonHeight));  //关闭按钮区域  
  10. Invalidate();     

(15)处理对话框的WM_NCMOUSEMOVE消息,当鼠标移动到标题栏按钮上时,绘制标题栏按钮的热点效果;当鼠标离开标题栏按钮时,恢复标题栏按钮原来的效果。代码如下:

  1. void CCaptureDlg::OnNcMouseMove(UINT nHitTest, CPoint point)   
  2. {  
  3.     CRect tempMin,tempMax,tempClose,ClientRect;  
  4.     CWindowDC WindowDC (this);                   
    //CWindowDC类对象  
  5.     CDC memDC;  
  6.     memDC.CreateCompatibleDC(&WindowDC);      
    //创建内存设备环境  
  7.     BITMAPINFO bInfo;   
  8.     CBitmap LeftLine;  
  9.     int x,y;  
  10.     GetWindowRect(ClientRect);   
  11.     tempMin.CopyRect(CRect(m_MinRect.left+ ClientRect.left,ClientRect.top  
  12.         +m_MinRect.top,m_MinRect.right+m_MinRect.left+ ClientRect.left,  
  13.         m_MinRect.bottom+m_MinRect.top+ClientRect.top));
    //设置最小化按钮区域  
  14.     tempMax.CopyRect(CRect(m_MaxRect.left+ ClientRect.left,ClientRect.top  
  15.         +m_MaxRect.top,m_MaxRect.right+m_MaxRect.left+ ClientRect.left,  
  16.         m_MaxRect.bottom+m_MaxRect.top+ClientRect.top));
    //设置最大化按钮区域  
  17.     tempClose.CopyRect(CRect(m_CloseRect.left+ ClientRect.left,ClientRect.top  
  18.         +m_CloseRect.top,m_CloseRect.right+m_CloseRect.left+ ClientRect.left,  
  19.         m_CloseRect.bottom+m_CloseRect.top+ClientRect.top));
    //设置关闭按钮区域  
  20.     if(tempMin.PtInRect(point))                    
    //鼠标在最小化按钮上移动时,更改按钮显示的位图  
  21.     {  
  22.         if(m_ButtonState != bsMin)  
  23.         {  
  24.             LeftLine.LoadBitmap(IDB_MINHOTBT)           ; 
    //加载最小化按钮位图资源  
  25.             LeftLine.GetObject(sizeof(bInfo),&bInfo);
  26.             x = bInfo.bmiHeader.biWidth;             
    //获得位图宽度  
  27.             y = bInfo.bmiHeader.biHeight;            
    //获得位图高度  
  28.             memDC.SelectObject(&LeftLine);  
  29.             WindowDC.StretchBlt(m_MinRect.left,
    m_MinRect.top,m_MinRect.right,  
  30.                 m_MinRect.bottom,&memDC,0,0,x,y,SRCCOPY); 
    //绘制最小化按钮  
  31.             m_IsDrawForm = FALSE;  
  32.             m_ButtonState = bsMin;    
  33.             LeftLine.Detach();  
  34.         }  
  35.     }  
  36.     else if(tempMax.PtInRect(point))  
  37.     {  
  38.         if(m_ButtonState!=bsMax && m_ButtonState!=bsRes)  
  39.         {  
  40.             LeftLine.LoadBitmap(IDB_MAXHOTBT);         
    //加载最大化按钮位图资源  
  41.             LeftLine.GetObject(sizeof(bInfo),&bInfo);  
  42.             x = bInfo.bmiHeader.biWidth;               
    //获得位图宽度  
  43.             y = bInfo.bmiHeader.biHeight;            
    //获得位图高度  
  44.             memDC.SelectObject(&LeftLine);  
  45.             WindowDC.StretchBlt(m_MaxRect.left,m_MaxRect.
    top,m_MaxRect.right,  
  46.                 m_MaxRect.bottom,&memDC,0,0,x,y,SRCCOPY); 
    //绘制最大化按钮  
  47.             m_IsDrawForm = FALSE;  
  48.             if (m_IsMax)  
  49.             {  
  50.                 m_ButtonState = bsMax;  
  51.             }  
  52.             else  
  53.             {  
  54.                 m_ButtonState = bsRes;  
  55.             }  
  56.             LeftLine.Detach();  
  57.         }  
  58.     }  
  59.     else if(tempClose.PtInRect(point))  
  60.     {  
  61.         if(m_ButtonState != bsClose)  
  62.         {  
  63.             LeftLine.LoadBitmap(IDB_CLOSEHOTBT);       
    //加载关闭按钮位图资源  
  64.             LeftLine.GetObject(sizeof(bInfo),&bInfo);  
  65.             x = bInfo.bmiHeader.biWidth;               
    //获得位图宽度  
  66.             y = bInfo.bmiHeader.biHeight;           
    //获得位图高度  
  67.             memDC.SelectObject(&LeftLine);  
  68.             WindowDC.StretchBlt(m_CloseRect.left,
    m_CloseRect.top,m_CloseRect.right,  
  69.                 m_CloseRect.bottom,&memDC,0,0,x,y,SRCCOPY);     //绘制关闭按钮  
  70.             m_IsDrawForm = FALSE;  
  71.             m_ButtonState = bsClose;  
  72.             LeftLine.Detach();    
  73.         }  
  74.     }  
  75.     else  
  76.     {  
  77.         if(m_IsDrawForm == FALSE)  
  78.         {  
  79.             if(m_ButtonState == bsMin)  
  80.                 DrawDialog( FMINBUTTON);           
    //重绘最小化按钮  
  81.             else if(m_ButtonState == bsClose)  
  82.                 DrawDialog( FCLOSEBUTTON);                      //重绘关闭按钮  
  83.             else if(m_ButtonState == bsMax || 
    m_ButtonState==bsRes)  
  84.                 DrawDialog( FMAXBUTTON);                        //重绘最大化按钮  
  85.         }  
  86.         m_ButtonState = bsNone;  
  87.     }  
  88.     LeftLine.DeleteObject();  
  89.     ReleaseDC(&memDC);  
  90.     CDialog::OnNcMouseMove(nHitTest, point);  
  91. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.10 开发技巧与难点分析(5) 下一篇1.5 主窗体设计(9)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: