改变窗口的外观和大小
From: http://blog.csdn.net/yoyobaibai/article/details/6044101
?
E.G.
BOOL?CMainFrame::PreCreateWindow(CREATESTRUCT&?cs)
改變窗口的大小?->?cs.cx?=?300;?cs.cy?=?200;
?
改變窗口的顯示位置坐標(biāo)是 cs.x 和 cs.y
?
這里常用的一個(gè)函數(shù)是::GetSysMetrics(SM_CXSCREEN);
::GetSysMetrics(SM_CYSCREEN);
用來(lái)取得屏幕的大小。
?
要改變窗口標(biāo)題欄的字符串:
???cs.lpszName?=?"Seven";?會(huì)發(fā)現(xiàn)標(biāo)題欄不會(huì)改變窗口的標(biāo)題欄的上的字符串。
改變單文檔應(yīng)用程序的標(biāo)題欄的字符串?參考MSDN??window?styles/Frame-window?styles?下面有一個(gè)Changing?the?styles?of?a?window?create?by?MFC./?The?SDI?Case
默認(rèn)的情況是WS_OVERLAPPEDWINDOW?and?FWS_ADDTOTITLE?styles
FWS_ADDTOTITLE?is?add?the?document?title?to?the?window’s?caption.
去掉FWS_ADDTOTITLE?就可以更改窗口標(biāo)題欄字符串。
?cs.style?&=?~FWS_ADDTOTITLE;
cs.lpszName?=?"Seven";
?
?
如果我們需要改變背景,?畫(huà)刷,?光標(biāo)等等時(shí)候。
我們可以在:PreCreateWindow中創(chuàng)建窗口類,?WNDCLASS?wndClass;
把這個(gè)類里的值改變成自己想要的內(nèi)容就可以了。
E.G.
wndClass.cbClsExtra?=?0;
wndClass.cbWndExtra?=?0;
wndClass.hbrBackground?=?(HBRUSH)GetStockObject(DKGRAY_BRUSH);
wndClass.hCursor?=?LoadCursor(NULL,?IDC_WAIT);
wndClass.hIcon?=?LoadIcon(NULL,?IDI_WARNING);
wndClass.hInstance?=?AfxGetInstanceHandle();
獲取應(yīng)用程序的實(shí)例句柄可用AfxGetInstanceHandle函數(shù),?這個(gè)函數(shù)是一個(gè)全局的函數(shù),?前面有一個(gè)AFX表示是一個(gè)應(yīng)用程序框架類函數(shù),哪里都可用。
wndClass.lpfnWndProc?=?::DefWindowProc;
我們只是想要改變窗口的圖標(biāo),?光標(biāo),不想改變條用過(guò)程所以用defWindowProc函數(shù)來(lái)處理。
因?yàn)樵贑Wnd中也有一個(gè)defWindowProc函數(shù),比全局的函數(shù)少一個(gè)參數(shù)?如果不加::的話調(diào)用就要報(bào)錯(cuò)。
wndClass.lpszMenuName?=?NULL;
創(chuàng)建菜單并不是在在設(shè)計(jì)窗口類的時(shí)候創(chuàng)建,?菜單的創(chuàng)建實(shí)在CStyleAPP::InitInstance函數(shù)中將菜單的標(biāo)識(shí)傳進(jìn)去。
wndClass.style?=?CS_HREDRAW?|?CS_VREDRAW;
這里的style并不是窗口的類型而是窗口類的類型。
RegisterClass(&wndClass);
注冊(cè)窗口類。
cs.lpszClass?=?"GL";
后來(lái)把我們剛剛設(shè)計(jì)好的類賦值個(gè)cs.lpszClass。
?
運(yùn)行程序之后我們會(huì)發(fā)現(xiàn)只有圖標(biāo)改變了,?cursor??和brush都沒(méi)有改變。這是因?yàn)?#xff0c;?我們是在frame中改變的,在frame上邊還覆蓋一個(gè)子窗口類。所以我要改變這些需要把在子窗口的View類中PreCreateWindow中把類名復(fù)制。
E.g
在CStyleView中?cs.lpszClass?=?"GL";
就可以把我們剛剛的想要的類型來(lái)改變view中的窗口類型,?因?yàn)椤癎L”窗口類已經(jīng)在CMainFrame框架類中已經(jīng)注冊(cè)了,?所以我們可以直接賦值就可以了。
?
在frame中只可以改變ICON?,為了改變圖標(biāo)我們重寫(xiě)窗口類我很不劃算,?在MFC中為我們提供了一個(gè)函數(shù)AfxRegisterWndClass?直接改變icon詳見(jiàn)MSDN
cs.lpszName?=?AfxRegisterWndClass(CS_HREDRAW?|?CS_VREDRAW,?0,?0,
LoadIcon(NULL,?IDI_WARNING));
這樣就直接改變了frame中Icon。?
我們也可以在CStyleView中調(diào)用這個(gè)函數(shù)?來(lái)改變窗口的?畫(huà)刷,?光標(biāo)。
?
窗口創(chuàng)建之后改變外觀
用SetWinowLong函數(shù)?具體見(jiàn)MSDN
LONG?SetWindowLong( ??HWND?hWnd,??????//?handle?of?window ?
?int?nIndex,?????//?offset?of?value?to?set ??
?LONG?dwNewLong???//?new?value );
在CMainFrame的OnCreate中調(diào)用SetWindowLong
????SetWindowLong(m_hWnd,?GWL_STYLE,?WS_OVERLAPPEDWINDOW);
這樣就可以去掉了文檔標(biāo)題是窗口標(biāo)題了。
我們可以通過(guò)GetWindowLong函數(shù)得到當(dāng)前窗口的類型。?詳見(jiàn)MSDN
???SetWindowLong(m_hWnd,?GWL_STYLE,?GetWindowLong(m_hWnd,?GWL_STYLE)?&?~WS_MAXIMIZEBOX);
這樣就可以灰掉窗口的最大化窗口了。
?
窗口創(chuàng)建之后改變窗口類
上面的是改變窗口的大小和最大化最小化等等的按鈕。
我們可以用SetClassLong來(lái)改變創(chuàng)建之后的窗口類的參數(shù)?例如?光標(biāo),?鼠標(biāo),?畫(huà)刷?等等。
在單文檔的應(yīng)用程序中,?在CMainFrame類中只可以改變Icon?調(diào)用:
在OnCreate函數(shù)中
SetClassLong(m_hWnd,?GCL_HICON,?(LONG)LoadIcon(NULL,?IDI_QUESTION));
可以改變application的icon。
?
在VIEW類中改變brush?cursor?background。
在view類中調(diào)用
SetClassLong(m_hWnd,?GCL_HBRBACKGROUND,?(LONG)GetStockObject(DKGRAY_BRUSH));
改變了VIEW的背景為灰色。
?
實(shí)現(xiàn)一個(gè)每一秒中自動(dòng)換Icon的功能。
Precondition?
在resources?中添加3個(gè)icon的資源。
?
1.?首先在CMainFrame類中添加一個(gè)數(shù)組用于存放資源的句柄。
???在類中添加?HICON?m_hIcon[3];?的一個(gè)數(shù)組。
2.?在CMainFrame?函數(shù)中加載Icon用LoadIcon這個(gè)函數(shù)。
?
???HICON?LoadIcon( ??HINSTANCE?hInstance,//?handle?to?application?instance ?? LPCTSTR?lpIconName???//?icon-name?string?or?icon?resource? ??????????????????????? ??//?identifier );
?
???如果用的系統(tǒng)的Icon話,?LoadIcon這函數(shù)的第一個(gè)參數(shù)必須為NULL。
???如果用的是自己定義的Iicon的話,?第一個(gè)參數(shù)是這個(gè)應(yīng)用程序的一個(gè)實(shí)例句柄。?第二參數(shù)是一個(gè)是icon的icon-name?string?可以通過(guò)MAKEINTRESOURCE這個(gè)宏把資源的ID號(hào)轉(zhuǎn)換為資源的字符串名字。
?
LPTSTR?MAKEINTRESOURCE( ??WORD?wInteger?//?integer?to?convert );
?
???得到應(yīng)用程序?qū)嵗浔覀兛梢酝ㄟ^(guò)幾種方法:
???第一種:?AfxGetInstanceHandle()?函數(shù)獲得當(dāng)前應(yīng)用程序的實(shí)例句柄。
???第二種:?因?yàn)镃StyleApp這個(gè)類是從CWinApp這個(gè)類中繼承過(guò)來(lái)的所以繼承了m_hInstance?這個(gè)變量,?這個(gè)變量就是應(yīng)用程序的實(shí)例句柄。因?yàn)镸FC在全局中建立了一個(gè)CStyleApp中變量?theApp?如果在CMainFrame中得到這個(gè)變量就可以得到應(yīng)用程序的實(shí)例句柄。?在CMainFrame中用到全局變量需要聲明這個(gè)變量?添加extern?CStyleApp?theApp;?這樣就在CMainFrame中用theApp了。
theApp.m_hInstance.
???第三種:?CWinApp*?AfxGetApp(?);?返回的是一個(gè)CWinApp的指針。這樣可以調(diào)用它的實(shí)例句柄。
?
3.?設(shè)置一個(gè)定時(shí)器在OnCreate中
我們這里調(diào)用的是CWND中的定時(shí)器。??
?UINT?SetTimer(?UINT?nIDEvent,?UINT?nElapse,?void?(CALLBACK?EXPORT*?lpfnTimer)(HWND,?UINT,?UINT,?DWORD)?);
第一個(gè)參數(shù)?定時(shí)器的ID?第二個(gè)參數(shù)是設(shè)置的時(shí)間?第三個(gè)參數(shù)是處理函數(shù),?如果設(shè)置為NULL?發(fā)送WM_TIME消息讓消息處理系統(tǒng)調(diào)來(lái)處理。
???CWnd::SetTimer(1,?1000,?NULL);
?
4.?在CMainFrame類中添加一個(gè)WM_TIME的消息處理函數(shù)。
?
???static?int?index?=?1;
SetClassLong(m_hWnd,?GCL_HICON,?(LONG)m_hIcons[index]);
index?=?++index?%?3;
這樣就可以定義出一個(gè)會(huì)隨時(shí)間改變的ICON。
?
工具欄的編程???ToolBar
工具欄在resource中添加一個(gè)工具欄Item它的ID和menu中的菜單中的一個(gè)菜單的Id一樣,?那么這個(gè)工具欄的Item就代表著那個(gè)菜單。
E.g
在resourcesiView中在幫助的下面添加一個(gè)菜單,?叫TEST?它的ID叫ID_TEST?并且建立對(duì)應(yīng)的command消息響應(yīng)函數(shù),彈出對(duì)話框。
在resourcesView的ToolBar中建立一個(gè)Item他的ID?也叫ID_TEST?這樣她們就關(guān)聯(lián)起來(lái)了啊。
Click兩個(gè)都是一樣的。
?
添加一個(gè)自己的工具欄
在MSDN中查看CToolBar?提供了兩種創(chuàng)建工具欄的方法
1.?首先在resourcesView中創(chuàng)建一個(gè)自己的ToolBar,?ToolBar上的Item自己設(shè)定。
2.?在CMainFrame中添加一個(gè)CToolBar的類成員,?構(gòu)造一個(gè)CToolBar的變量。
3.?調(diào)用CToolBar的Create?或者CteateEX??參考MSDN
???可以參考CMainFrame中構(gòu)造ToolBar的方法。
?
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(IDR_MAINFRAME))
{
TRACE0("Failed?to?create?toolbar/n");
return?-1;??????//?fail?to?create
}
4.??調(diào)用LoadToolBar這個(gè)函數(shù)加載資源。
5.?調(diào)用CToolBar的成員函數(shù)EnableDocking(CBRS_ALIGN_ANY);設(shè)置?這個(gè)對(duì)象是可以??康摹?如果不設(shè)置這個(gè)那么工具欄將不可以懸浮。
6.?再調(diào)用CMainFrame::EnableDocking(CBRS_ALIGN_ANY);設(shè)置框架類可以被停靠。?
7.?最后在調(diào)用CMainFrame中的函數(shù)DockControlBar(&m_wndToolBar);??抗ぞ邫?。
8.?我們還可以通過(guò)在菜單欄上設(shè)置一個(gè)Item并且設(shè)置command消息處理函數(shù)。
在處理函數(shù)中寫(xiě)上
if(m_toolBar.IsWindowVisible())
{
????m_toolBar.ShowWindow(SW_HIDE);
}
else
{
m_toolBar.ShowWindow(SW_SHOW);
}
CWnd::IsWindowVisible?當(dāng)有WS_VISIBLE的時(shí)候?返回TRUE.用IsWindowVisible來(lái)返回ToolBar是不是可見(jiàn)的。
?
當(dāng)我調(diào)用這個(gè)處理的時(shí)候?點(diǎn)擊菜單里的Item來(lái)顯示或者隱藏工具欄。但是發(fā)現(xiàn)雖然ToolBar消失了,?但是這個(gè)工具條還在。這個(gè)時(shí)候工具欄的停靠位子有所變化,?這個(gè)時(shí)候需要調(diào)用
CFrameWnd::RecalcLayout?函數(shù)。?
void?RecalcLayout(?BOOL?bNotify?=?TRUE?);
在上面的程序后面接上
RecalcLayout();
當(dāng)把工具欄拖出來(lái),?處于浮空的ToolBar的時(shí)候發(fā)現(xiàn),?然后點(diǎn)擊菜單來(lái)顯示或者隱藏ToolBar發(fā)現(xiàn)?當(dāng)浮空的時(shí)候ToolBar的工具條不會(huì)隱藏。?這個(gè)時(shí)候我們還需要調(diào)用一個(gè)函數(shù)
DockControlBar(&m_toolBar);
?
顯示或隱藏工具欄的第二種方法
這個(gè)時(shí)候調(diào)用一個(gè)函數(shù)
ShowControlBar(&m_toolBar,?!m_toolBar.IsWindowVisible(),?FALSE);??具體調(diào)用參見(jiàn)MSDN。?ShowControlBar是CFrameWnd框架類的一個(gè)函數(shù)。
?
9.?我們還需要標(biāo)記菜單的Item。當(dāng)選中是標(biāo)記,?當(dāng)隱藏時(shí)取消標(biāo)記。這個(gè)時(shí)候我們需要對(duì)這個(gè)Item的?UPDATE_COMMAND_UI進(jìn)行響應(yīng)。建立消息響應(yīng)來(lái)標(biāo)記活隱藏標(biāo)記。?
調(diào)用CCmdUI的SetCheck();這個(gè)函數(shù)。來(lái)標(biāo)記或者取消標(biāo)記。
pCmdUI->SetCheck(m_toolBar.IsWindowVisible());?具體用法參見(jiàn)MSDN。
?
狀態(tài)欄的編寫(xiě)
1.??首先construct?一個(gè)CStatusBar的對(duì)象。
2.??然后調(diào)用變量的Create函數(shù)把狀態(tài)欄窗口和一個(gè)CStatusBar的對(duì)象綁定。
?
CStatusBar::Create
BOOL?Create(?CWnd*?pParentWnd,?DWORD?dwStyle?=?WS_CHILD?|?WS_VISIBLE?|?CBRS_BOTTOM,?UINT?nID?=?AFX_IDW_STATUS_BAR?);
在MFC中是這樣調(diào)用的:
if?(!m_wndStatusBar.Create(this)?||?!m_wndStatusBar.SetIndicators(indicators,
?sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed?to?create?status?bar/n");
return?-1;??????//?fail?to?create
}
m_wndStausBar.Create(this),?其他的參數(shù)都用默認(rèn)的參數(shù)。?后來(lái)?xiàng)l用m_wndStatusBar.Setindicators(indicators,?sizeof(indicators)/sizeof(UINT));
Indicators?是一個(gè)數(shù)組儲(chǔ)存字符串ID和每一個(gè)指示符。?后面一個(gè)參數(shù)是數(shù)組里面的數(shù)是多少個(gè)。
可以添加indicator?在數(shù)組中,?首先在String?Table?中添加字符串ID?,?然后把字符串ID添加在indicators的數(shù)組里面。這樣就可以在狀態(tài)欄中顯示了。?
有三種方法更新?tīng)顟B(tài)欄上的字符。
1.?Call?CWnd::SetWindowText?to?update?the?text?in?pane?0?only.
2.?Call?CCmdUI::SetText?in?the?status?bar’s?ON_UPDATE_COMMAND_UI?handler.
3.?Call?SetPaneText?to?update?the?text?for?any?pane.
?
我們可以把系統(tǒng)當(dāng)前時(shí)間顯示在狀態(tài)欄上。
這個(gè)時(shí)候需要用到?CTime
?CTime?t?=?CTime::GetCurrentTime();
CString?timeStr?=?t.Format("%H:%M:%S");
格式輸出到一個(gè)字符串中。?
然后調(diào)用?m_wndStatusBar.SetPaneText(1,?timeStr);
第一個(gè)參數(shù)是索引Index?of?the?pane?whose?text?is?to?be?set。
timeStr是要顯示的字符串了。
如果不知道要顯示的索引,?我們可用調(diào)用m_wndStatusBar的一個(gè)成員函數(shù)CommandToIndex(IDS_TIMER);?括號(hào)里面的參數(shù)是表示要顯示的字符串ID。
?
運(yùn)行程序,?我們會(huì)發(fā)現(xiàn)時(shí)鐘的秒不能顯示。?這個(gè)是因?yàn)闋顟B(tài)欄空間不夠所以不能完全顯示內(nèi)容。?
我們可以調(diào)用SetPaneInfo();
CStatusBar::SetPaneInfo
void?SetPaneInfo(?int?nIndex,?UINT?nID,?UINT?nStyle,?int?cxWidth?);
?
?函數(shù)改變狀態(tài)欄空間大小。
?
為了獲得字符串的顯示寬度,?我們需要調(diào)用GetTextExtent(Cstring?str);來(lái)返回字符創(chuàng)的空間大小,?CSize。
CClientDC?dc(this);
CSize?sz?=?dc.GetTextExtent(timeStr);
之后再調(diào)用SetPaneText();來(lái)顯示內(nèi)容
?
這個(gè)時(shí)候發(fā)現(xiàn)時(shí)間是不動(dòng)的。?需要?jiǎng)?#xff0c;?要把剛剛這段代碼放到SetTimer的響應(yīng)函數(shù)中不停調(diào)用顯示時(shí)間。?
?
創(chuàng)建一個(gè)進(jìn)度欄
進(jìn)度欄的類是CProgressCtrl。?定義一個(gè)變量,?并且調(diào)用Create初始化一個(gè)進(jìn)度欄。
?
CProgressCtrl::Create
BOOL?Create(?DWORD?dwStyle,?const?RECT&?rect,?CWnd*?pParentWnd,?UINT?nID?);
第一個(gè)參數(shù)是一個(gè)窗口類,?E.G??WS_CHILD?|?WS_VISIBLE?|?PBS_SMOOTH?
第二個(gè)參數(shù)是一個(gè)矩形區(qū)域。
?
CProgressCtrl?m_progressCtrl;
m_progressCtrl.SetPos(50); 設(shè)置到中間。?
?
如果我們想把這個(gè)矩形區(qū)域顯示在狀態(tài)欄里。?
?
首相我們?cè)贑MainFrame類中編寫(xiě)這樣一段程序
CRect?rect;
m_wndStatusBar.GetItemRect(2,?&rect);
m_progressCtrl.Create(WS_CHILD|?WS_VISIBLE|?PBS_SMOOTH,?rect,
&m_wndStatusBar,?1);
注意這里的&m_wndStatusBar是進(jìn)度條的父窗口。?在View類中創(chuàng)建進(jìn)度條時(shí),?父類窗口就是this,?代表這個(gè)對(duì)象的指針。
?
運(yùn)行程序發(fā)現(xiàn)進(jìn)度條并沒(méi)有出現(xiàn),?我們?cè)贑Rect?rect?;?這里設(shè)置斷點(diǎn),?運(yùn)行函數(shù),?看斷點(diǎn)的值發(fā)現(xiàn)rect的值是一個(gè)無(wú)效的值,?這個(gè)時(shí)候我們猜想,?在OnCreat?結(jié)束錢(qián)狀態(tài)欄還沒(méi)有初始化好。?這樣我們可以在OnCreate之后調(diào)用一個(gè)函數(shù)來(lái)處理進(jìn)度條。
我們可以自己定義一個(gè)消息,在OnCreate中把這個(gè)消息投遞到消息隊(duì)列中,來(lái)處理這個(gè)函數(shù)。
首先我先定義一個(gè)消息,?在window中消息都是用一個(gè)整數(shù)來(lái)表示的,在CMainFrame的頭文件中添加一個(gè)消息。?#define?UM_PROGRESS?WM_USER+1
因?yàn)閣indow的很多消息已經(jīng)占用了很多的整數(shù),?我們胡亂定義很可可能和系統(tǒng)沖突,?WM_USER以下的是系統(tǒng)消息保留的。?以上的可以是用戶自己定義的。這樣我們就定義了一個(gè)UM_PROGRESS?的消息。添加完這個(gè)消息后,?要有相應(yīng)的消息響應(yīng)函數(shù)來(lái)處理這個(gè)消息。
protected:
//{{AFX_MSG(CMainFrame)
afx_msg?int?OnCreate(LPCREATESTRUCT?lpCreateStruct);
afx_msg?void?OnTimer(UINT?nIDEvent);
afx_msg?void?OnTest();
afx_msg?void?OnAppendToolbar();
afx_msg?void?OnUpdateAppendToolbar(CCmdUI*?pCmdUI);
afx_msg?void?OnPaint();
//}}AFX_MSG
先要在頭文件的這段代碼后面添加
??afx_msg?void?OnProgress();
DECLARE_MESSAGE_MAP()
?
參考MFC的程序;
然后在。CPP文件中
BEGIN_MESSAGE_MAP(CMainFrame,?CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_COMMAND(ID_TEST,?OnTest)
ON_COMMAND(ID_APPEND_TOOLBAR,?OnAppendToolbar)
ON_UPDATE_COMMAND_UI(ID_APPEND_TOOLBAR,?OnUpdateAppendToolbar)
ON_WM_PAINT()
//}}AFX_MSG_MAP
ON_MESSAGE(UM_PROGRESS,?OnProgress)
END_MESSAGE_MAP()
消息響應(yīng)函數(shù)是通過(guò)?ON_MESSAGE()?把消息和消息處理函數(shù)關(guān)聯(lián)起來(lái)的。
?
最后在添加消息處理函數(shù)
Void?CMainFrame::OnProgress()
?
CRect?rect;
m_wndStatusBar.GetItemRect(2,?&rect);
m_progressCtrl.Create(WS_CHILD|?WS_VISIBLE|?PBS_SMOOTH,?rect,
&m_wndStatusBar,?1);
?
在這個(gè)函數(shù)中處理進(jìn)度條。在OnCreate函數(shù)中用PostMessage();
不能用SendMessage();?因?yàn)?SendMessage是直接調(diào)用了處理函數(shù),?這個(gè)時(shí)候狀態(tài)欄還沒(méi)有處理好。?
?
現(xiàn)在運(yùn)行應(yīng)用程序,?這個(gè)時(shí)候progress顯示在狀態(tài)欄上,?但是當(dāng)我們拉伸或者縮放的時(shí)候進(jìn)度欄?不再第二個(gè)狀態(tài)欄上的時(shí)候而是在別的地方?這是為什么呢??
每當(dāng)窗口的尺寸變化的時(shí)候就會(huì)重繪發(fā)送ON_PAIN這個(gè)消息我們可以創(chuàng)建響應(yīng)函數(shù),?在這個(gè)函數(shù)中編寫(xiě)上面的程序。
當(dāng)改變尺寸的時(shí)候會(huì)當(dāng)初dialog錯(cuò)誤,?這是因?yàn)槊慨?dāng)發(fā)送一個(gè)ON_PAIN消息函數(shù)的時(shí)候都會(huì)Create一個(gè)進(jìn)度欄,?所照成了錯(cuò)誤。應(yīng)該判斷是否已經(jīng)創(chuàng)建沒(méi)有創(chuàng)建的時(shí)候創(chuàng)建,?創(chuàng)建了移動(dòng)窗口。
修改程序?yàn)橐幌?#xff1a;
CRect?rect;
m_wndStatusBar.GetItemRect(2,?&rect);
if(m_progressCtrl.m_hWnd?==?NULL)
m_progressCtrl.Create(WS_CHILD|?WS_VISIBLE|?PBS_SMOOTH,?rect,
&m_wndStatusBar,?1);
else
m_progressCtrl.MoveWindow(rect);
?
如果要進(jìn)度欄里的進(jìn)度增加的話,?我們可以調(diào)用CProgressCtrl類的一個(gè)StepIt函數(shù)來(lái)增長(zhǎng),?把發(fā)在OnTimer();?里面每次調(diào)用就會(huì)發(fā)送一個(gè)OnPaint函數(shù)來(lái)重繪進(jìn)度欄。?
?
現(xiàn)在我們想在在狀態(tài)欄上顯示當(dāng)前鼠標(biāo)的位置,?在View類中添加ON_MOUSEMOVE處理函數(shù)。
CString?pointStr;
pointStr.Format("x=%d?y=%d",?point.x,?point.y);
((CMainFrame*)GetParent())->m_wndStatusBar.SetPaneText(0,?pointStr);
運(yùn)行程序顯示出位置。因?yàn)闋顟B(tài)欄是框架類的,?所以首先要先獲得框架類的指針,?通過(guò)GetParent()?這個(gè)函數(shù)來(lái)獲得,?轉(zhuǎn)換為CMainFrame指針類型。
需要在View中加入頭文件“MainFrm.h”
或者調(diào)用?((CMainFrame*)GetParent())->SetMessageText(pointStr);
?
也可以這樣
((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(pointStr);
GetMessageBar()是一個(gè)CMainFrame類的函數(shù),?無(wú)需知道狀態(tài)欄的變量。
?
創(chuàng)建啟動(dòng)畫(huà)面
在菜單上點(diǎn)擊工程->添加到工程->組件和空間-?>Visual?C++?components->solash?Screen?->insert.
總結(jié)
以上是生活随笔為你收集整理的改变窗口的外观和大小的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 智慧社区智能化管理系统搭建
- 下一篇: [vim]在vim中格式化xml