學習 VS2010編程經典示例


示例一  自制對話框添加頁面

目的在於給自制對話框添加自己的頁面,在生成的VC多視窗系統或者單視窗系統中,自動會有菜單View->Toolbars->Customize將彈出設置對話框進行設置,本例主要在此對話框中添加自己的對話框。

(1)      利用VS2010嚮導生成視窗形式的對話框;

(2)      利用添加資源的方式添加屬於自己的對話框;

(3)       針對該對話框建立類,基類爲CPropertyPage;

(4)       修改類的構造函數

CMyCustomPage(CWnd*pParent = NULL);

          並在構造函數的實現函數中進行修改;

(5)       修改類的創建模式,切記此項必須,否則會出錯;

在類的定義中

                DECLARE_DYNCREATE (CMyCustomPage)

在類的實現中

IMPLEMENT_DYNCREATE(CMyCustomPage, CPropertyPage)

(6)       在MainFram.cpp的加入此頁面

       void CMainFrame::OnViewCustomize()

{

              CList <CRuntimeClass*,CRuntimeClass*> lstCustomPage;

             lstCustomPage.AddTail(RUNTIME_CLASS(CMyCustomPage));

 

              CMFCToolBarsCustomizeDialog* pDlgCust = new CMFCToolBarsCustomizeDialog(this,

  TRUE /* scan menus */,  

AFX_CUSTOMIZE_MENU_SHADOWS|

AFX_CUSTOMIZE_TEXT_LABELS|

AFX_CUSTOMIZE_MENU_ANIMATIONS,// default parameters

           &lstCustomPage);

        

               pDlgCust->EnableUserDefinedToolbars();

         pDlgCust->Create();

}

(7)       運行結果如下:

示例二  桌面信息提示信息編程

   目的在系統運行有各種各樣的信息提示,直接從桌面的右下角彈出對話框給出提示,該提示對話框可以採用系統信息提示對話框,也可以採用自定義對話框進行提示。

(1)      利用VS2010生成對話框形式的工程文件;

(2)      在對話框中加入與桌面提示信息相關的控件,包括外觀類型、動畫類型、透明度、動畫速度、自動關閉、關閉時間等;

(3)      爲各個列表框添加數據

其中,外觀類型列表框數據爲MS Office 2000;MS Office XP;MS Office2003;MS VS.NET 2005;Windows XP;MSN Messenger;MS Office 2007 Blue;MS Office 2007Black;MS Office 2007 Silver;MS Office 2007 Aqua;

動畫類型列表框數據包括:Noanimation;Unfold;Slide;Fade;

(4)      自繪圖標列表控件

通常的列表控件只能顯示字符串,爲了能夠使得列表中既能顯示字符,又能顯示圖標,需要對列表控件進行重載,建立以CComboBox爲基類的繼承類CIconComboBox,在其中重載構造函數,CompareItem,DrawItem,MeasureItem等函數,實現列表控件的自繪。重點的需要重載以下類

a)      構造函數的重載

       CIconComboBox(CMFCToolBarImages&Icons); 以便以引用的方式調用位圖

CIconComboBox::CIconComboBox(CMFCToolBarImages&Icons) :

                 m_Icons (Icons)

{

}

b)      重寫MeasureItem()函數,便於控制列表類的行間距

void CIconComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)

{

     lpMIS->itemHeight = 25;

     lpMIS->itemWidth = 25;

}

c)      最重要的,重載DrawItem()函數

void CIconComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)

{

         CDC* pDC= CDC::FromHandle(lpDIS->hDC);

         ASSERT_VALID (pDC);

         HBRUSH           brBackground;

         COLORREF      clText;

         if(lpDIS->itemState & ODS_SELECTED) 

         {

                   brBackground =GetSysColorBrush (COLOR_HIGHLIGHT);

                   clText =afxGlobalData.clrTextHilite;

         }

         else

         {

                   brBackground =GetSysColorBrush (COLOR_WINDOW);

                   clText = afxGlobalData.clrWindowText;

         }

         CRect rectItem = lpDIS->rcItem;

         ::FillRect (lpDIS->hDC,&rectItem, brBackground);

         intnIndex = lpDIS->itemID;

         if(nIndex > 0)

         {

                   CAfxDrawState ds;

                   m_Icons.SetTransparentColor(afxGlobalData.clrBarFace);

                   m_Icons.PrepareDrawImage(ds);

                   m_Icons.Draw (pDC,rectItem.left + 1, rectItem.top + 1, nIndex - 1);

                   m_Icons.EndDrawImage (ds);

         }

         CString strText;

         GetLBText (nIndex, strText);

         CRect rectText = rectItem;

         rectText.left += 20;

         CFont* pOldFont = pDC->SelectObject(&afxGlobalData.fontRegular);

         pDC->SetBkMode (TRANSPARENT);

         pDC->SetTextColor (clText);

         pDC->DrawText (strText, rectText,DT_SINGLELINE | DT_VCENTER);

         pDC->SelectObject (pOldFont);

}

d)      重載CompareItem()實現排序規則,由於本例中控件屬性已經選擇不排序,所以此處不再起作用

e)       #include"IconComboBox.h"加入StdAfx.h

f)        定義變量CIconComboBoxm_IconCtrl;

g)      將控件屬性的Owner Draw屬性設置爲Variable,將屬性Hasstrings設置爲TRUE

(5)      利用ClassWizard建立對話框中的各種變量

(6)      初始化

m_TransCtrl.SetRange(10,255);

         m_CloseTimeCtrl.SetRange(1,5);

         m_AnimSpeedCtrl.SetRange(1,100);

m_Icons.SetImageSize(CSize(32,32));

         m_Icons.Load(IDB_ICONS);

         m_IconsSmall.SetImageSize(CSize(16,16));

         m_IconsSmall.Load(IDB_ICONS_SMALL);

 

         for(inti=0;i<m_Icons.GetCount();i++)

         {

                   CStringstrText;

                   if(i==0)

                            strText= _T("No Icon");

                   else

                   {

                            strText.Format(_T("Icon %d"),i);

                   }

 

                   m_IconCtrl.AddString(strText);

         }

       UpdateData(FALSE);  //手動調用自繪控件的DrawItem()函數

(7)      在顯示按鈕上進行程序設計,設置信息提示界面參數並顯示信息提示框

   1)  設置界面風格特性,VS2010提供了多種界面風格供系統選擇

     switch(m_LookStyle)

         {

         case 0:

                   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS (CMFCVisualManager));

                   break;

         case 1:

CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS (CMFCVisualManagerOfficeXP));

                   break;

         case 2:

                   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS (CMFCVisualManagerOffice2003));

                   break;

         case 3:

                   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS (CMFCVisualManagerVS2005));

                   break;

         case 4:

                   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS (CMFCVisualManagerWindows));

                   break;

         case 5:

                   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMSNVisualManager));

                   break;

         case 6:

                   CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);

                   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS (CMFCVisualManagerOffice2007));

                   break;

         case 7:

                   CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);

                   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS (CMFCVisualManagerOffice2007));

                   break;

         case 8:

                   CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);

                   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS (CMFCVisualManagerOffice2007));

                   break;

         case 9:

                   CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);

                   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS (CMFCVisualManagerOffice2007));

                   break;

         }

   2)設置參數

CMFCDesktopAlertWnd*pPopup = new CMFCDesktopAlertWnd;

         pPopup->SetAnimationType((CMFCPopupMenu::ANIMATION_TYPE)m_AnimType);

         pPopup->SetAnimationSpeed(m_AnimSpeed);

         pPopup->SetTransparency((BYTE)m_Trans);

         pPopup->SetSmallCaption(m_IsSmallCaption);

         pPopup->SetAutoCloseTime(m_AotuClose ? m_CloseTime * 1000 : 0);

3)  自繪風格的提示界面

    a) 利用資源建立對話框,注意將屬性設置爲Child,透明屬性設置爲TRUE

b) 對該對話框建立類,基類爲CMFCDesktopAlertDialog

c) 調用

pPopup->Create(this, IDD_DIALOG1,

                                     NULL,

                                     CPoint(-1,-1),

                                     RUNTIME_CLASS(CMyPopDlg));

 4 ) 系統信息提示界面的調用

        CMFCDesktopAlertWndInfo params;

                   if(m_IconSel>0)

                   {

                            params.m_hIcon= m_Icons.ExtractIconW(m_IconSel-1);

                            params.m_strText= m_Text;

                            params.m_strURL= m_LinkText;

                            params.m_nURLCmdID= 101;

                            pPopup->Create(this, params, NULL, CPoint(-1,-1));

                   }

 5)設置ICON及標題

HICONhIcon = (HICON) ::LoadImage (::AfxGetResourceHandle (),

                   MAKEINTRESOURCE(IDR_MAINFRAME),

                                     IMAGE_ICON,::GetSystemMetrics (SM_CXSMICON), ::GetSystemMetrics (SM_CYSMICON), 0);

         pPopup->SetIcon(hIcon, FALSE);

         pPopup->SetWindowText(_T("信息"));

(8)      最後運行界面

選擇顯示將看到屏幕右下角彈出相應的提示信息框。

示例三 對話框的Tooltips提示編程

Tooltips可以針對對話框的資源進行信息提示,例如按鈕等,可以作爲在線幫助系統,在VS2010中,提供了類CMFCToolTipCtrl用於Tooltips的實現。

(1)      利用VS2010的AppWizard建立對話框模式的工程文件;

(2)      插入基類爲CMFCToolTipCtrl的擴展類CMyTooltipCtrl,目的在於生成更加直觀並帶有圖標的信息提示欄

(3)      重載CMyTooltipCtrl的虛函數GetIconSize(),OnDrawIcon(),並且重寫消息TTN_SHOW對應的函數

CSizeCMyTooltipCtrl::GetIconSize()

{

     returnCSize(32,32);

}

 

BOOLCMyTooltipCtrl::OnDrawIcon(CDC* pDC, CRect rectImage )

{

     UINT uiBmpId = 0;

     switch(m_nCurID)

     {

     case IDOK:

              uiBmpId  = IDB_OK;

              break;

     caseIDCANCEL:

              uiBmpId = IDB_CANCEL;

              break;

     }

     if(uiBmpId==0)

     {

              returnFALSE;

     }

     CMFCToolBarImages  image;

     image.Load(uiBmpId);

     image.SetSingleImage();

     image.DrawEx(pDC,rectImage,0);

     returnTRUE;

}

 

void CMyTooltipCtrl::OnTtnTooltipShow(NMHDR *pNMHDR, LRESULT*pResult)

{

     m_nCurID = CWnd::FromHandle((HWND)pNMHDR->idFrom)->GetDlgCtrlID ();

     switch(m_nCurID)

     {

     case IDOK:

              SetDescription (_T("OK 按鈕用於¨¨定當前的選擇並退出界面?"));

              break;

     caseIDCANCEL:

              SetDescription (_T("Cancel按鈕用於取消當前的選擇並退出界面?"));

              break;

     default:

              SetDescription (_T (""));

     }

     CMFCToolTipCtrl::OnShow (pNMHDR, pResult);

}

(4)       在主程序中添加CMyTooltipCtrl定義並初始化

       m_Tooltip.Create(this);

         m_Tooltip.Activate(TRUE);

 

         CMFCToolTipInfoparam;

         param.m_bVislManagerTheme= TRUE;

         m_Tooltip.SetParams(&param);

 

         m_Tooltip.AddTool(GetDlgItem(IDOK),_T("Ok按鈕"));

         m_Tooltip.AddTool(GetDlgItem(IDCANCEL),_T("Cancel按鈕"));

(5)       在ClassWizard中添加虛函數PreTranslateMessage並重載,加入處理tooltips的消息處理

BOOLCTooltipTestDlg::PreTranslateMessage(MSG* pMsg)

{

         switch(pMsg->message)

         {

         caseWM_KEYDOWN:

         caseWM_SYSKEYDOWN:

         caseWM_LBUTTONDOWN:

         caseWM_RBUTTONDOWN:

         caseWM_MBUTTONDOWN:

         caseWM_LBUTTONUP:

         caseWM_RBUTTONUP:

         case WM_MBUTTONUP:

         caseWM_MOUSEMOVE:

                   m_Tooltip.RelayEvent(pMsg);

                   break;

}

return CDialogEx::PreTranslateMessage(pMsg);

}

(6)       在應用函數類中加入窗體風格的處理,使得彈出的提示信息欄具有良好的風格

       CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS (CMFCVisualManagerOffice2007));

(7)       最終運行結果,當鼠標位於“確認”或者“取消”按鈕時,將彈出相應的提示信息

 

示例四  顯示菜單Tooltip編程

菜單的Tooltip是給菜單給出相應的提示信息,可以關閉也可以打開,當然爲了Tooltip相關的色彩顯示,專門建立了以CMFCTooltipCtrl爲基類的繼承類

首先以CMFCTooltipCtrl爲基礎,建立類CMyToolTipCtrl,並重載相關的屬性函數OnFillBackground(), OnDrawSeparator( ),繪製Tooltip的背景、圖標及文本的顏色。

void CMyTooltip::OnDrawSeparator(CDC* pDC, intx1,   intx2,  inty )

{

         ASSERT_VALID (pDC);

         CDrawingManager dm (*pDC);

         CRect rect (x1, y, x2, y + 1);

         dm.FillGradient(rect, RGB (255, 201, 109), RGB (255, 247, 225), FALSE);

}

voidCMyTooltip::OnFillBackground( CDC* pDC, CRect rect,  COLORREF&clrText,  COLORREF& clrLine )

{

         ASSERT_VALID(pDC);

 

         CDrawingManager dm(*pDC);

         dm.FillGradient2(rect,RGB (104, 165, 225), RGB (37,92, 222), 90);

         clrLine= RGB (113, 166, 246);

         clrText= RGB (255, 255, 255);

}

  隨後重載OnMenuButtonToolHitTest()函數,以便獲得鼠標點擊菜單或者圖標的消息,以便顯示Tooltip。

BOOL CMainFrame::OnMenuButtonToolHitTest(CMFCToolBarButton* pButton, TOOLINFO* pTI)

{

         ASSERT_VALID(pButton);

         ASSERT(pTI != NULL);

         if (!theApp.m_bTTInPopupMenus ||   pButton->m_nID == 0 ||    pButton->m_nID == (UINT)-1)

         {

                   return FALSE;

         }

         CStringstrText = pButton->m_strText;

         strText.Remove(_T('&'));

         if (strText.IsEmpty ())

         {

                   return FALSE;

         }

         if (pTI)

         {

                   pTI->lpszText= (LPTSTR) ::calloc ((strText.GetLength () + 1),sizeof(TCHAR));

                   if (pTI->lpszText)

                   {

                            lstrcpy(pTI->lpszText, strText);

                   }

         }

         return TRUE;

}

  然後再在視類中加入不同類型的Tooltip處理程序

voidCTooltipViewView::OnApplyTooltip()

{

 

         afxGlobalData.m_nMaxToolTipWidth= 200;

         theApp.m_bTTInPopupMenus= TRUE;

         if (m_nType == 0)      // Standard tooltip

         {

                   theApp.GetTooltipManager()->SetTooltipParams (

                            AFX_TOOLTIP_TYPE_ALL,

                            NULL,

                            NULL);

                   return;

         }

         if (m_nType == 1)      // Balloon tooltip

         {

                   CMFCToolTipInfoparamsBalloon;

                   paramsBalloon.m_bBalloonTooltip= TRUE;

                   theApp.GetTooltipManager()->SetTooltipParams (

                            AFX_TOOLTIP_TYPE_ALL,

                            RUNTIME_CLASS(CMFCToolTipCtrl),

                            &paramsBalloon);

                   return;

         }

         if(m_nType == 2)

         {

                   CMFCToolTipInfoparams;

                   params.m_bBoldLabel= TRUE;

                   params.m_bDrawDescription= TRUE;

                   params.m_bDrawIcon= TRUE;

                   params.m_bRoundedCorners= TRUE;

                   params.m_bDrawSeparator= TRUE;

                   params.m_clrFill= RGB (255, 255, 255);

                   params.m_clrFillGradient= RGB (228, 228, 240);

                   params.m_clrText= RGB (61, 83, 80);

                   params.m_clrBorder= RGB (144, 149, 168);

                   theApp.GetTooltipManager()->SetTooltipParams (

                            AFX_TOOLTIP_TYPE_ALL,

                            RUNTIME_CLASS(CMFCToolTipCtrl),

                            &params);

                   return;

         }

         if(m_nType == 3)

         {

                   theApp.GetTooltipManager()->SetTooltipParams (

                            AFX_TOOLTIP_TYPE_ALL,

                            RUNTIME_CLASS(CMyTooltip));

         }

}

最終軟件界面:

示例五   VS2010中新控件的編程

爲了方便界面設計,在VS2010中,提供了比較新的控件,不同於傳統的控件,VS2010在界面設計上增加的新控件有助於設計有好的界面風格。

(1)      MFC下的多列表視圖

在VS2010下,提供了類CMFCPropertySheet和CMFCPropertyPage進行列表視圖和相關頁面的加載,首先構造基於CMFCPropertyPage的頁面類,建立對話框資源,將模式設置爲“Child”,然後建立以CPropertyPage爲基類的CPage1,將基類更換爲CMFCPropertyPage,重載虛函數OnInitDialog(),以同樣的方法建立CPage2,…,CPage5。然後建立以CPropertySheet爲基類的類建立CControlSheet,再將基類更換爲CMFCPropertySheet,重載構造函數和初始化函數,並在其中增加CPage1,…,CPage5類型的變量m_page1,…,m_page5,

CControlSheet::CControlSheet(CWnd*pParentWnd)

:CMFCPropertySheet(IDS_CONTROL,pParentWnd)

{

     BOOL b32BitIcons = TRUE;

     SetLook(CMFCPropertySheet::PropSheetLook_OutlookBar);   //設置外觀

     SetIconsList(b32BitIcons ? IDB_ICONS32 :IDB_ICONS, 32);   //設置圖標

     AddPage(&m_page1);

     AddPage(&m_page2);

}

爲了增強界面顯示,在應用函數中增加顯示風格控制:

       CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

         CMFCButton::EnableWindowsTheming();

更改應用程序類的初始化代碼,調用CControlSheet作爲主界面

    CControlSheet*pPropSheet = new CControlSheet;

         m_pMainWnd= pPropSheet;

         pPropSheet->DoModal();

         delete pPropSheet;

實現的界面爲:

(2)      MFC按鈕

1) 按鈕  

在Page1中加入按鈕資源,並加入按鈕設置風格相關的選擇框,在CMFCButton中可以設置按鈕的圖標、圖標和文本的位置、信息提示等

m_bRightImage設置圖標是否靠右;

m_bTopImage設置圖標是否朝上;

m_nFlatStyle設置按鈕的屬性;

SetImage設置按鈕上的圖標,其中參數1爲正常狀態下的圖標,參數2爲鼠標置於其上的圖標,參數3爲禁止狀態下的圖標,如果設置爲NULL則表示按鈕上沒有圖標;

SetMouseCursor()設置位於按鈕上的鼠標狀態,

m_Button.SetMouseCursor(NULL);

m_Button.SetMouseCursorHand();

m_Button.SetMouseCursor(AfxGetApp()->LoadCursor(IDC_CURSOR));

           SizetoContent()使得按鈕大小和其上的內容相一致

2) 單選按鈕

在資源對話框中加入單選按鈕,並定義變量爲CMFCButton型,分別設置當前圖標和Check圖標

m_btnRadio1.m_nFlatStyle= CMFCButton::BUTTONSTYLE_SEMIFLAT;

           m_btnRadio2.m_nFlatStyle= CMFCButton::BUTTONSTYLE_SEMIFLAT;

          m_btnRadio3.m_nFlatStyle =CMFCButton::BUTTONSTYLE_SEMIFLAT;

          m_btnRadio4.m_nFlatStyle =CMFCButton::BUTTONSTYLE_SEMIFLAT;

 

          m_btnRadio1.SetImage( IDB_RADIO_OFF);

          m_btnRadio2.SetImage( IDB_RADIO_OFF);

          m_btnRadio3.SetImage( IDB_RADIO_OFF);

          m_btnRadio4.SetImage( IDB_RADIO_OFF);

 

          m_btnRadio1.SetCheckedImage(IDB_RADIO_ON);

          m_btnRadio2.SetCheckedImage(IDB_RADIO_ON);

          m_btnRadio3.SetCheckedImage(IDB_RADIO_ON);

          m_btnRadio4.SetCheckedImage(IDB_RADIO_ON);

 

          m_btnRadio1.SizeToContent();

          m_btnRadio2.SizeToContent();

          m_btnRadio3.SizeToContent();

          m_btnRadio4.SizeToContent();

 

          m_btnRadio1.SetCheck(TRUE);

3) 複選按鈕

在資源對話框中加入複選按鈕,並定義變量爲CMFCButton型,分別設置當前圖標和Check圖標。

         m_CheckBut.SetImage(IDB_CHECKNO);

         m_CheckBut.SetCheckedImage(IDB_CHECK);

         m_CheckBut.m_nFlatStyle= CMFCButton::BUTTONSTYLE_SEMIFLAT;

         m_CheckBut.SizeToContent();

4) Windows XP風格按鈕

CMFCButton默認爲XP類型的按鈕,能夠根據設定的風格顯示相應界面的風格,也可去掉這樣的風格,成爲普通的按鈕。

         UpdateData();

         CMFCButton::EnableWindowsTheming(m_XPStyle);

         RedrawWindow();

5) 帶菜單的按鈕設計

在資源中加入加入按鈕控件,並定義變量CMFCMenuButton類型,利用該類的成員函數加入相應的菜單資源,並設置屬性

m_menu.LoadMenu(IDR_MENU1);

m_MenuBut.m_hMenu= m_menu.GetSubMenu(0)->GetSafeHmenu();

m_MenuBut.SizeToContent();

m_MenuBut.m_bOSMenu= TRUE;

m_MenuBut.m_bRightArrow= TRUE;

m_MenuBut.m_bStayPressed = TRUE;

m_MenuBut.m_bDefaultClick= TRUE;

         CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAR_MENU_IMAGES);

按鈕菜單的選擇,判斷選擇的是那一個菜單

CStringstrItem;

         switch(m_MenuBut.m_nMenuResult)

         {

         case ID_MENU_MENUITEM1:

                   strItem= _T("Menu item1");

                   break;

         case ID_MENU_MENUITEM2:

                   strItem= _T("Menu item2");

                   break;

         case ID_MENU_MENUITEM3:

                   strItem= _T("Menu item3");

                   break;

         case ID_MENU_MENUITEM4:

                   strItem= _T("Menu item4");

                   break;

         }

         AfxMessageBox(strItem);

   有關各種按鈕的控制界面如下:

 

(3)      顏色按鈕類和顏色對話框

1) 顏色對話框

MFC提供了顏色對話框類CMFCColorDialog進行顏色的選擇,系統可以利用DoModal()調用,然後選擇相應的顏色。

CMFCColorDialog dlg(m_Color,0, this);

         if(dlg.DoModal()==IDOK)

         {

                   m_Color = dlg.GetColor();

                  m_ColorDlgMsg.Format(_T("%d,%d,%d"),GetRValue(m_Color),GetGValue(m_Color),GetBValue(m_Color));

                   UpdateData(FALSE);

         }

2) 顏色按鈕

可以利用顏色按鈕選擇相應的顏色,具有直觀,在資源中增加按鈕控件,並定義爲CMFCColorButton,利用該類的函數初始化。

初始化:

         m_PickerBut.EnableAutomaticButton(_T("?¦???"),RGB(255, 0, 255));

         m_PickerBut.EnableOtherButton(_T("?¨¹"));

         m_PickerBut.SetColor((COLORREF)-1);

         m_PickerBut.SetColumnsNumber(10);

顏色選擇,當按下按鈕時,可以獲得顏色值:

COLORREFcolor = m_ColorPicker.GetColor();

         if (color == -1)

         {

                   color= m_ColorPicker.GetAutomaticColor();

         }

         m_strRGB.Format(_T("%d,%d,%d"), GetRValue(color), GetGValue(color),GetBValue(color));

3) 顏色條控件

在資源中加入Picture控件,建立顏色條控件的邊界,然後利用此範圍建立CMFCColorBar,利用CMFCColorBar的操作函數建立並設置屬性。

         m_ColorBarFrame.GetClientRect(&rectColorBar);    //獲取區域

         m_ColorBarFrame.MapWindowPoints(this,&rectColorBar);  //將區域映射到窗體座標

         m_wndColorBar.SetHorzMargin(0);

         m_wndColorBar.SetVertMargin(0);

         m_wndColorBar.EnableOtherButton(_T("?¨¹"));

         m_wndColorBar.CreateControl(this,&rectColorBar,IDC_COLOR_BAR,5);

         m_wndColorBar.SetColor(RGB(0,0,0));

 建立鼠標單擊消息並獲取顏色信息

COLORREFcolor = m_wndColorBar.GetColor();

         m_ColorBarMsg.Format(_T("%d,%d,%d"), GetRValue(color),GetGValue(color), GetBValue(color));

         UpdateData(FALSE);

爲了建立以調色板爲基礎的顏色條,首先需要建立調色板,在顏色條創建時利用調色板

//調色板的建立

#define NUM_COLOURS 64

         struct

         {

                   LOGPALETTE    LogPalette;

                   PALETTEENTRY  PalEntry[NUM_COLOURS];

         }pal;

 

         LOGPALETTE*pLogPalette = (LOGPALETTE*) &pal;

         pLogPalette->palVersion    = 0x300;

         pLogPalette->palNumEntries= (WORD) NUM_COLOURS;

 

         COLORREFcolorStart = RGB(0, 255, 255);

         COLORREFcolorFinish = RGB(255, 255, 255);

         int nShift = 6;

         for (int i = 0; i< NUM_COLOURS; i++)

         {

                   BYTEbR = (BYTE)((GetRValue(colorStart) *(NUM_COLOURS - i) + GetRValue(colorFinish)* i) >> nShift);

                   BYTEbG = (BYTE)((GetGValue(colorStart) *(NUM_COLOURS - i) + GetGValue(colorFinish)* i) >> nShift);

                   BYTEbB = (BYTE)((GetBValue(colorStart) *(NUM_COLOURS - i) + GetBValue(colorFinish)* i) >> nShift);

 

                   pLogPalette->palPalEntry[i].peRed   = bR;

                   pLogPalette->palPalEntry[i].peGreen= bG;

                   pLogPalette->palPalEntry[i].peBlue  = bB;

                   pLogPalette->palPalEntry[i].peFlags= 0;

         }

    //顏色條的創建

         m_palColorPicker.CreatePalette(pLogPalette);

         m_wndColorBar2.SetHorzMargin(0);

         m_wndColorBar2.SetVertMargin(0);

         m_ColorBarFramw2.GetClientRect(&rectColorBar);

         m_ColorBarFramw2.MapWindowPoints(this, &rectColorBar);

         m_wndColorBar2.CreateControl(this, rectColorBar, IDC_COLOR_BAR2, 8/* columns */, &m_palColorPicker);

         m_wndColorBar2.SetColor(colorStart);

顏色按鈕的界面

(4)      字體、鏈接、瀏覽等空間的編程

1)    字體列表

在資源中加入Combox控件,並將屬性設置爲dropList,將OwnerDraw屬性設置爲Fixed,將has strings屬性設置爲TRUE。利用ClassWizard爲該控件設置CMFCFontComboBox變量,利用該類的成員函數進行屬性設置和變量。

       m_FontCombox.SelectFont(_T("Arial"));

利用Combox控件的改變消息獲取當前選擇的字體

         CMFCFontInfo*pFontInfo = m_FontCombox.GetSelFont();

         if(pFontInfo != NULL)

         {

                   m_CurFontName=  pFontInfo->m_strName;

                   m_CurFontCharSet= pFontInfo->m_nCharSet;

         }

改變屬性並設置

         UpdateData();

         int nFontType = 0;

         if(m_Device)

         {

                   nFontType|= DEVICE_FONTTYPE;

         }

         if(m_Raster)

         {

                   nFontType|= RASTER_FONTTYPE;

         }

         if(m_TrueType)

         {

                   nFontType|= TRUETYPE_FONTTYPE;

         }

         m_FontCombox.Setup(nFontType);

         m_FontCombox.SelectFont(m_CurFontName,m_CurFontCharSet);

利用字體直接在列表框中進行繪製,只需要改變CMFCFontComboBox的m_bDrawUsingFont屬性即可。

         UpdateData( );

         m_FontCombox.m_bDrawUsingFont= m_DrawUsing;

         m_FontCombox.RedrawWindow();

2)    位圖編輯

VS2010提供了位圖編輯功能,能夠彈出對話框進行位圖的編輯,首先在對話框中添加位圖編輯區域爲Picture型控件,獲得區域並繪製位圖。

m_ImageArea.GetClientRect(&m_ImageRect);

m_ImageArea.MapWindowPoints(this,&m_ImageRect);

m_BmpTest.LoadBitmap(IDB_TEST_BMP);

BITMAP bm;

m_BmpTest.GetBitmap(&bm);

m_ImageRect.right = m_ImageRect.left +bm.bmWidth;

m_ImageRect.bottom = m_ImageRect.top +bm.bmHeight;

    添加按鈕並定義爲CMFCButton型,併爲該按鈕添加圖標

         m_EditBut.SetImage(IDB_IMAGE);

         m_EditBut.SetTextHotColor(RGB(0,0,255));

    在按鈕按下消息中調用位圖編輯對話框,並獲取已經編輯的位圖並顯示。

HBITMAPm_hBmp = (HBITMAP)::CopyImage(m_BmpTest.GetSafeHandle(),IMAGE_BITMAP,0,0,0);

         if(m_hBmp)

         {

          CMFCImageEditorDialog m_EditImageDlg(CBitmap::FromHandle(m_hBmp),this);

          If(m_EditImageDlg.DoModal()== IDOK)

          {

                   m_BmpTest.DeleteObject();

                   m_BmpTest.Attach(m_hBmp);

                   InvalidateRect(m_ImageRect);

          }

         }

在對話框的onPaint()中增加繪圖刷新代碼,在退出位圖編輯對話框時刷新

         CRectrectFrame = m_ImageRect;

         rectFrame.InflateRect(1,1);

         dc.Draw3dRect(rectFrame,GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_3DSHADOW));

         rectFrame.InflateRect(1,1);

         dc.Draw3dRect(rectFrame,GetSysColor(COLOR_3DHILIGHT), GetSysColor(COLOR_3DDKSHADOW));

         dc.DrawState(m_ImageRect.TopLeft(),m_ImageRect.Size(),&m_BmpTest,0);

3)    鏈接按鈕

在資源中增加按鈕控件,並定義爲CMFCLinkCtrl型,並完成初始化代碼

m_LinkBut.SetURL(_T("http:\\www.hao123.com"));

m_LinkBut.SetTooltip(_T("¨°Ì?¡Â°3"));

4)    CVSListCtrl控件

在資源中增加CStatic控件,建立變量,並定義爲CVSListBox類型,並進行初始化

m_ListBox.SetStandardButtons();

         m_ListBox.EnableBrowseButton();

         m_ListBox.AddItem(_T("Test Item1"));

         m_ListBox.AddItem(_T("Test Item2"));

5)    EditBrowse控件

在資源中增加EDIT控件,建立變量,並定義爲以CMFCEditBrowseCtrl爲基類的CMyBrowseEdit類型,並進行初始化

         m_FolderList.EnableFolderBrowseButton();

         m_FileListCtrl.EnableFileBrowseButton();

爲了控制Edit中的顯示內容,需要對OnBrowse函數進行重載,如本例中,文件瀏覽只顯示文件名,而不顯示文件目錄名,文件夾瀏覽只顯示目錄名,而不顯示前面的文件目錄系統。

         virtual voidOnBrowse()

         {

                   CStringm_str;

                   int len,i;

                   CMFCEditBrowseCtrl::OnBrowse();

                   GetWindowText(m_str);

                   len= m_str.GetLength();

                   for(i=len-1;i>=0;i--)

                   {

                            if(m_str[i] =='\\')

                                     break;

                   }

                   m_str= m_str.Right(len-i-1);

                   SetWindowText(m_str);

         }

最終軟件運行界面:

 

(5)      按照一定格式輸入的對話框CMFCMaskedEdit控件

    在當前對話框中加入CEdit控件,併爲該控件設置CMFCMaskedEdit變量,在初始化代碼中進行初始化即可,CMFCMaskedEdit的EnableMask可以設置輸入相應文字,但也可通過SetValidChars控制輸入的內容。

m_MaskEdit1.EnableMask(_T(" ddd  ddddddd"),_T("(___) ___-____"),_T(' '));

         m_MaskEdit1.SetValidChars(NULL);

         m_MaskEdit1.SetWindowText(_T("(123) 123-1234"));

         m_MaskEdit2.EnableMask(_T("      cc       ddddd-dddd"),_T("State: __, Zip: _____-____"),_T(' '));

         m_MaskEdit2.SetValidChars(NULL);

         m_MaskEdit2.SetWindowText(_T("State: NY, Zip: 12345-6789"));

         m_MaskEdit3.EnableMask(_T("    AAAAAAAA AAAA AAAA"),         _T("S/N: ____-____-____-____"),_T(' '));

         m_MaskEdit3.SetValidChars(NULL);

         m_MaskEdit3.SetWindowText(_T("S/N: FPR5-5678-1234-8765"));

         m_MaskEdit4.EnableMask(_T(AAAA"),_T("0x____"), _T('_'));

         m_MaskEdit4.SetValidChars(_T("1234567890ABCDEFabcdef"));

         m_MaskEdit4.SetWindowText(_T("0x01AF"));

     // Don't use the mask

         m_MaskEdit5.DisableMask();

         // Valid string characters

         m_MaskEdit5.SetValidChars(_T("1234567890"));

         m_MaskEdit5.SetWindowText(_T("1234567890"));

如果需要獲取輸入的內容,則可以利用GetWindowText獲得

m_MaskEdit1.GetWindowTextW(m_Value1);

m_MaskEdit2.GetWindowTextW(m_Value2);

程序運行界面

(6)      CMFCListCtrl列表控件的應用

   首先建立以CMFCListCtrl爲基類的CMyListCtrl,並重載OnGetCellTextColor以便設置文本顏色,重載OnGetCellBkColor以便設置背景顏色,重載OnGetCellFont以便設置字體,重載OnCompareItems以便按照一定規則排序。重載的關鍵函數如下:

COLORREF CMyListCtrl::OnGetCellTextColor(int nRow,int nColum)

{

         if (!m_bColor)

         {       

                   return CMFCListCtrl::OnGetCellTextColor(nRow,nColum);

         }

         if (m_bRowTextColorIsRed[nRow] == TRUE)

         {

            returnRGB(100, 0, 0);

         }

         if (nRow % 2 == 0)

         {

            returnRGB(40, 40, 40);

         }

         if (nRow % 2 !=0)

         {

            returnRGB(50, 50, 50);

         }

}

COLORREF CMyListCtrl::OnGetCellBkColor(int nRow,int nColum)

{

         if (!m_bColor)

         {

            returnCMFCListCtrl::OnGetCellBkColor(nRow, nColum);

         }

         COLORREFcolorRef;

         switch (m_nMyColorStyle)

         {

         case 0:

                   colorRef= (nRow % 2) == 0 ? RGB(167, 191, 222) : RGB(211, 223, 238);

             break;

         case 1:

                   colorRef= (nRow % 2) == 0 ? RGB(191, 177, 208) : RGB(223, 216, 232) ;

            break;

         case 2:

                   colorRef= (nRow % 2) == 0 ? RGB(205, 221, 172) : RGB(230, 238, 213) ;

                   break;

         }

         return colorRef;

}

HFONT CMyListCtrl::OnGetCellFont(int nRow,int nColum,DWORD dwData )

{

         if (!m_bModifyFont)

         {

            return NULL;

         }

         if (nRow == nCurrentSel)//

         {

            returnafxGlobalData.fontDefaultGUIBold;

         }

         return NULL;

}

intCMyListCtrl::OnCompareItems(LPARAM lParam1, LPARAM lParam2,int iColumn)

{

         CStringstrItem1 = GetItemText((int)(lParam1 <lParam2 ? lParam1 : lParam2), iColumn);

         CStringstrItem2 = GetItemText((int)(lParam1 <lParam2 ? lParam2 : lParam1), iColumn);

         if (iColumn == 0)

         {

            int nItem1 =_ttoi(strItem1);

            int nItem2 =_ttoi(strItem2);

            return(nItem1< nItem2 ? -1 : 1);

         }

         else

         {

            int iSort = _tcsicmp(strItem1,strItem2);

            return(iSort);

         }

}

對於CMyListCtrl的引用,添加數據後,可以得到相應顏色和底色的列表框,可以在列表框的雙擊消息中加入引用代碼,使得雙擊後的行字體變黑。

         POSITION pos = m_List.GetFirstSelectedItemPosition();

         if(pos == NULL)

         {

                   TRACE(_T("No items were selected!\n"));

         }

         else

         {

                   while (pos)

                   {

                            int nItem = m_List.GetNextSelectedItem(pos);

                            TRACE(_T("Item %d was selected!\n"), nItem);

                            m_List.nCurrentSel= nItem;

                   }

         }

         m_List.RedrawWindow();

最終運行界面:

(7)      文件夾和列表控件

在界面上增加Tree和列表控件,並設置屬性,其中Tree設置爲“has lines”,“hasbuttons”,列表控件設置爲“report”類型,並添加變量:

         CMFCShellTreeCtrlm_ShellTree;

         CMFCShellListCtrlm_ShellList;

在初始化中增加:

m_ShellTree.Expand(m_ShellTree.GetRootItem(),TVE_EXPAND);

         m_ShellTree.SetRelatedList(&m_ShellList);

最終界面:

 

 

示例六  多彩界面,Ribbon編程

  Ribbon是類似於office2007樣式的界面,它替代了傳統的MFC程序裏的菜單和工具欄,MFC默認生成的Ribbon功能少,需要我們自己添加一些控件和圖片等元素使界面好看。與菜單資源相比,Ribbon的設計使界面更加直觀,帶有的圖標也使界面看起來更加美觀。Ribbon界面設計的重要方面就是要設計所需的圖標,設計圖標時,需要設計小圖標和大圖標,Ribbon類的添加有兩種方式。

方法一:資源創建

可以利用VS2010帶有的資源編輯器創建Ribbon資源,並在程序中調用,調用方式:

m_wndRibbonBar.LoadFromResource(IDR_RIBBON)

Ribbon資源創建的界面如下:

在右邊的工具欄中,具有與Ribbon界面相關的各種工具,可以選擇相應的Ribbon工具按照工具進行添加,可以先添加category,再添加Pane,再根據自己的需要添加各種按鈕、按鈕集、複選框等。

Ribbon工具欄及其包含的控件如下:

在利用資源編輯的方式編輯Ribbon界面時,注意先利用位圖的方式引入category需要的圖標,然後再在具體的控件中填寫引用的序號,並選用相應的ID,針對下拉式按鈕,在創建時,可以利用“Menu Item”項目創建子項目。

   在資源中創建Ribbon界面之後,可以利用ClassWizard添加各個控件的Ribbon變量,並針對各個按鈕創建實現的代碼函數,實現相應的程序設計。

方法二:編程創建

1.      Ribbon主菜單的設計

       m_MainButton.SetImage(IDB_RIBBON_MAIN);

         m_MainButton.SetToolTipText(_T("File"));

         m_MainButton.SetText(_T("\nf"));

         m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize (45, 45));

         CMFCRibbonMainPanel*pMainPanel = m_wndRibbonBar.AddMainCategory (_T("File"),IDB_RIBBON_FILE_SMALL, IDB_RIBBON_FILE_LARGE);

         pMainPanel->Add(new CMFCRibbonButton (ID_FILE_NEW, _T("&New"), 0, 0));

         pMainPanel->Add(new CMFCRibbonButton (ID_FILE_OPEN, _T("&Open..."), 1, 1));

         pMainPanel->Add(new CMFCRibbonButton (ID_FILE_SAVE, _T("&Save"), 2, 2));

         pMainPanel->Add(new CMFCRibbonButton (ID_FILE_SAVE_AS, _T("Save &As..."), 3, 3));

         std::auto_ptr<CMFCRibbonButton>apBtnPrint(new CMFCRibbonButton (ID_FILE_PRINT,_T("&Print"), 4, 4));

         apBtnPrint->AddSubItem(new CMFCRibbonLabel (_T("Preview and print the document")));

         apBtnPrint->AddSubItem(new CMFCRibbonButton (ID_FILE_PRINT, _T("&Print"), 4, 4, TRUE));

         apBtnPrint->AddSubItem(new CMFCRibbonButton (ID_FILE_PRINT_DIRECT,_T("&Quick Print"), 6, 6,TRUE));

         apBtnPrint->AddSubItem(new CMFCRibbonButton (ID_FILE_PRINT_PREVIEW,_T("Print Pre&view"), 7, 7,TRUE));

         apBtnPrint->SetKeys (_T("p"),_T("w"));

         pMainPanel->Add (apBtnPrint.release());

         pMainPanel->AddRecentFilesList(_T("Recent Documents"));

         pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton(ID_TOOLS_OPTIONS, _T("Opt&ions"),8));

         pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton (ID_APP_EXIT,_T("E&xit"), 9));

2.      Ribbon的category的添加:

         CMFCRibbonCategory*pCategory = m_wndRibbonBar.AddCategory(_T("&Buttons"),IDB_RIBBON_CATEGORY1_SMALL, IDB_RIBBON_CATEGORY1_LARGE);

         CMFCRibbonPanel*pPanel1 = pCategory->AddPanel(_T("LargeButtons"));

         std::auto_ptr<CMFCRibbonButton>apBtn1(new CMFCRibbonButton(ID_RIBBON_BTN_1,_T("Button"), 0, 0));

         apBtn1->SetAlwaysLargeImage();

         pPanel1->Add(apBtn1.release());

         std::auto_ptr<CMFCRibbonButton>apBtn2(new CMFCRibbonButton(ID_RIBBON_BTN_2,_T("Menu Button"), 1, 1));

         apBtn2->SetMenu(IDR_RIBBON_MENU_1);

         apBtn2->SetAlwaysLargeImage();

         pPanel1->Add(apBtn2.release());

         std::auto_ptr<CMFCRibbonButton>apBtn3(new CMFCRibbonButton(ID_RIBBON_BTN_3,_T("Split Button"), 2, 2));

         apBtn3->SetMenu(IDR_RIBBON_MENU_1,TRUE);

         apBtn3->SetAlwaysLargeImage();

         apBtn3->RemoveSubItem(0);

         apBtn3->AddSubItem(new CMFCRibbonButton(ID_RIBBON_MBTN_1, _T("Item 1"), 2), 0);

         pPanel1->Add(apBtn3.release());

         CMFCRibbonPanel*pPanel2 = pCategory->AddPanel(_T("Small"));

         std::auto_ptr<CMFCRibbonButton>apBtn4(new CMFCRibbonButton(ID_RIBBON_BTN_4,_T("Button"), 3));

         pPanel2->Add(apBtn4.release());

         std::auto_ptr<CMFCRibbonButton>apBtn5(new CMFCRibbonButton(ID_RIBBON_BTN_5,_T("Menu Button"), 4));

         apBtn5->SetMenu(IDR_RIBBON_MENU_1);

         pPanel2->Add(apBtn5.release());

         std::auto_ptr<CMFCRibbonButton>apBtn6(new CMFCRibbonButton(ID_RIBBON_BTN_6,_T("Split Button"), 5));

         apBtn6->SetMenu(IDR_RIBBON_MENU_1,TRUE);

         apBtn6->SetAlwaysLargeImage();

         apBtn6->RemoveSubItem(1);

         apBtn6->AddSubItem(new CMFCRibbonButton(ID_RIBBON_MBTN_2, _T("Item 2"), 5), 1);

         pPanel2->Add(apBtn6.release());

         CMFCRibbonPanel*pPanel3 = pCategory->AddPanel(_T("CheckBoxes"));

         pPanel3->Add(new CMFCRibbonCheckBox(ID_RIBBON_BTN_7, _T("Check Box 1")));

         pPanel3->Add(new CMFCRibbonCheckBox(ID_RIBBON_BTN_8, _T("Check Box 2")));

         pPanel3->Add(new CMFCRibbonCheckBox(ID_RIBBON_BTN_9, _T("Check Box 3")));

         pPanel1->SetData(ID_RIBBON_SOURCE_CODE_1_1);

         pPanel2->SetData(ID_RIBBON_SOURCE_CODE_1_2);

         pPanel3->SetData(ID_RIBBON_SOURCE_CODE_1_3);

3.      其它category的添加

添加方法同2

4.      界面風格的變化:

Ribbon支持MFC風格界面的變化,可以根據設定的Style設定不同的界面風格。

switch (m_nAppLook)

{

caseID_VIEW_APPLOOK_2007:

caseID_VIEW_APPLOOK_2007_1:

caseID_VIEW_APPLOOK_2007_2:

caseID_VIEW_APPLOOK_2007_3:

switch (m_nAppLook)

{

caseID_VIEW_APPLOOK_2007:

CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);

break;

caseID_VIEW_APPLOOK_2007_1:

CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);

break;

caseID_VIEW_APPLOOK_2007_2:

CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);

break;

caseID_VIEW_APPLOOK_2007_3:

         CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);

         break;

         }

CMFCVisualManager::SetDefaultManager (RUNTIME_CLASS(CMFCVisualManagerOffice2007));

CDockingManager::SetDockingMode (DT_SMART);

break;

default:

         ASSERT(FALSE);

}

最終界面:

示例七  狀態欄的編程

VS2010提供了CMFCStatusBar用於控制狀態欄的顯示,在狀態欄中,可以顯示圖標、進度條、圖形動畫、更改文本的顏色和背景色、雙機相應狀態欄產生消息。

首先利用AppWizard建立工程文件,注意建立的工程文件視類的基類選擇爲CFormView,在CMainFrame中定義狀態欄並設置狀態欄。

依據狀態欄中出現的次序定義常量,確定修改哪一個狀態欄。

const int nStatusIcon = 0;

const int nStatusInfo = 1;

const int nStatusProgress = 2;

const int nStatusLabel = 3;

const int nStatusAnimation =4;

  重新修改狀態欄的標識函數

static UINT indicators[] =

{

         ID_INDICATOR_ICON,               //status icon

         ID_SEPARATOR,           // statusline indicator

         ID_INDICATOR_PROGRESS,  // progress bar

         ID_INDICATOR_LABEL,            // textlabel

         ID_INDICATOR_ANIMATION,    // animation pane

};

設置狀態欄的格式

m_wndStatusBar.SetPaneStyle(nStatusIcon, SBPS_NOBORDERS);

m_wndStatusBar.SetPaneStyle(nStatusAnimation, SBPS_NOBORDERS);

m_wndStatusBar.SetPaneStyle(nStatusInfo, SBPS_STRETCH | SBPS_NOBORDERS);

m_wndStatusBar.SetPaneWidth(nStatusProgress, 80);

m_wndStatusBar.EnablePaneDoubleClick();

編輯Form資源,加入需要的控件並編程。

要在視類中訪問狀態欄控件,需要編寫函數GetStatusBar()

CMFCStatusBar&GetStatusBar () const

         {

                   return ((CMainFrame*) AfxGetMainWnd())->GetStatusBar ();

         }

另外,在CMainFrame中加入GetStatusBar代碼

CMFCStatusBar&GetStatusBar ()

         {

                   return m_wndStatusBar;

         }

視類的初始化,修改OnInitialUpdate函數並加入狀態欄相關的控件初始化代碼

         //動畫圖標的載入

if(m_imlStatusAnimation.GetSafeHandle()==NULL)

         {

                   m_imlStatusAnimation.Create(IDB_ANIMATE,16,0,RGB(255,0,255));

         }

   //位圖圖標的載入

         if(m_bmpIcon1.GetSafeHandle() == NULL)

         {

                   m_bmpIcon1.LoadBitmapW(IDB_ICON1);

         }

    //位圖圖標的載入

         if(m_bmpIcon2.GetSafeHandle() == NULL)

         {

                   m_bmpIcon2.LoadBitmapW(IDB_ICON2);

         }

   //載入圖標

         GetStatusBar().SetPaneIcon(nStatusIcon,m_bmpIcon1);

         GetStatusBar().SetTipText(nStatusIcon,_T("this is tooltip"));

進度條的啓動和停止

         if(m_ShowProgress)

         {

                   KillTimer(ID_PROGRESS_TIMER);

                   m_ProgressBut.SetWindowTextW(_T("Show Progress"));

                   GetStatusBar().EnablePaneProgressBar (nStatusProgress, -1);

                   m_ShowProgress= FALSE;

                   return;

         }

         SetTimer(ID_PROGRESS_TIMER,100,NULL);

         GetStatusBar().EnablePaneProgressBar (nStatusProgress, PROGRESS_MAX);

         m_ShowProgress= TRUE;

         m_ProgressBut.SetWindowTextW(_T("Stop Progress"));

在WM_TIMER中加入動態進度條的控制代碼

if(nIDEvent == ID_PROGRESS_TIMER)

         {

                   nProgressPos+=5;

                   if(nProgressPos > PROGRESS_MAX)

                   {

                            nProgressPos= 0;

                   }

                   GetStatusBar().SetPaneProgress(nStatusProgress, nProgressPos);

         }

動畫演示的啓動和停止

if(m_ShowAnimation)

         {

                   m_ShowAnimation= FALSE;

                   m_AnimateBut.SetWindowTextW(_T("Start Animation"));

                   GetStatusBar().SetPaneAnimation (nStatusAnimation, NULL);

         }

         else

         {

                   m_ShowAnimation= TRUE;

                   m_AnimateBut.SetWindowTextW(_T("Stop Animation"));

                   GetStatusBar().SetPaneAnimation (nStatusAnimation, m_imlStatusAnimation);

                   GetStatusBar().SetPaneText (nStatusAnimation, _T(""));

                   GetStatusBar().SetPaneWidth (nStatusAnimation, 16);

         }

圖標的變換

If(m_nIcon==0)

         {

                   return;

         }

         m_nIcon= 0;

         GetStatusBar().SetPaneIcon (nStatusIcon, m_bmpIcon1);

背景色和顯示文本顏色的改變

m_backColor= m_BackColorBut.GetColor();

GetStatusBar().SetPaneBackgroundColor(nStatusLabel,m_backColor);

m_textColor= m_TextColorBut.GetColor();

         GetStatusBar().SetPaneTextColor(nStatusLabel,m_textColor);

鼠標雙擊狀態欄消息的建立

可以利用狀態欄的ID建立ON_COMMAND消息並建立處理函數,在其中相應該函數即可

最終軟件界面如下:

示例八 多種類型的視圖集合CTabView

首先利用AppWizard建立工程,然後將視類的基類更改爲CTabView,並將所有的CView更改爲CTabView。

依次插入以CSrollView、CListView、CFormView、CEditView爲基類的CView1、CView2、CView3、CView4,並在程序中進行引用:
intCTabViewTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

         if (CTabView::OnCreate(lpCreateStruct) == -1)

                   return -1;

         // TODO:  Add yourspecialized creation code here

         AddView(RUNTIME_CLASS (CView1), _T("Scroll View"),100);

         AddView(RUNTIME_CLASS (CView2), _T("List View"),101);

         AddView(RUNTIME_CLASS (CView3), _T("Form View"),102);

         AddView(RUNTIME_CLASS (CView4), _T("Edit View"),103);

         return 0;

}

爲了增強各類的顯示效果,分別對加入的各個類型的視類進行程序設計。

在以CSrollView爲基類的CView1中,增加CSroll相關的控制,並在OnDraw中進行圖形的繪製。

在以CListView爲基類的CView2中,更改List的顯示風格

BOOL CView2::PreCreateWindow(CREATESTRUCT& cs)

{

         // TODO: Add your specialized code here and/or call thebase class

         cs.style|= LVS_REPORT;

         return CListView::PreCreateWindow(cs);

}

並在OnInitialUpdate()中加入列表的初始化代碼:

CListCtrl& wndList = GetListCtrl ();

wndList.SetExtendedStyle (LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES);

const int nColumns = 10;

int iColumn = 0;

// Insert columns:

for (iColumn = 0;iColumn < nColumns; iColumn++)

{

         CStringstrColumn;

         strColumn.Format(_T("Column %d"), iColumn + 1);

         wndList.InsertColumn(iColumn, strColumn, LVCFMT_LEFT, 110);

}

// Insert items:

for (int i = 0; i < 10; i++)

{

         const CString strItemFmt = _T("Item (%d, %d)");

         CStringstrItem;

         strItem.Format(strItemFmt, 1, i + 1);

         int iItem = wndList.InsertItem (i, strItem, 0);

         for (iColumn = 1; iColumn < nColumns; iColumn++)

         {

                   strItem.Format(strItemFmt, iColumn + 1, i + 1);

                   wndList.SetItemText(iItem, iColumn, strItem);

         }

}

在以CFormView爲基類的CView3中,加入相應的資源控件並進行程序設計,在以CEditView爲基類的CView4中,加入窗體文本初始化的代碼。

最終軟件界面:

示例九  任務欄編程CMFCTasksPane

VS2010提供了任務欄程序設計,專門設計了類CMFCTasksPane,在該類中,可以添加各種各樣的控件、圖標等,也可以設定任務欄的屬性。

爲了添加自己的控件,需要以基類CMFCTasksPane建立繼承類myTasksPane,並在OnCreate( )中建立需要添加的控件。加入任務欄分爲三步,一利用AddPage( )添加頁,二利用AddGroup( )添加控件羣,三是利用AddTask()添加具體的任務控件,在添加具體窗體控件時,可以利用AddWindow()完成。

SetCaption(_T("my task pane"));

         SetIconsList(IDB_TASK,16);

         EnableNavigationToolbar(TRUE);

         EnableWrapLabels(TRUE);

         EnableOffsetCustomControls(FALSE);

         m_nDocumentsGroup= AddGroup (_T("Open a document"),FALSE, TRUE);

         // Add MRU list:

         AddMRUFilesList(m_nDocumentsGroup);

         AddTask(m_nDocumentsGroup, _T("MoreDocuments..."), 0, ID_FILE_OPEN);

         int nPage1Gr2 = AddGroup (_T("Customgroup"));

         m_nUserColorGroup= nPage1Gr2;

         AddTask(nPage1Gr2, _T("Task 1"), 1,ID_TASK1);

         m_nUserColorTask= AddTask (nPage1Gr2, _T("Task 2"),2, ID_TASK2);

         AddTask(nPage1Gr2, _T("Task 3"), 3,ID_TASK3);

         AddSeparator(nPage1Gr2);

         AddTask(nPage1Gr2, _T("Task 4"), 4,ID_TASK4);

         AddSeparator(nPage1Gr2);

         AddTask(nPage1Gr2, _T("Long task's name to see wordswrap feature"), 6, ID_TASK5);

         int nPage1Gr3 = AddGroup (_T("Details"),TRUE);

         AddLabel(nPage1Gr3, _T("The Label contains text, whichcan be displayed in several lines. \n\nText can include line breakingcharacters \'\\n\' and &underline markers \'&&\'"));

         // Add second page:

         int nPage2 = AddPage (_T("Custompage"));

         int nPage2Gr1 = AddGroup (nPage2, _T("Tree Control"));

         CreateTreeControl();

         const int nControlHeight= 90;

         AddWindow(nPage2Gr1,m_wndTreeCtrl.GetSafeHwnd(),nControlHeight);

         AddTask(nPage2Gr1, _T("My favorites..."),9, ID_TASK9);

         int nPage3 = AddPage (_T("myFavoriate"));

         int nPage2Gr2 = AddGroup (nPage2, _T("Edit Control"));

         CreateEditControl();

         AddWindow(nPage2Gr2, m_wndEditCtrl.GetSafeHwnd (), nControlHeight);

         AddTask(nPage2Gr2, _T("My Input"), 8,ID_TASK9);

添加完控件後,可以設定任務欄的屬性,要控制任務欄屬性,首先需要獲得任務欄指針

myTaskPane* CTaskPaneTestView::GetTasksPane()

{

         CMainFrame*pMainFrm = ((CMainFrame*) AfxGetMainWnd ());

         ASSERT_VALID(pMainFrm);

         return &(pMainFrm->m_wndTaskPane);

}

(1)工具條的顯示與隱藏
       myTaskPane*pTaskPane = GetTasksPane ();

         pTaskPane->EnableNavigationToolbar(m_Navigate);

         //??¤??¨¹Ì???¬?¨ª¨ª¡ìä¡ã¨²

         pTaskPane->RecalcLayout();

(2)顯示隱藏滾動條

       myTaskPane*pTaskPane = GetTasksPane ();

         pTaskPane->EnableScrollButtons(!m_ScrollBar);

         pTaskPane->RecalcLayout();

(3)拉開、縮進任務欄中的長文本

       pTaskPane->EnableWrapTasks(m_WarpTaskText);

         pTaskPane->RecalcLayout();

(4)拉開、縮進文本框中的文本

pTaskPane->EnableWrapLabels(m_WarpEditText);

         pTaskPane->RecalcLayout();

另外,還可以設定任務欄中的座標、縮進座標、設定文本的顏色等。具體可以參見相應的成員函數。

最終軟件界面:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章