目的在于给自制对话框添加自己的页面,在生成的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
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 { 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可以针对对话框的资源进行信息提示,例如按钮等,可以作为在线帮助系统,在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(¶m); 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相关的色彩显示,专门建立了以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), ¶msBalloon); 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), ¶ms); return; } if(m_nType == 3) { theApp.GetTooltipManager()->SetTooltipParams ( AFX_TOOLTIP_TYPE_ALL, RUNTIME_CLASS(CMyTooltip)); } } 最终软件界面: 为了方便界面设计,在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); 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 CStringstrItem2 = GetItemText((int)(lParam1 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是类似于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 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 apBtn1->SetAlwaysLargeImage(); pPanel1->Add(apBtn1.release()); std::auto_ptr apBtn2->SetMenu(IDR_RIBBON_MENU_1); apBtn2->SetAlwaysLargeImage(); pPanel1->Add(apBtn2.release()); std::auto_ptr 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 pPanel2->Add(apBtn4.release()); std::auto_ptr apBtn5->SetMenu(IDR_RIBBON_MENU_1); pPanel2->Add(apBtn5.release()); std::auto_ptr 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消息并建立处理函数,在其中相应该函数即可 最终软件界面如下: 首先利用AppWizard建立工程,然后将视类的基类更改为CTabView,并将所有的CView更改为CTabView。 依次插入以CSrollView、CListView、CFormView、CEditView为基类的CView1、CView2、CView3、CView4,并在程序中进行引用: { 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中,加入窗体文本初始化的代码。 最终软件界面: 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)工具条的显示与隐藏 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(); 另外,还可以设定任务栏中的坐标、缩进坐标、设定文本的颜色等。具体可以参见相应的成员函数。 最终软件界面: 示例三 对话框的Tooltips提示编程
示例四 显示菜单Tooltip编程
示例五 VS2010中新控件的编程
利用字体直接在列表框中进行绘制,只需要改变CMFCFontComboBox的m_bDrawUsingFont属性即可。
示例六 多彩界面,Ribbon编程
示例七 状态栏的编程
示例八 多种类型的视图集合CTabView
intCTabViewTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)示例九 任务栏编程CMFCTasksPane
myTaskPane*pTaskPane = GetTasksPane ();