轉自: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);//設置可以被停靠