Windows7的超级任务栏比起常规的windows任务栏主要做了下列改进

 

1、任务栏中的任务图标化,连开始菜单的按钮都显得跟任务栏中的图标差不多样式;

2、任务栏放弃了实时运行的概念,任务栏中开始变得像桌面,你可以把常用程序的图标放到任务栏上,当你需要使用这个程序的时候不需要回到桌面去点击快捷方式,直接在任务栏上点击就可以,当前正在运行的程序会比当前没有运行的程序在任务栏中多一个外框区分;

3、可以用WIN键+对应任务栏中图标的顺序数字来打开或者激活该任务;

4、默认同类任务进行合并,有合并的程序在任务栏中的图标有会根据合并的数量有相应的层数表现;

5、对于所有其他程序在托盘区的图标都会默认自动隐藏,可以进行图标和通知的自定义,隐藏的图标展开不再是在原任务栏,而是在上方会出现的一个单独框进行显示;

6、默认取消了快速启动栏;

7、将“显示桌面”的快捷方式变成了一个不起眼的置于任务栏最右边的小方块;

8、以媒体库代替了我的电脑,媒体库中列出视频、音乐、文档、图片四类;

 

 

这些改动虽然在技术上面不是什么新技术,但是能预见对于我们日常使用电脑会带来巨大的影响,它会改变我们的使用习惯,影响我们的电脑观念。对于这些改进所带来的影响总结为以下4点:

 

1、任务栏桌面化,任务栏集合了部分桌面的功能,桌面的重要性下降,连“返回桌面”的快捷方式都被移到最右边不起眼的角落了,大多数情况下用户操作在任务栏即可完成,不需要返回到桌面,桌面开始转成为了文档临时存放区域,这会带给用户一个新的体验感觉,“操作系统即桌面”转化成了“操作系统即任务栏”;

2、程序对于任务栏上的进一步支持显得更为重要,一些能够对新任务栏支持的更好的软件会给自己加分,比如能够像WINDOWS7中的WM那样支持在任务栏预览时操作这样的人性化设计更能获得用户的青睐;

3、托盘区变成真正的托盘区,用户没有主动自定义,程序没办法保持在托盘区露脸,甚至连通知都没办法。对于一些程序这是一件相当糟糕的事情,比如QQ,如果没自定义,声音提示没被注意的时候,新信息来了你是完全无法察觉的,当然这对某些刻意想隐藏自己踪迹的程序来说是个好消息;

4、用户减少了对桌面的依赖后,对任务栏的依赖程度加深。因为任务栏空间终归有限,他们会尝试将自己最常用的软件放在上面,这些软件的使用频率得到更高的提升。同时由于给用户带来“操作系统即任务栏”的感觉后,用户会花更少的时间进行系统的改进、软件的更替等操作,会更满足于任务栏中常用软件,这让老软件的用户忠诚度更高,新软件获取用户更加困难。软件之间的战争从“占领桌面”、占领“托盘区”转移到“占领任务栏”。

 

 

 大家一定迫不及待的想针对Windows 7超级任务栏开发一个自己的应用吧,我们来亲自实验2个超级任务栏程序!

(1)基于Visual C++2010开发支持Windows 7超级任务栏缩略图的应用程序

 1.为使在MFC应用程序任务栏缩略图,同时使用MFC应用程序向导,所有用户需要做的是选择“多重文件”的选项“选项卡式文档”功能的应用程序类型。当应用程序运行时,MFC将采取一系列每个视图快照并将其发送到任务栏的API显示为缩略图。

基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_windows

 2.MFC应用程序向导 - 应用类型

在Visual Studio 2010,打开TaskbarThumbnails_Solution / TaskbarthumbnailsDemo.sln解决方案(在源文件夹)。

生成并运行应用程序。打开一些。JPEG图像文件使用的应用程序。悬停在该应用程序演示任务栏上的按钮。

 

 基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_windows_02

 

 

 

 

 

(2)开发一个完全展示Windows 7超级任务栏的应用程序

1.打开VS2010,基于MFC创建一个应用程序TaskBarDemo的多文档程序,按照默认向导生成即可,

我们会得到下列的视图。新的任务栏功能的使用提供一个覆盖任务栏图标,进度条,跳跃列表和缩略图预览.

 

基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_VC++编程技术_03

 

 

2.在这个程序中,可以切换应用程序的任务栏按钮覆盖图标,当用户点击一个图标的按钮。
在MFC中,可以通过使用一个覆盖图标CFrameWnd::SetTaskbarOverlayIcon()。要清除覆盖任务栏图标,传递NULL(0)至SetTaskbarOverlayIcon()。 。
在TaskbarDemo /源文件,源文件OverlayIconTab.cpp和覆盖图标方法,COverlayIconTab:消息处理程序:OnOverlayIconInfo()。将使用此消息处理程序添加代码必要在作为一个任务栏图标的按钮覆盖相同的图标。
添加到COverlayIconTab以下代码::OnOverlayIconInfo():

CMainFrame* mainFrm = dynamic_cast<CMainFrame*>(AfxGetApp()->GetMainWnd());

if (mainFrm)
    mainFrm->SetTaskbarOverlayIcon(IDI_ICON_INFO,L"Info");

 

3.编译程序并运行,按下按钮  基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_windows_04 ,就会发现任务栏的  图标加上了   基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_VC++编程技术_05图标的标志基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_windows_04

 

基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_WindowsC++编程_07

 

 

4.继续加入消息处理代码

void COverlayIconTab::OnOverlayIconQuestion()
{
    //查询图标
    CMainFrame* mainFrm = dynamic_cast<CMainFrame*>(AfxGetApp()->GetMainWnd());
    if (mainFrm)
        mainFrm->SetTaskbarOverlayIcon(IDI_ICON_QUESTION, L"Question");   
}

void COverlayIconTab::OnOverlayIconNoVolume()
{
    // 重新绘制图标
    CMainFrame* mainFrm = dynamic_cast<CMainFrame*>(AfxGetApp()->GetMainWnd());
    if (mainFrm)
        mainFrm->SetTaskbarOverlayIcon(IDI_ICON_NO_VOLUME,L"No Volume");
}

void COverlayIconTab::OnOverlayIconNone()
{
    // 清除图标
    CMainFrame* mainFrm = dynamic_cast<CMainFrame*>(AfxGetApp()->GetMainWnd());
    if (mainFrm)                                      
        mainFrm->SetTaskbarOverlayIcon((HICON)0, L"");      
}

 

 

 

 5.在任务栏使用进度条,设置的状态和应用程序的任务栏的进度条的值时,用户从一个组合框或更改该值通过使用滑块的进展情况。 MFC提供了许多方法来更新进度栏任务栏,

CFrameWnd::SetProgressBarRange()

CFrameWnd::SetProgressBarPosition()

CFrameWnd::SetProgressBarState()
在TaskbarDemo /源文件中:
打开文件ProgressBarTab.cpp,和
找到滑块控件的消息处理程序,CProgressBarTab::OnHScroll()
添加以下代码来更新后的注释栏的进度栏将代码添加到处理滑杆的变化:

UpdateData();
CMainFrame* mainFrm = dynamic_cast<CMainFrame*>(AfxGetApp()->GetMainWnd());
mainFrm->SetProgressBarPosition(m_ProgressSliderValue);

编译并运行,转到进度栏选项卡。移动滑块,并注意在应用程序的任务栏按钮运动。
效果如下图所示,

基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_WindowsC++编程_08

 

 滑杆和任务栏按钮进展指标

现在,我们要更新进度条的情况时,组合框选项更新,因此我们添加必要的代码CProgressBarTab::OnCbnSelchangeProgressStatusCombo()事件处理程序:

 

CMainFrame* mainFrm = dynamic_cast<CMainFrame*>(AfxGetApp()->GetMainWnd());

switch (m_ProgrssStatusCombo.GetCurSel())
{
case 0 :
    mainFrm->SetProgressBarState(TBPF_NORMAL);
    break;
case 1 :
    mainFrm->SetProgressBarState(TBPF_ERROR);
    break;
case 2 :
    mainFrm->SetProgressBarState(TBPF_PAUSED);
    break;
case 3 :
    mainFrm->SetProgressBarState(TBPF_INDETERMINATE);
    break;
case 4 :
    mainFrm->SetProgressBarState(TBPF_NOPROGRESS);
    break;
default:
    mainFrm->SetProgressBarState(TBPF_NORMAL);
}

 生成并运行应用程序,然后:
导航到进度栏选项卡,
选择一个组合的进展程度不同的样式,然后
移动滑块的进展。进度栏状态将被更改为适当的风格,即任务栏的进度条是红色,进度状态设置为错误,任务栏的进度条是绿色的进展情况时,设置为普通(签出其他样式太):

最后,这最后一步是可选的,但您可能需要重置状态组合的'正常'的进展情况时,从没有进展或中级更新。要解决此问题,在CProgressBarTab::OnHScroll()添加代码:

 if (m_ProgressSliderValue > 0 && m_ProgrssStatusCombo.GetCurSel() >= 3) // 没有进度条过快
{
  
    m_ProgrssStatusCombo.SetCurSel(0); // 一般状态
}

创建并执行,效果如下

基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_Visual C++2010编程技术_09

 

 


6.添加任务栏跳转列表

在这项任务中,您将添加的功能,支持加入已知种类,自定义类别,目标和任务应用程序的跳转列表。MFC提供了一个新类,CJumpList,允许操纵的种类和任务栏上的应用程序的JumpList项。

在TaskbarDemo /源文件,打开文件JumpListTab.cpp并寻找执行的CJumpListTab::UpdateRegistration()。这种方法执行另一个进程注册所需的文件关联。文件关联注册并不需要在另一个进程,但它是在另一个进程置于保持本教程应用简单focused.Note:
需要注册文件关联,因为应用程序必须是已注册的文件为一个该类型的项目类型的处理程序出现在它的跳转表。这不,但是,必须为该文件类型的默认处理程序。
添加必要的代码,更新注册表和注销jpg文件在相应的信息处理:

 

 

 void CJumpListTab::OnRegisterFileType()
{   
    // 注册
    UpdateRegistration(TRUE);
}

void CJumpListTab::OnUnregisterFileType()
{
    // 解除注册
    UpdateRegistration(FALSE);
}

 接下来的步骤将用于添加必要的代码以添加各种跳转列表项。这里的每个描述:

基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_windows_10

 

 

 

跳表项目描述

追加已知类别的跳转列表,添加此代码CJumpListTab::OnAddKnownCategory()事件处理程序:

int curSel = m_knownCategoryCombo.GetCurSel();

if (curSel < 0)
{
    AfxMessageBox(L"必须选择一个以上的已知类别");
return;
}

if (curSel == 0)
{
    if (m_jumpList.AddKnownCategory(KDC_FREQUENT))
        m_JumpList_Display_Items.AddString(L"Known Category: Frequent");
    else
        AfxMessageBox(L"无法新增频繁已知种类");
}
else if (curSel == 1)
{
    if (m_jumpList.AddKnownCategory(KDC_RECENT))
        m_JumpList_Display_Items.AddString(L"Known Category: Recent");
    else
        AfxMessageBox(L"失败添加已知种类");
}

 

 为跳转列表添加一个信息描述CJumpListTab::OnAddDestination() :
UpdateData(); // 更新界面

if (m_destinationPath.IsEmpty() || m_destinationCategory.IsEmpty())
{
    AfxMessageBox(L"路径与对象必须添加.");
    return;
}

if (!m_jumpList.AddDestination(m_destinationCategory, m_destinationPath))
{
    AfxMessageBox(L"描述添加失败.");
}
else
{
    CString text = L"Destination: " + m_destinationPath;
    m_JumpList_Display_Items.AddString(text);
}

 

要添加的跳转表的新任务,添加CJumpListTab::OnAddTask() 事件处理程序:

 

UpdateData(); // S更新UI

if (m_taskPath.IsEmpty() || m_taskTitle.IsEmpty())
{
    AfxMessageBox(L"路径与描述必须都存在.");
    return;
}

if (!m_jumpList.AddTask(m_taskPath, m_taskArgs, m_taskTitle, m_taskIconPath, m_taskIconIndex))
{
    AfxMessageBox(L"添加失败.");
}
else
{
    CString text = L"Task: " + m_taskTitle ;
    m_JumpList_Display_Items.AddString(text);
}

要添加的跳转表的新任务,添加CJumpListTab::OnClearAll() 事件处理程序:

m_jumpList.ClearAll();
m_JumpList_Display_Items.ResetContent();

展示表的变化,则在CJumpListTab::OnCommit() 添加事件

if (m_jumpList.CommitList())
{
    m_JumpList_Display_Items.ResetContent();
    m_jumpList.InitializeList();
}
else
{
    AfxMessageBox(L"Failed to commit jump list.");
}

 

F5运行,添加若干个jpg文件,windows7的效果如下

基于Visual C++2010与windows SDK fo windows7开发Windows 7超级任务栏应用程序_WindowsC++编程_11

 

 

核心代码如下:

 

 #pragma once class COverlayIconTab : public CDialog { DECLARE_DYNAMIC(COverlayIconTab) public: COverlayIconTab(CWnd* pParent = NULL); virtual ~COverlayIconTab(); enum { IDD = IDD_DIALOG_OVERLAY_ICON }; protected: virtual void DoDataExchange(CDataExchange* pDX); afx_msg void OnOverlayIconInfo(); afx_msg void OnOverlayIconQuestion(); afx_msg void OnOverlayIconNoVolume(); afx_msg void OnOverlayIconNone(); DECLARE_MESSAGE_MAP() }; #include "stdafx.h" #include "TaskbarDemo.h" #include "MainTabCtrl.h" #include "JumpListTab.h" #include "OverlayIconTab.h" #include "ProgressBarTab.h" IMPLEMENT_DYNAMIC(CMainTabCtrl, CTabCtrl) CMainTabCtrl::CMainTabCtrl() { m_Ids[0] = IDD_DIALOG_OVERLAY_ICON; m_Ids[1] = IDD_DIALOG_PROGRESS_BAR; m_Ids[2] = IDD_DIALOG_JUMP_LIST; m_Dialogs[0] = new COverlayIconTab(); m_Dialogs[1] = new CProgressBarTab(); m_Dialogs[2] = new CJumpListTab(); m_nPageCount = 3; } CMainTabCtrl::~CMainTabCtrl() { } void CMainTabCtrl::InitDialogs() { for (int i = 0; i < m_nPageCount; i++) m_Dialogs[i]->Create(m_Ids[i],GetParent()); } void CMainTabCtrl::CreateTabs() { int nSel = GetCurSel(); if(m_Dialogs[nSel]->m_hWnd) m_Dialogs[nSel]->ShowWindow(SW_HIDE); CRect l_rectClient; CRect l_rectWnd; GetClientRect(l_rectClient); AdjustRect(FALSE,l_rectClient); GetWindowRect(l_rectWnd); GetParent()->ScreenToClient(l_rectWnd); l_rectClient.OffsetRect(l_rectWnd.left,l_rectWnd.top); for(int i=0; i < m_nPageCount; i++){ m_Dialogs[i]->SetWindowPos(&wndTop, l_rectClient.left,l_rectClient.top,l_rectClient.Width(),l_rectClient.Height(),SWP_HIDEWINDOW); } m_Dialogs[nSel]->SetWindowPos(&wndTop,l_rectClient.left,l_rectClient.top,l_rectClient.Width(),l_rectClient.Height(),SWP_SHOWWINDOW); m_Dialogs[nSel]->ShowWindow(SW_SHOW); } BEGIN_MESSAGE_MAP(CMainTabCtrl, CTabCtrl) //{​{AFX_MSG_MAP(CMainTabCtrl) ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CMainTabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) { CreateTabs(); *pResult = 0; } #include "stdafx.h" #include "TaskbarDemo.h" #include "ProgressBarTab.h" #include "Mainfrm.h" IMPLEMENT_DYNAMIC(CProgressBarTab, CDialog) CProgressBarTab::CProgressBarTab(CWnd* pParent /*=NULL*/) : CDialog(CProgressBarTab::IDD, pParent) , m_ProgressSliderValue(0) { } CProgressBarTab::~CProgressBarTab() { } void CProgressBarTab::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_PROGRESS_STATUS_COMBO, m_ProgrssStatusCombo); DDX_Control(pDX, IDC_PROGRSS_SLIDER, m_ProgressSlider); DDX_Slider(pDX, IDC_PROGRSS_SLIDER, m_ProgressSliderValue); DDV_MinMaxInt(pDX, m_ProgressSliderValue, 0, 100); } BOOL CProgressBarTab::OnInitDialog() { if (!CDialog::OnInitDialog()) return FALSE; m_ProgrssStatusCombo.SetCurSel(0); // Normal is initially selected return TRUE; } BEGIN_MESSAGE_MAP(CProgressBarTab, CDialog) //}}AFX_MSG_MAP ON_CBN_SELCHANGE(IDC_PROGRESS_STATUS_COMBO, &CProgressBarTab::OnCbnSelchangeProgressStatusCombo) ON_WM_HSCROLL() END_MESSAGE_MAP() void CProgressBarTab::OnCbnSelchangeProgressStatusCombo() { } void CProgressBarTab::OnHScroll(UINT /* nSBCode */, UINT /* nPos */, CScrollBar* pScrollBar ) { if (pScrollBar == NULL) // pScrollBar will be NULL if it's a normal scroll bar return; } #include "stdafx.h" #include "TaskbarDemo.h" #include "JumpListTab.h" #include "Mainfrm.h" IMPLEMENT_DYNAMIC(CJumpListTab, CDialog) CJumpListTab::CJumpListTab(CWnd* pParent /*=NULL*/) : CDialog(CJumpListTab::IDD, pParent) , m_maxSlots(0) , m_destinationCategory(_T("")) , m_destinationPath(_T("")) , m_taskTitle(_T("")) , m_taskPath(_T("")) , m_taskArgs(_T("")) , m_taskIconPath(_T("")) , m_taskIconIndex(0) { } CJumpListTab::~CJumpListTab() { } void CJumpListTab::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_MAX_SLOTS, m_maxSlots); DDX_Control(pDX, IDC_JUMP_LIST_ITEMS, m_JumpList_Display_Items); DDX_Control(pDX, IDC_KNOWN_CATEGORY_COMBO, m_knownCategoryCombo); DDX_Text(pDX, IDC_DEST_CATEGORY, m_destinationCategory); DDX_Text(pDX, IDC_DEST_PATH, m_destinationPath); DDX_Text(pDX, IDC_TASK_TITLE, m_taskTitle); DDX_Text(pDX, IDC_TASK_PATH, m_taskPath); DDX_Text(pDX, IDC_TASK_ARGS, m_taskArgs); DDX_Text(pDX, IDC_TASK_ICON_PATH, m_taskIconPath); DDX_Text(pDX, IDC_TASK_ICON_INDEX, m_taskIconIndex); DDX_Control(pDX, IDC_DEST_PATH, m_destinationPathEditBox); DDX_Control(pDX, IDC_TASK_PATH, m_taskPathEditBox); DDX_Control(pDX, IDC_TASK_ICON_PATH, m_taskIconPathEditBox); } BOOL CJumpListTab::OnInitDialog() { if (!CDialog::OnInitDialog()) return FALSE; m_jumpList.InitializeList(); m_maxSlots = m_jumpList.GetMaxSlots(); UpdateData(false); return TRUE; } BEGIN_MESSAGE_MAP(CJumpListTab, CDialog) ON_BN_CLICKED(IDC_ADD_KNOWN_CATEGORY, &CJumpListTab::OnAddKnownCategory) ON_BN_CLICKED(IDC_ADD_DESTINATION, &CJumpListTab::OnAddDestination) ON_BN_CLICKED(IDC_ADD_TASK, &CJumpListTab::OnAddTask) ON_BN_CLICKED(IDC_CLEAR_ALL, &CJumpListTab::OnClearAll) ON_BN_CLICKED(IDC_COMMIT, &CJumpListTab::OnCommit) ON_BN_CLICKED(IDC_SELECT_CATEGORY_PATH, &CJumpListTab::OnSelectDestinationPath) ON_BN_CLICKED(IDC_SELECT_TASK_PATH, &CJumpListTab::OnSelectTaskPath) ON_BN_CLICKED(IDC_SELECT_TASK_ICON_PATH, &CJumpListTab::OnSelectTaskIconPath) ON_BN_CLICKED(IDC_REGISTER_FILE_TYPE, &CJumpListTab::OnRegisterFileType) ON_BN_CLICKED(IDC_UNREGISTER_FILE_TYPE, &CJumpListTab::OnUnregisterFileType) END_MESSAGE_MAP() // CJumpListTab message handlers void CJumpListTab::OnAddKnownCategory() { } void CJumpListTab::OnAddDestination() { } void CJumpListTab::OnAddTask() { } void CJumpListTab::OnClearAll() { } void CJumpListTab::OnCommit() { } void CJumpListTab::UpdateRegistration(BOOL isRegister) { CString params; CString applicationPath; AfxGetModuleFileName(0, applicationPath); params.Format(L"%s /"%s/" /"%s/" /"%s/" %s %s", isRegister ? L"TRUE" : L"FALSE", L"Microsoft.Samples.TaskbarDemo", // ProgId applicationPath, // Path L"TaskbarDemo Document", // friendly doc name L"TaskbarDemo.AppID.1.0.0.0", // Taskbar AppUserModeID L".jpg"); // extensions CString shortFileNameParam; AfxGetModuleShortFileName(0, shortFileNameParam); CString exeFileName = applicationPath; exeFileName.Replace(L"TaskbarDemo.exe", L"RegistrationHelper.exe"); SHELLEXECUTEINFO shex; memset( &shex, 0, sizeof( shex) ); shex.cbSize = sizeof( SHELLEXECUTEINFO ); shex.fMask = 0; shex.hwnd = this->GetSafeHwnd(); shex.lpVerb = _T("runas"); shex.lpFile = exeFileName; shex.lpParameters = params; shex.lpDirectory = _T("."); shex.nShow = SW_NORMAL; ::ShellExecuteEx( &shex ); } void CJumpListTab::OnRegisterFileType() { } void CJumpListTab::OnUnregisterFileType() { } void CJumpListTab::OnSelectDestinationPath() { CFileDialog openDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST ,L"Jpeg Files|*.jpg;*.jpeg||"); if (openDlg.DoModal()) { m_destinationPathEditBox.SetWindowText(openDlg.GetPathName()); } } void CJumpListTab::OnSelectTaskPath() { CFileDialog openDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST ,L"Executable Files|*.exe;*.cmd||"); if (openDlg.DoModal()) { m_taskPathEditBox.SetWindowText(openDlg.GetPathName()); } } void CJumpListTab::OnSelectTaskIconPath() { CFileDialog openDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST ,L"Icon Files|*.ico;*.dll;*.exe||"); if (openDlg.DoModal()) { m_taskIconPathEditBox.SetWindowText(openDlg.GetPathName()); } } #include "stdafx.h" #include "TaskbarDemo.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #endif IMPLEMENT_DYNCREATE(CMainFrame, CFrameWndEx) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) ON_WM_CREATE() ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize) ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew) ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook) ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook) END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; CMainFrame::CMainFrame() { theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_WINDOWS_7); } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWndEx::OnCreate(lpCreateStruct) == -1) return -1; BOOL bNameValid; OnApplicationLook(theApp.m_nAppLook); if (!m_wndMenuBar.Create(this)) { TRACE0("Failed to create menubar/n"); return -1; // fail to create } m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY); CMFCPopupMenu::SetForceMenuFocus(FALSE); if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) { TRACE0("Failed to create toolbar/n"); return -1; // fail to create } CString strToolBarName; bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD); ASSERT(bNameValid); m_wndToolBar.SetWindowText(strToolBarName); CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); if (!m_wndStatusBar.Create(this)) { TRACE0("Failed to create status bar/n"); return -1; // fail to create } m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_wndMenuBar); DockPane(&m_wndToolBar); CDockingManager::SetDockingMode(DT_SMART); EnableAutoHidePanes(CBRS_ALIGN_ANY); EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR); CMFCToolBar::EnableQuickCustomization(); return 0; } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWndEx::PreCreateWindow(cs) ) return FALSE; return TRUE; } // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWndEx::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWndEx::Dump(dc); } #endif //_DEBUG void CMainFrame::OnViewCustomize() { CMFCToolBarsCustomizeDialog* pDlgCust = new CMFCToolBarsCustomizeDialog(this, TRUE /* scan menus */); pDlgCust->Create(); } LRESULT CMainFrame::OnToolbarCreateNew(WPARAM wp,LPARAM lp) { LRESULT lres = CFrameWndEx::OnToolbarCreateNew(wp,lp); if (lres == 0) { return 0; } CMFCToolBar* pUserToolbar = (CMFCToolBar*)lres; ASSERT_VALID(pUserToolbar); BOOL bNameValid; CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); return lres; } void CMainFrame::OnApplicationLook(UINT id) { CWaitCursor wait; theApp.m_nAppLook = id; switch (theApp.m_nAppLook) { case ID_VIEW_APPLOOK_WIN_2000: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager)); break; case ID_VIEW_APPLOOK_OFF_XP: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP)); break; case ID_VIEW_APPLOOK_WIN_XP: CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE; CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); break; case ID_VIEW_APPLOOK_OFF_2003: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003)); CDockingManager::SetDockingMode(DT_SMART); break; case ID_VIEW_APPLOOK_VS_2005: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005)); CDockingManager::SetDockingMode(DT_SMART); break; case ID_VIEW_APPLOOK_VS_2008: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008)); CDockingManager::SetDockingMode(DT_SMART); break; case ID_VIEW_APPLOOK_WINDOWS_7: CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7)); CDockingManager::SetDockingMode(DT_SMART); break; default: switch (theApp.m_nAppLook) { case ID_VIEW_APPLOOK_OFF_2007_BLUE: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue); break; case ID_VIEW_APPLOOK_OFF_2007_BLACK: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack); break; case ID_VIEW_APPLOOK_OFF_2007_SILVER: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver); break; case ID_VIEW_APPLOOK_OFF_2007_AQUA: CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua); break; } CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007)); CDockingManager::SetDockingMode(DT_SMART); } RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE); theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook); } void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI) { pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID); }

 

 

需要源码与技术交流的,请在本人CSDN博客留言!

 本文作者专著《Visual C++2010开发权威指南》即将推出,敬请关注,Visual C++2010最近技术,Windows7开发最新技术!