示例一  自制对话框添加页面

目的在于给自制对话框添加自己的页面,在生成的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();

另外,还可以设定任务栏中的坐标、缩进坐标、设定文本的颜色等。具体可以参见相应的成员函数。

最终软件界面:

学习 VS2010编程经典示例相关推荐

  1. c语言程序设计基础1千克,c语言学习知识编程经典编辑题汇总整编.doc

    c语言学习知识编程经典编辑题汇总整编.doc - C语言编程基础习题汇总1.设计一个由键盘输入三个整数,求这三个数的平均数的程序.2.编写一个程序,用于水果店售货员结账.已知苹果每斤2.50元,鸭梨每 ...

  2. Linux学习路线及网络编程经典书籍

    linux学习资源整理:https://zhuanlan.zhihu.com/p/22654634 Linux初学者(学习资料):https://zhuanlan.zhihu.com/p/217232 ...

  3. Linux学习路线及网络编程经典书籍(转载)

    linux学习资源整理:https://zhuanlan.zhihu.com/p/22654634 Linux初学者(学习资料):https://zhuanlan.zhihu.com/p/217232 ...

  4. getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)

    作者:CHAITANYA SINGH 来源:通过示例学习Java编程(14):Java中的构造函数-方家话题 构造函数是用来初始化新创建的对象的代码块.构造函数类似于java中的实例方法(Instan ...

  5. @value 静态变量_Java中的变量——通过示例学习Java编程(4)

    作者:CHAITANYA SINGH 来源: 通过示例学习Java编程(4):Java中的变量-方家话题​www.koofun.com 变量是用来存放可以更改的值的容器.例如,当我写int i = 1 ...

  6. 先锋机器人学习笔记_1-4 Pioneer SDK与VS2010编程配置

    1.简介概览 先锋机器人开发软件:Pioneer SDK Pioneer SDK是一系列开发库和应用程序的集合,应用在所有MobileRobots移动机器人平台和可选配件上.标准Pioneer SDK ...

  7. 零基础学习Shell编程

    一:起因 (0)也许由于一时的冲动使得你开始关注并学习shell编程:亦许由于是"道听途说"shell的威力很大:亦许由于shell编程的魅力:亦许由于作为一个coder的偏好:亦 ...

  8. C, C++, Network编程经典书籍

    文章内容来源自网络.因时间久远,现在难以知道具体的来源. 自从Dennis M.Ritchie于1973年设计并实现C语言以来,计算机程序设计领域已经发生了巨大的变化.以C语言为根基的C++.Java ...

  9. 【26天高效学习Java编程】Day19:60 多个实例讲解,彻底搞懂Java 多线程 【可查阅,可复习,可面试】

    本专栏将从基础开始,循序渐进,由浅入深讲解Java的基本使用,希望大家都能够从中有所收获,也请大家多多支持. 专栏地址:26天高效学习Java编程 相关软件地址:软件地址 所有代码地址:代码地址 如果 ...

最新文章

  1. 【C#串口编程计划】C#串口协议解析 -- 二进制数据
  2. 创业者:创业要疯狂融资要理性
  3. UVa11107 - Life Forms(后缀数组)
  4. OPenCV膨胀函数dilate()的使用
  5. C++程序设计(第2版)课后习题答案--第11章
  6. 服务器麒麟系统能设置mtu吗,麒麟操作系统安装标准手册-20210405220006.docx-原创力文档...
  7. zklib php,php 安装zookeeper扩展报错
  8. scrapy常用设置参考手册
  9. android wear5.0,Android Wear安卓5.0正式到来
  10. java 10的 6次方_【Java】 剑指offer(15) 数值的整数次方
  11. UNreal 创建一个简单的玻璃材质+金属材质+创建材质实例
  12. 刘霞:“手艺人鞋吧”圆了创业梦_创业时代_科技时代_新浪网
  13. 4-11 Isomorphic (10分)
  14. Spring MVC 地址请求映射
  15. 让我摘下星星送给你_抖音摘下星星给你是什么歌_抖音想摘下星星给你歌名是什么_好特教程...
  16. 通过ssh-keygen命令生成SSH密钥
  17. 年末系列(2)-加速器
  18. java同一个包是什么意思_java中包到底是什么意思?包访问权限又是什么意思,有C++基础。...
  19. 麻烦攻克食材串味难题!保姆级除味妙招请查收
  20. 数字孪生平台技术方案

热门文章

  1. ssm+jsp计算机毕业设计疫情期间北张村村民行程管理系统mwj1v(程序+lw+源码+远程部署)
  2. Ubuntu好用的词典 星际译王 stardict安装 词典添加
  3. C#和vb.net代码相互转换,翻译
  4. 后缀名.dat文件在选择打开方式时误勾选了用记事本打开, 结果电脑上的*.dat文件的打开方式都变成了记事本,没有修改文件的内容,如何恢复.bat文件的默认打开方式
  5. Java应用小技巧---label上的文字显示下划线
  6. 机器学习-机器学习十大算法
  7. 网络爬虫-破解极验三代滑动验证码
  8. qt designer加载自定义组件
  9. PHPRunner 10.7.0 PHP代码生成器
  10. 关于Iframe嵌入页面,获取内部页面高度的办法