孫鑫VC++視頻學習筆記之9: 應用程序外觀修改

轉自:http://webbery.tianyablog.com

  閱讀本文前,我們假設您已經:
   1,知道如何創建一個單文檔的App Wizard
   2,知道C++ 類、函數重載等簡單知識
   3,知道如何給View類或者Doc文檔添加成員變量
   4,會用MFC的IDE調試工具最好,那麼本文的程序您可以copy去調試
   5,知道如何爲某個框架類添加虛函數或消息處理函數
  
   
  
  更改標題欄圖標
  
  事先已經添加IDI_ICON1、IDI_ICON2、IDI_ICON3資源。注意要實現代碼,須把變量定義成全局或者用其他方式
  
  HICON m_hI1=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
  HICON m_hI2=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));
  HICON m_hI3=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));
  
  SetClassLong(m_hWnd,GCL_HICON,(LONG)m_h1);
  
  一、在狀態欄上添加時間顯示
  
  1,在String_Table中添加IDS_NEW
  
  2,IDS_NEW添加到CMainFrame的indicator中
  
  3,CMainFrame::OnCreate()中return 之前
  
   CTime t=CTime::GetCurrentTIme();
   CString str=t.Format("%H:%M:%S");
   m_wndStatusBar.SetPaneText(1,str);
  
  //int index=m_wndStatusBar.CommandToIndex(IDS_NEW);
  
  //m_wndStatusBar.SetPaneText(index,str);
  
  //調整顯示寬度
  
  CClinetDC dc(this);
  CSize sz=dc.GetTextExtent(str);
  m_wndStatusBar.SetPaneInfo(index,IDS_NEW,SBPS_NORMAL,sz.cx);
  
  4,爲適時更新設置定時器。在CMainFrame::OnTimer()中複製下面代碼如下:
  
   CTime t=CTime::GetCurrentTIme();
   CString str=t.Format("%H:%M:%S");
  
  //調整顯示寬度
  
  CClinetDC dc(this);
  CSize sz=dc.GetTextExtent(str);
  m_wndStatusBar.SetPaneInfo(1,IDS_NEW,SBPS_NORMAL,sz.cx);
  m_wndStatusBar.SetPaneText(1,str);
  
  5,在CMainFrame::()啓動計時器
  
  SetTimer
  
  二、進度欄
  
  一)創建一個進度欄
  
  1,在MainFrame.h中添加CProgressCtrl對象
  
  CProgressCtrl m_progress;
  
  2,在CMainFrame::OnCreate()中返回前創建之
  
  m_progress.Create(WS_CHILD | WS_VISIBLE,CRect(100,100,200,120),this,123);
  
  3,設置位置
  
  m_progress.SetPos(50);
  
  4,垂直進度欄
  
  m_progress.Create(WS_CHILD | PBS_VERTICAL,CRect(100,100,120,200),this,123);
  
  5,進度欄放入狀態欄窗格
  
   CRect r;
  
   m_wndStatusBar.GetItemRect(2,&r);
  
  //創建時大小和父窗口都改變
  
   m_progress.Create(WS_CHILD | WS_VISIBLE |PBS_SMOOTH,r,&m_wndStatusBar,123);
  
   以上即爲實現代碼,但是放在OnCreate函數中不能實現:因爲OnCreate()返回前狀態欄的位置還沒有確定,所以無法獲得各個子窗格位置,只能用自定義消息辦法響應。
  
  1)定義消息
  
  在MainFrame.h前面添加
  
  #define UM_PROGREE WM_USER
  
  2)消息響應函數原形的聲明宏
  
  在MainFrame.h中添加 afx_msg void OnProgress();//可以添加兩個參數
  
  3)消息映射
  
  在MainFrame.cpp中//}}AFX_MSG_MAP之後添加映射
  
  ON_MESSAGE(UM_PROGRESS,OnProgress)
  
  4)實現消息響應函數
  
  void CMAinFrame::OnProgress()
  
  {
  
  CRect r;
   m_wndStatusBar.GetItemRect(2,&r);
   m_progress.Create(WS_CHILD | WS_VISIBLE,r,&m_wndStatusBar,123);//創建時大小和父窗口都改變
   m_progress.SetPos(50);
  }
  
  5)在OnCreate()中發送消息
  
  PostMessage(UM_PROGRESS);//注意不要用SendMessage();
  
  此時的進度欄在狀態欄上的位置時固定的,不會隨狀態欄位置變化而變化
  
  6)使進度欄與狀態欄位置相關聯
  
  把OnCreate()中的PostMessage()刪除使之失效.
  
  首先添加OnPaint()消息函數
  
  窗口改變重繪會發送WM_PAINT消息,所以只要在OnPaint函數中處理即可.以下代碼添加到OnPaint()中
  
   CRect r;
  
   m_wndStatusBar.GetItemRect(2,&r);
  
   if(!m_progress.m_hWnd)m_progress.Create(WS_CHILD | WS_VISIBLE,r,&m_wndStatusBar,123);//創建時大小和父窗口都改變
  
  else m_progress.MoveWindow(r);//或者SetWindowPos()函數
  
   m_progress.SetPos(50);
  
  
  
  二)將移動座標適時顯示到狀態欄上
  
  1,添加OmMouseMove()函數
  
  2,將狀態欄變量訪問權限改變,備用
  
  在MainFrame.h中
  
  m_wndStatusBar變量改爲公用
  
  3,在view.cpp中包含MainFrame.h
  
  4,在OnMouseMove()中添加
  
  CString s;
  
  s.Format("x=%d,y=%d",point.x,point.y);
  
  //將以下情況之一添加添加此處即可實現
  
  1)((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
  2)((CMainFrame*)GetParent())->SetMessageText(str);
  3)((CMainFrame*)GetParent())->GetMessageBar()->SetMessageText(str);//狀態欄可以不公有
  4)GetDescenddantWindow()根據ID號搜索子孫窗口,直到找到指針
  
  主框架狀態欄ID號爲AFX_IDW_STATUS_BAR
  GetParent()->GetDescenddantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);
  
  三、給軟件增加啓動畫面
  
  1,菜單Project=>Add to Project=>Component and Control,對話框中選擇Visual C++ Components,選擇Splash screen選擇插入,選OK並關閉
  
  2,系統自動增加CSplashWnd類; 在CMainFrame::OnCreate()中添加了CSplashWnd::SHowSplashScreen(this);
  
  3,在CSplashWnd::OnCreate()中有SetTimer(1,750,NULL);設置750ms的啓動畫面顯示間隔
  
  4,自定義顯示界面的話,可以依照這個類進行

 

四、設置工具欄

設置ON_COMMAND函數

void CMainFrame::OnMyBar()
{
    if(!m_newbar.IsWindowVisible())
    {
        m_newbar.ShowWindow(SW_SHOW);

    }
    else   
    {
        m_newbar.ShowWindow(SW_HIDE);

    }
    RecalcLayout();
    DockControlBar(&m_newbar);//重設可以被停靠
    // TODO: 在此添加命令處理程序代碼
}

設置ON_UPDATE_COMMAND_UI函數

void CMainFrame::OnUpdateMyBar(CCmdUI *pCmdUI)
{
    if(m_newbar.IsWindowVisible())
    {
        GetMenu()->GetSubMenu(2)->CheckMenuItem(ID_32775,MF_CHECKED   );
    }
    else
        GetMenu()->GetSubMenu(2)->CheckMenuItem(ID_32775,MF_UNCHECKED   );
    // TODO: 在此添加命令更新用戶界面處理程序代碼
}

 

在 CMainFrame 的OnCreate函數中 設置

    m_newbar.EnableDocking(CBRS_ALIGN_ANY);//設置可以停靠
    DockControlBar(&m_newbar);//設置可以被停靠

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章