程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 深入淺出CPropertySheet

深入淺出CPropertySheet

編輯:關於VC++

為了最大限度的發揮屬性頁的效用,首先讓我們先從 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字體顯示,先黑後白,最後再用默認色 本文發表於http://bianceng.cn(編程入門網)
   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_hWnd, 0, 0 );
   return bResult;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved