桌面信息提示信息编程
目的在系统运行有各种各样的信息提示,直接从桌面的右下角弹出对话框给出提示,该提示对话框可以采用系统信息提示对话框,也可以采用自定义对话框进行提示。
(1) 利用VS2010生成对话框形式的工程文件;
(2) 在对话框中加入与桌面提示信息相关的控件,包括外观类型、动画类型、透明度、动画速度、自动关闭、关闭时间等;
(3)
(4) 为各个列表框添加数据
其中,外观类型列表框数据为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;
(5) 自绘图标列表控件
通常的列表控件只能显示字符串,为了能够使得列表中既能显示字符,又能显示图标,需要对列表控件进行重载,建立以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
(6) 利用ClassWizard建立对话框中的各种变量
(7) 初始化
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()函数
(8) 在显示按钮上进行程序设计,设置信息提示界面参数并显示信息提示框
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("信息"));
(9) 最后运行界面
选择显示将看到屏幕右下角弹出相应的提示信息框。