关于CPropertySheet类的编程

来源:百度文库 编辑:神马文学网 时间:2024/04/30 12:44:20
 关于CPropertySheet类的编程    

使用CPropertySheet类,在无模式状态下会有三个按钮(确认/取消/应用)  
我想改变三个按钮的标题,另还想增加按钮,  
不知如何实现?  
谢谢  
---------------------------------------------------------------  
 
为了最大限度的发挥属性页的效用,首先让我们先从  CPropertySheet  继承一个新类,取名为  CMyPropSheet.  
接着便可以进行下面的各种操作:  
 
 一、隐藏属性页默认按钮    
隐藏掉Apply应用按钮:    
 
propsheet.m_psh.dwFlags    ¦=  PSH_NOAPPLYNOW;  
或隐藏掉Cancel取消按钮:CWnd  *pWnd  =  GetDlgItem(  IDCANCEL  );  
pWnd->ShowWindow(  FALSE  );  
 
 二、移动属性页按钮  
首先,要获取按钮的句柄,然后就可以象对待窗体一样处理它们了.  下面代码先隐藏掉Apply和Help铵钮,再把OK和Cancel按移动到右侧。  BOOL  CMyPropSheet::OnInitDialog  ()    
{  
       BOOL  bResult  =  CPropertySheet::OnInitDialog();  
 
       int  ids  []  =  {IDOK,  IDCANCEL};//,  ID_APPLY_NOW,  IDHELP  };  
         
       //  Hide  Apply  and  Help  buttons  
       CWnd  *pWnd  =  GetDlgItem  (ID_APPLY_NOW);  
       pWnd->ShowWindow  (FALSE);  
       pWnd  =  GetDlgItem  (IDHELP);  
       pWnd->ShowWindow  (FALSE);  
         
       CRect  rectBtn;  
       int  nSpacing  =  6;                //  space  between  two  buttons...  
 
       for(  int  i  =0;  i  <  sizeof(ids)/sizeof(int);  i++)  
       {  
               GetDlgItem  (ids  [i])->GetWindowRect  (rectBtn);  
                 
               ScreenToClient  (&rectBtn);  
               int  btnWidth  =  rectBtn.Width();  
               rectBtn.left  =  rectBtn.left  +  (btnWidth  +  nSpacing)*  2;  
               rectBtn.right  =  rectBtn.right  +  (btnWidth  +  nSpacing)*  2;  
 
               GetDlgItem  (ids  [i])->MoveWindow(rectBtn);  
       }  
 
         
       return  bResult;  
}  
 
 
下面代码移动所有按钮到右侧,并且重新置属性页为合适的大小.BOOL  CMyPropSheet::OnInitDialog  ()    
{  
       BOOL  bResult  =  CPropertySheet::OnInitDialog();  
 
         
       int  ids[]  =  {  IDOK,  IDCANCEL,  ID_APPLY_NOW  };  
         
       CRect  rectWnd;  
       CRect  rectBtn;  
         
       GetWindowRect  (rectWnd);  
       GetDlgItem  (IDOK)->GetWindowRect  (rectBtn);  
         
       int  btnWidth  =  rectBtn.Width();  
       int  btnHeight  =  rectBtn.Height();  
       int  btnOffset  =  rectWnd.bottom  -  rectBtn.bottom;  
       int  btnLeft  =  rectWnd.right  -  rectWnd.left;  
 
       rectWnd.bottom  =  rectBtn.top;  
       rectWnd.right  =  rectWnd.right  +  btnWidth  +  btnOffset;  
       MoveWindow(rectWnd);  
         
       rectBtn.left  =  btnLeft;  
       rectBtn.right  =  btnLeft  +  btnWidth;  
 
       for  (int  i  =  0;  i  <  sizeof  (ids)  /  sizeof  (int);  i++)  
       {  
               rectBtn.top  =  (i  +  1)  *  btnOffset  +  btnHeight  *  i;  
               rectBtn.bottom  =  rectBtn.top  +  btnHeight;  
               GetDlgItem  (ids  [i])->MoveWindow  (rectBtn);  
       }  
         
       return  bResult;  
}  
 
 
 三、改变属性页上的标签文字  
首先修改TC_ITEM结构,然后用  SetItem  来修改标签文字,如下代码:TC_ITEM  item;  
item.mask  =  TCIF_TEXT;  
item.pszText  =  "New  Label";  
 
//Change  the  label  of  the  first  tab  (0  is  the  index  of  the  first  tab)...  
GetTabControl  ()->SetItem  (0,  &item);  
 
 四、改变属性页标签文字的字体属性  
代码如下m_NewFont.CreateFont  (14,  0,  0,  0,  800,  TRUE,  0,  0,  1,  0,  0,  0,  0,  _T("Arial")  );  
       GetTabControl()->SetFont  (&m_NewFont);  
 
 五、在属性页标签上显示位图    
可以用  CImageList  建立图像.  用  SetItem  来设置,如下代码所示:BOOL  CMyPropSheet::OnInitDialog  ()  
{  
       BOOL  bResult  =  CPropertySheet::OnInitDialog();  
 
       m_imageList.Create  (IDB_MYIMAGES,  13,  1,  RGB(255,255,255));  
       CTabCtrl  *pTabCtrl  =  GetTabControl  ();  
       pTabCtrl->SetImageList  (&m_imageList);  
         
       TC_ITEM  item;  
       item.mask  =  TCIF_IMAGE;  
       for  (int  i  =  0;  i  <  NUMBER_OF_TABS;  i++)  
       {  
               item.iImage  =  i;  
               pTabCtrl->SetItem  (i,  &item  );  
       }  
 
       return  bResult;  
}  
 
 
 六、在属性页左下角显示位图  
如下代码所示:  void  CMyPropSheet::OnPaint  ()    
{  
       CPaintDC  dc(this);  //  device  context  for  painting  
         
       int  nOffset  =  6;  
       //  load  IDB_BITMAP1  from  our  resources  
       CBitmap  bmp;  
       if  (bmp.LoadBitmap  (IDB_BITMAP1))  
       {  
               //  Get  the  size  of  the  bitmap  
               BITMAP  bmpInfo;  
               bmp.GetBitmap  (&bmpInfo);  
                 
               //  Create  an  in-memory  DC  compatible  with  the  
               //  display  DC  we''re  using  to  paint  
               CDC  dcMemory;  
               dcMemory.CreateCompatibleDC  (&dc);  
                 
               //  Select  the  bitmap  into  the  in-memory  DC  
               CBitmap*  pOldBitmap  =  dcMemory.SelectObject  (&bmp);  
                 
               //  Find  a  bottom-left  point  for  the  bitmap  in  the  client  area  
               CRect  rect;  
               GetClientRect  (&rect);  
               int  nX  =  rect.left  +  nOffset;  
               int  nY  =  rect.top  +  (rect.Height  ()  -  bmpInfo.bmHeight)  -  nOffset;  
                 
               //  Copy  the  bits  from  the  in-memory  DC  into  the  on-  
               //  screen  DC  to  actually  do  the  painting.  Use  the  centerpoint  
               //  we  computed  for  the  target  offset.  
               dc.BitBlt  (nX,  nY,  bmpInfo.bmWidth,  bmpInfo.bmHeight,  &dcMemory,    
                       0,  0,  SRCCOPY);  
                 
               dcMemory.SelectObject  (pOldBitmap);  
       }  
 
       //  Do  not  call  CPropertySheet::OnPaint()  for  painting  messages  
}  
 
 
 七、在属性页右下角显示3D文字Logo  
代码如下:void  CMyPropSheet::OnPaint  ()    
{  
       /////////////////////////////////////////////////////////////////////////  
           //在TAB按钮旁边显示3D文字提示,jingzhou  xu  
           Cstring  m_LogoName  =  “属性页”;  
//            if(m_LogoName  ==  "")  
//                        return;  
 
           GetWindowRect(rect);  
           ScreenToClient(rect);  
             
           LOGFONT  logFont;  
           ZeroMemory((void*)&logFont,sizeof(logFont));  
           strcpy(logFont.lfFaceName,"宋体");  
           logFont.lfHeight  =  -12;  
           logFont.lfWeight  =  400;  
           logFont.lfCharSet  =  GB2312_CHARSET;  
           logFont.lfOutPrecision  =  3;  
           logFont.lfClipPrecision  =  2;    
           logFont.lfQuality  =  1;  
           logFont.lfPitchAndFamily  =  2;  
           m_font.CreateFontIndirect(&logFont);  
           SetFont(&m_font);  
           CFont            *pOldFont  =  pDC->SelectObject(&m_font);  
 
                       rect.left  +=  6;  
                       rect.right  -=  6;  
                       rect.bottom  -=  1;  
                       rect.top  =  rect.bottom  -  ITEMBUTTON_HEIGHT  +  1;  
             
 
           CFont  m_LogoFont;  
           CString  sLogoString;  
                         
           m_LogoFont.CreateFont(rect.Height()*4/5,  0,  0,  0,  FW_BOLD,  1,  FALSE,  FALSE,  
                                   DEFAULT_CHARSET,  OUT_DEFAULT_PRECIS,  CLIP_DEFAULT_PRECIS,  DEFAULT_QUALITY,  
                                   FIXED_PITCH    ¦  FF_ROMAN,  "楷体_GB2312");  
                         
           sLogoString  =  m_LogoName;  
                         
           RECT  m_rDataBox;  
           CopyRect(&m_rDataBox,&rect);  
                         
           TEXTMETRIC  tm;  
           pDC->GetTextMetrics(&tm);  
           CFont*  oldFont  =  pDC->SelectObject(&m_LogoFont);  
           CSize  sz  =  pDC->GetTextExtent(sLogoString,  sLogoString.GetLength());  
           //用GetTextExtent来计算字体logo大小,依靠于设备环境,使用logo位于右下角  
           m_rDataBox.left  =  m_rDataBox.right    -  sz.cx  -  tm.tmAveCharWidth/2;  
           m_rDataBox.top    =  m_rDataBox.bottom  -  sz.cy  -  tm.tmHeight/5;  
           pDC->SetBkMode(TRANSPARENT);  
           //用3D字体显示,先黑后白,最后再用默认色  
           COLORREF  oldColor  =  pDC->SetTextColor(GetSysColor(COLOR_3DDKSHADOW));  
           pDC->DrawText(sLogoString,  sLogoString.GetLength(),  &m_rDataBox,  DT_VCENTER    ¦  DT_SINGLELINE    ¦  DT_CENTER);  
           m_rDataBox.left  -=  tm.tmAveCharWidth;  
           pDC->SetTextColor(GetSysColor(COLOR_3DHILIGHT));  
           pDC->DrawText(sLogoString,  sLogoString.GetLength(),  &m_rDataBox,  DT_VCENTER    ¦  DT_SINGLELINE    ¦  DT_CENTER);  
           m_rDataBox.left  +=  3*tm.tmAveCharWidth/5;  
           pDC->SetTextColor(RGB(0,0,255));  
           pDC->DrawText(sLogoString,  sLogoString.GetLength(),  &m_rDataBox,  DT_VCENTER    ¦  DT_SINGLELINE    ¦  DT_CENTER);  
                         
           //释放资源  
           pDC->SelectObject(oldFont);  
           pDC->SetTextColor(oldColor);        
           m_LogoFont.DeleteObject();  
           /////////////////////////////////////////////////////////////////////////  
}  
 
 八、在属性页中动态加入其它控件  
下面演示如何在左下角加入一Edit控件:  
MyPropSheet.h中:public:  
       CEdit  m_edit;  
 
MyPropSheet.cpp中:BOOL  CMyPropSheet::OnInitDialog  ()  
{  
       BOOL  bResult  =  CPropertySheet::OnInitDialog  ();  
 
         
       CRect  rect;  
         
       int  nHeight  =  24;  
       int  nWidth  =  120;  
       int  nOffset  =  6;  
         
       GetClientRect  (&rect);  
 
       //  Find  a  bottom-left  point  for  the  edit  control  in  the  client  area  
       int  nX  =  rect.left  +  nOffset;  
       int  nY  =  rect.top  +  (rect.Height()  -  nHeight)  -  nOffset;  
         
       //  finally  create  the  edit  control  
       m_Edit.CreateEx  (WS_EX_CLIENTEDGE,  _T("EDIT"),  NULL,  
                                         WS_CHILD    ¦  WS_VISIBLE    ¦  WS_TABSTOP    ¦  WS_BORDER,    
               nX,  nY,  nWidth,  nHeight,  m_
 

MSDN say:

BOOL CMySheet::OnInitDialog()
{
     CPropertySheet::OnInitDialog();

     RECT rc;

     // resize the sheet
     GetWindowRect (&rc);
     ScreenToClient (&rc);
     rc.right += 50;
     rc.bottom += 50;
     MoveWindow (&rc);

     // resize the CTabCtrl
     CTabCtrl* pTab = GetTabControl ();
     ASSERT (pTab);
     pTab->GetWindowRect (&rc);
     ScreenToClient (&rc);
     rc.right += 50;
     rc.bottom += 50;
     pTab->MoveWindow (&rc);

     // resize the page
     CPropertyPage* pPage = GetActivePage ();
     ASSERT (pPage);
     // store page size in m_PageRect
     pPage->GetWindowRect (&m_PageRect);
     ScreenToClient (&m_PageRect);
     m_PageRect.right += 50;
     m_PageRect.bottom += 50;
     pPage->MoveWindow (&m_PageRect);

     // move the OK, Cancel, and Apply buttons
     CWnd* pWnd = GetDlgItem(IDOK);
     pWnd->GetWindowRect(&rc);
     rc.bottom += 50;
     rc.top += 50;
     ScreenToClient(&rc);
     pWnd->MoveWindow(&rc);

     pWnd = GetDlgItem(IDCANCEL);
     pWnd->GetWindowRect(&rc);
     rc.bottom += 50;
     rc.top += 50;
     ScreenToClient(&rc);
     pWnd->MoveWindow(&rc);

     pWnd = GetDlgItem(ID_APPLY_NOW);
     pWnd->GetWindowRect(&rc);
     rc.bottom += 50;
     rc.top += 50;
     ScreenToClient(&rc);
     pWnd->MoveWindow(&rc);

     CenterWindow();

     return TRUE;
}