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顯示為縮略圖。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CMwADMyADO3EjNzMTN3kzMzYTMvw1NyITM5ADMy8CXzV2Zh1WS5JHduV0LcFDMn5WZoNmbpl3LcRXZu9lbkN3Yfd2bsJ2Xw9CXzV2Zh1WavwFdl5mLuR2cj5yZvxmYtA3Lc9CX6MHc0RHaiojIsJye.png)
2.MFC應用程式向導 - 應用類型
在Visual Studio 2010,打開TaskbarThumbnails_Solution / TaskbarthumbnailsDemo.sln解決方案(在源檔案夾)。
生成并運作應用程式。打開一些。JPEG圖像檔案使用的應用程式。懸停在該應用程式示範工作列上的按鈕。
(2)開發一個完全展示Windows 7超級工作列的應用程式
1.打開VS2010,基于MFC建立一個應用程式TaskBarDemo的多文檔程式,按照預設向導生成即可,
我們會得到下列的視圖。新的工作列功能的使用提供一個覆寫工作列圖示,進度條,跳躍清單和縮略圖預覽.
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.編譯程式并運作,按下按鈕
,就會發現工作列的 圖示加上了
圖示的标志
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);
編譯并運作,轉到進度欄頁籤。移動滑塊,并注意在應用程式的工作列按鈕運動。
效果如下圖所示,
滑杆和工作列按鈕進展名額
現在,我們要更新進度條的情況時,組合框選項更新,是以我們添加必要的代碼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); // 一般狀态
}
建立并執行,效果如下
6.添加工作列跳轉清單
在這項任務中,您将添加的功能,支援加入已知種類,自定義類别,目标和任務應用程式的跳轉清單。MFC提供了一個新類,CJumpList,允許操縱的種類和工作列上的應用程式的JumpList項。
在TaskbarDemo /源檔案,打開檔案JumpListTab.cpp并尋找執行的CJumpListTab::UpdateRegistration()。這種方法執行另一個程序注冊所需的檔案關聯。檔案關聯注冊并不需要在另一個程序,但它是在另一個程序置于保持本教程應用簡單focused.Note:
需要注冊檔案關聯,因為應用程式必須是已注冊的檔案為一個該類型的項目類型的處理程式出現在它的跳轉表。這不,但是,必須為該檔案類型的預設處理程式。
添加必要的代碼,更新系統資料庫和登出jpg檔案在相應的資訊處理:
void CJumpListTab::OnRegisterFileType()
{
// 注冊
UpdateRegistration(TRUE);
}
void CJumpListTab::OnUnregisterFileType()
{
// 解除注冊
UpdateRegistration(FALSE);
}
接下來的步驟将用于添加必要的代碼以添加各種跳轉清單項。這裡的每個描述:
跳表項目描述
追加已知類别的跳轉清單,添加此代碼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的效果如下
核心代碼如下:
#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開發最新技術!