1. 程式人生 > >第9章 定制應用程序外觀

第9章 定制應用程序外觀

大小 oid [1] window amp kobject black 圖形 \n

參考: 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.

在CMainFrame中增加圖標句柄數組,m_hIcons[3]

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章 定制應用程序外觀