设为首页 收藏本站
查看: 572|回复: 0

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

[复制链接]

尚未签到

发表于 2015-5-11 13:56:57 | 显示全部楼层 |阅读模式
  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显示为缩略图。
DSC0000.png
  2.MFC应用程序向导 - 应用类型
  在Visual Studio 2010,打开TaskbarThumbnails_Solution / TaskbarthumbnailsDemo.sln解决方案(在源文件夹)。
  生成并运行应用程序。打开一些。JPEG图像文件使用的应用程序。悬停在该应用程序演示任务栏上的按钮。
  
DSC0001.png
  
  
  
  
  
  (2)开发一个完全展示Windows 7超级任务栏的应用程序
  1.打开VS2010,基于MFC创建一个应用程序TaskBarDemo的多文档程序,按照默认向导生成即可,
  我们会得到下列的视图。新的任务栏功能的使用提供一个覆盖任务栏图标,进度条,跳跃列表和缩略图预览.
  
DSC0002.png
  
  
  2.在这个程序中,可以切换应用程序的任务栏按钮覆盖图标,当用户点击一个图标的按钮。
在MFC中,可以通过使用一个覆盖图标CFrameWnd::SetTaskbarOverlayIcon()。要清除覆盖任务栏图标,传递NULL(0)至SetTaskbarOverlayIcon()。 。
在TaskbarDemo /源文件,源文件OverlayIconTab.cpp和覆盖图标方法,COverlayIconTab:消息处理程序:OnOverlayIconInfo()。将使用此消息处理程序添加代码必要在作为一个任务栏图标的按钮覆盖相同的图标。
添加到COverlayIconTab以下代码::OnOverlayIconInfo():
  CMainFrame* mainFrm = dynamic_cast(AfxGetApp()->GetMainWnd());
  if (mainFrm)
    mainFrm->SetTaskbarOverlayIcon(IDI_ICON_INFO,L"Info");
  
  3.编译程序并运行,按下按钮   DSC0003.png ,就会发现任务栏的  图标加上了    DSC0004.png 图标的标志
  
DSC0005.png
  
  
  4.继续加入消息处理代码
  void COverlayIconTab::OnOverlayIconQuestion()
{
    //查询图标
    CMainFrame* mainFrm = dynamic_cast(AfxGetApp()->GetMainWnd());
    if (mainFrm)
        mainFrm->SetTaskbarOverlayIcon(IDI_ICON_QUESTION, L"Question");   
}
  void COverlayIconTab::OnOverlayIconNoVolume()
{
    // 重新绘制图标
    CMainFrame* mainFrm = dynamic_cast(AfxGetApp()->GetMainWnd());
    if (mainFrm)
        mainFrm->SetTaskbarOverlayIcon(IDI_ICON_NO_VOLUME,L"No Volume");
}
  void COverlayIconTab::OnOverlayIconNone()
{
    // 清除图标
    CMainFrame* mainFrm = dynamic_cast(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(AfxGetApp()->GetMainWnd());
mainFrm->SetProgressBarPosition(m_ProgressSliderValue);
  编译并运行,转到进度栏选项卡。移动滑块,并注意在应用程序的任务栏按钮运动。
效果如下图所示,
DSC0006.png
  
  滑杆和任务栏按钮进展指标
  现在,我们要更新进度条的情况时,组合框选项更新,因此我们添加必要的代码CProgressBarTab::OnCbnSelchangeProgressStatusCombo()事件处理程序:
  
  CMainFrame* mainFrm = dynamic_cast(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); // 一般状态
}
  创建并执行,效果如下
DSC0007.png
  
  
  
6.添加任务栏跳转列表
  在这项任务中,您将添加的功能,支持加入已知种类,自定义类别,目标和任务应用程序的跳转列表。MFC提供了一个新类,CJumpList,允许操纵的种类和任务栏上的应用程序的JumpList项。
  在TaskbarDemo /源文件,打开文件JumpListTab.cpp并寻找执行的CJumpListTab::UpdateRegistration()。这种方法执行另一个进程注册所需的文件关联。文件关联注册并不需要在另一个进程,但它是在另一个进程置于保持本教程应用简单focused.Note:
需要注册文件关联,因为应用程序必须是已注册的文件为一个该类型的项目类型的处理程序出现在它的跳转表。这不,但是,必须为该文件类型的默认处理程序。
添加必要的代码,更新注册表和注销jpg文件在相应的信息处理:
  
  
  void CJumpListTab::OnRegisterFileType()
{   
    // 注册
    UpdateRegistration(TRUE);
}
  void CJumpListTab::OnUnregisterFileType()
{
    // 解除注册
    UpdateRegistration(FALSE);
}
  接下来的步骤将用于添加必要的代码以添加各种跳转列表项。这里的每个描述:
DSC0008.png
  
  
  
  跳表项目描述
  追加已知类别的跳转列表,添加此代码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的效果如下
DSC0009.png
  
  
  核心代码如下:
  
  #pragma onceclass 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->Create(m_Ids,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->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_MAPEND_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 selectedreturn TRUE;}BEGIN_MESSAGE_MAP(CProgressBarTab, CDialog)//}}AFX_MSG_MAPON_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 barreturn;}#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 handlersvoid 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", // ProgIdapplicationPath, // PathL"TaskbarDemo Document", // friendly doc nameL"TaskbarDemo.AppID.1.0.0.0", // Taskbar AppUserModeIDL".jpg"); // extensionsCString 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#endifIMPLEMENT_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 _DEBUGvoid CMainFrame::AssertValid() const{CFrameWndEx::AssertValid();}void CMainFrame::Dump(CDumpContext& dc) const{CFrameWndEx::Dump(dc);}#endif //_DEBUGvoid 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开发最新技术!
  
  
  
  
  
  
  
  
  
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65960-1-1.html 上篇帖子: Windows Phone 7的About模板——Your Last About Dialog 下篇帖子: 将品牌机预装的 Windows 7 家庭版升级为 Windows 7 旗舰版的超级简单方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表