第9章 定制應用程序外觀
參考: https://blog.csdn.net/u014162133/article/details/46573873
1、修改外觀和圖標可以在MainFrm中進行,而修改背景和光標只能在View中進行。為什麽?因為view的顯示擋在了MainFrame的前面。
a.在MainFrame中
PreCreateWindow()中,在窗口創建之前,用重新註冊窗口類的方法,比較麻煩。在PreCreateWindow()中修改也可以用簡單的方法,用全局函數
//cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,
// LoadIcon(NULL,IDI_WARNING));在窗口創建之後,在OnCreate()中修改
//SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);
//SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);
// SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));
b.在View中
PreCreateWindow()中
//cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
// LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),NULL);
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
OnCreate()中
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));
2、創建一個不斷變化的圖標。用定時器和SetClassLong完成
a.準備三個圖標文件,放在RES文件夾,Insert->Resource-三個圖標,
b.
m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));//MAKEINTRESOURCE是一個宏,它將整數轉化為Win32的資源類型,簡單的說它是一個類型轉換
#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
m_hIcons[1]=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));//此處需要用到theAPP對象,故要在文件中聲明extern CStyleApp theApp;
m_hIcons[2]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));
然後將其初始化
c.然後在定時器中實現
3、工具欄的編程
a.加入分隔符的方法,向右拖動即可;
b.刪除按紐的方法,拖出即可。
4.創建一個新的工具欄的方法
a.插入一個工具欄,畫出其圖形。
b.在頭文件中,定義CToolBar m_newToolBar
c.在MainFrm.cpp的OnCreate()中調用
if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_newToolBar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
d.點擊“新的工具欄”菜單時,隱藏工具欄。兩種方法
第一種
if(m_newToolBar.IsWindowVisible())
{
m_newToolBar.ShowWindow(SW_HIDE);
}
else
{
m_newToolBar.ShowWindow(SW_SHOW);
}
RecalcLayout();
DockControlBar(&m_newToolBar);*/
第二種ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);
e.將菜單增加復選標記。在OnUpdateUI中加入代碼
pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());
5、狀態欄編程
a.Indicator[]數組中有狀態欄的信息
如果要增加,可以在String Table中加入一個IDS_Timer,然後將其加入到Indicator []中。
b.在時間欄顯示時間,代碼略,比較簡單
6、進度欄
a.增加成員變量,CProgressCtrl m_progress
b.OnCreate中 m_progress.Create(WS_CHILD | WS_VISIBLE,// | PBS_VERTICAL, rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
c.將其創建到狀態欄的方法!如果在OnCreate()中創建,則不成立,因為獲取矩形大小時失敗。
解決辦法,用自定義消息:
在MainFrm.h中#define UM_PROGRESS WM_USER+1//WM_USER是一個界限
消息函數原型聲明:afx_msg void OnProgress()
在MainFrm.cpp中
ON_MESSAGE(UM_PROGRESS,OnProgress)
然後實現這個函數
void CMainFrame::OnProgress()
{
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect);
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
}
最後在OnCreate中調用 PostMessage(UM_PROGRESS);//不能用SendMessage()
d.解決重繪時進度欄改變的問題。在OnPain()中重寫代碼
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect);
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
然後在定時器消息處理函數中加入
m_progress.StepIt();
e.顯示鼠標位置。在View中增加OnMouseMove()處理函數
CString str;
str.Format("x=%d,y=%d",point.x,point.y);
//((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
//((CMainFrame*)GetParent())->SetMessageText(str);
//((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);
GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);
7、加入啟動畫面
Project-Component and ->Visual C++ Components->SplashScreen->插入
第9章 定制應用程序外觀