The framework calls PreCreateWindow just prior to creating the window. By modifying the CREATESTRUCT parameter to PreCreateWindow, your application can change the attributes used to create the window.
修改窗口的標(biāo)題:通過修改CREATESTRUCT結(jié)構(gòu)體中的lpszName
,但是注意,
FWS_ADDTOTITLE is an MFC-specific style that instructs the framework to add the document title to the window’s caption,所以必須將FWS_ADDTOTITLE從現(xiàn)有的style中去除FWS_ADDTOTITLE,即使cs.style & ~FWS_ADDTOTITLE
對(duì)于窗口的類型和大小,是在創(chuàng)建窗口的時(shí)候設(shè)定的,而窗口的圖標(biāo),光標(biāo),背景是在設(shè)計(jì)窗口設(shè)計(jì)類的時(shí)候的設(shè)定的,是由MFC底層代碼設(shè)計(jì),但可以自己創(chuàng)建窗口類,然后讓系統(tǒng)按照自己定義的窗口類執(zhí)行。將以下代碼放在CMainFrame類的PreCreateWindow函數(shù)中添加:
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); //設(shè)置窗口背景為黑色
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_WARNING);
wndcls.hInstance=AfxGetInstanceHandle();
//因?yàn)?/span>MFC本身也有DefWindowProc函數(shù),但參數(shù)不一致,所以還是調(diào)用win32的函數(shù)
wndcls.lpfnWndProc=::DefWindowProc; //不想修改系統(tǒng)操作,所以調(diào)用系統(tǒng)默認(rèn)的回調(diào)函數(shù)
wndcls.lpszClassName="style test";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);
cs.lpszClass="style test"; //按照自己的設(shè)計(jì)創(chuàng)建
運(yùn)行以上代碼后發(fā)現(xiàn)窗口圖標(biāo)改變了,但光標(biāo)和背景沒有改變,這是因?yàn)樯鲜龃a修改是框架類,光標(biāo)和背景屬于View類,所以還要在View類中PreCreateWindow修改。在實(shí)現(xiàn)上述代碼后,在CView的PreCreateWindow函數(shù)中添加如下代碼就可以實(shí)現(xiàn)修改光標(biāo)和背景顏色的目的:
cs.lpszClass="style test"; //修改光標(biāo)和背景
也可以通過以下方式實(shí)現(xiàn):
cs.lpszClass=AfxRegisterWndClass(NULL,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);
注:所以在CMainFrame類中只能修改的是Icon
隨意如果采用這種代碼實(shí)現(xiàn),編寫的代碼較多,會(huì)比較麻煩,有一種替代的方法:
cs.lpszClass=AfxRegisterWndClass(NULL,0,0,LoadIcon(NULL,IDI_WARNING));
2. 在窗口創(chuàng)建之后修改窗口的外觀:
窗口創(chuàng)建之后修改窗口外觀一般在CMainFrame類的OnCreate函數(shù)中:
SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW); //文檔的標(biāo)題也去掉了
下面一種實(shí)現(xiàn)是從現(xiàn)有的窗口風(fēng)格中去除某一種屬性:
LONG currentStyle=GetWindowLong(m_hWnd,GWL_STYLE); //得到現(xiàn)有窗口的風(fēng)格
SetWindowLong(m_hWnd,GWL_STYLE,currentStyle & ~WS_MAXIMIZEBOX ); 去除了最大化框
//在創(chuàng)建窗口后修改圖標(biāo)
SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_WARNING));
//在創(chuàng)建窗口后修改光標(biāo)和背景(注:以下代碼在CView的OnCreate函數(shù)中實(shí)現(xiàn):)
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH)); //設(shè)置背景顏色
SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_CROSS)); //設(shè)置光標(biāo)
3. 加載外部導(dǎo)入的圖標(biāo):
LoadIcon如果加載的是系統(tǒng)圖標(biāo),則第一個(gè)參數(shù)是null,但如果是自己的圖標(biāo),則必須取得實(shí)例句柄。MAKEINTRESOURCE宏將資源號(hào)轉(zhuǎn)換為字符指針類型
HICON m_hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
//theApp在別的cpp文件中定義,則必須在本cpp中進(jìn)行extern CStyleApp theApp聲明
HICON m_hIcon=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));
HICON m_hIcon=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));
4. 工具欄:
給欄上的圖標(biāo)間加上分隔符:按住鼠標(biāo)左鍵拖動(dòng)分隔符后的圖標(biāo)一小段距離即可。
刪除欄上的圖標(biāo):將指定圖標(biāo)拖出工具欄即可。
創(chuàng)建工具欄:在MSDN說明中提供兩種方法
Visual C++ provides you with two methods to create a toolbar. To create a toolbar resource using the Resource Editor, follow these steps:
//創(chuàng)建自己的工具欄,具體的創(chuàng)建過程參看MSDN中的CToolBar部分,以下代碼模仿向?qū)ё詣?dòng)創(chuàng)建的toolbar(代碼也是在CMainFrame類的OnCreate函數(shù)中)
首先創(chuàng)建ToolBar的資源m_newToolBar
//以下代碼放在CMainFrame類的OnCreate函數(shù)中:
if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_LEFT| 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
}
m_newToolBar.EnableDocking(CBRS_ALIGN_ANY); //使新的toolbar可???/span>
EnableDocking(CBRS_ALIGN_ANY); //使MainFrame可???,因?yàn)榇硕未a已經(jīng)有了,所以省去
DockControlBar(&m_newToolBar); //是新的toolbar停靠在MainFrame上
Otherwise, follow these steps:
顯示和隱藏工具欄:
//第一種方法:
if(m_newToolBar.IsWindowVisible()) //工具欄也是一個(gè)窗口
{
m_newToolBar.ShowWindow(SW_HIDE);
}
else
{
m_newToolBar.ShowWindow(SW_SHOW);
}
RecalcLayout(TRUE); //整個(gè)工具欄所在的控制欄顯示或消失
DockControlBar(&m_newToolBar); //將新的toolbar??吭?/span>MainFrame上
//第二種方法,這種方法是最好的,一行代碼實(shí)現(xiàn)了上面的功能
ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);
5. 狀態(tài)欄:
向?qū)?chuàng)建狀態(tài)欄是在CMainFrame類的OnCreate函數(shù)中實(shí)現(xiàn)的,代碼如下:
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, //indicators
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
其中indicators是一個(gè)指示器數(shù)組,它在CMainFrame的源文件中定義:
static UINT indicators[] =
{
//以下這些資源在string table中定義
ID_SEPARATOR, // status line indicator
IDS_TIMER, //自定義
IDS_PROGRESS, //自定義
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
該指示器表示了在狀態(tài)欄中顯示的許多小面板
以下代碼實(shí)現(xiàn)在狀態(tài)欄上顯示當(dāng)前時(shí)間(該函數(shù)也是在OnCreate函數(shù)中實(shí)現(xiàn)):
CTime currentTime=CTime::GetCurrentTime();
CString strTime=currentTime.Format("%Y-%m-%d %H:%M:%S");
CClientDC dc(this);
CSize size=dc.GetTextExtent(strTime);
int idx=m_wndStatusBar.CommandToIndex(IDS_TIMER); //在不知道索引的前提下
//SetPaneInfo函數(shù)是設(shè)置面板的style,size等
m_wndStatusBar.SetPaneInfo(idx,IDS_TIMER,SBPS_NORMAL,size.cx); //使寬度合適
//SetPaneText函數(shù)是在指定的面板上顯示內(nèi)容
m_wndStatusBar.SetPaneText(idx,strTime);
6. 進(jìn)度欄:
創(chuàng)建類的成員函數(shù):CProgressCtrl m_progress;
創(chuàng)建水平進(jìn)度條
m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,CRect(100,100,200,120),this,IDS_PROGRESS);
垂直進(jìn)度條
m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,CRect(100,100,120,220),this,IDS_PROGRESS);
m_progress.SetRange(0,100); //設(shè)置范圍
m_progress.SetStep(10); //設(shè)置步進(jìn)長(zhǎng)度
將創(chuàng)建的進(jìn)度欄放在狀態(tài)欄的指定編號(hào)的面板上(以下代碼放在OnPaint函數(shù)中):
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect); //得到狀態(tài)欄上指定面板的矩形大小
if(!m_progress.m_hWnd)
m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,IDS_PROGRESS);
else
m_progress.MoveWindow(rect); //如果已經(jīng)創(chuàng)建,則只需要將進(jìn)度條移動(dòng)到指定矩形框內(nèi)
m_progress.SetRange(0,100);
m_progress.SetStep(10);
注:上述代碼沒有放在CMainFrame類的OnCreate函數(shù)中是因?yàn)?/span>OnCreate函數(shù)創(chuàng)建好的時(shí)候窗口上的控件還沒有創(chuàng)建好,所以想得到狀態(tài)欄上指定面板的矩形大小時(shí)候,會(huì)取不到值(可以想象成狀態(tài)欄也是窗口上的一個(gè)控件)。
將鼠標(biāo)在視圖上移動(dòng)時(shí)對(duì)應(yīng)的x,y坐標(biāo)時(shí)時(shí)顯示在狀態(tài)欄上
在CView類的OnMouseMove函數(shù)中添加:
CString location;
location.Format("x=%d,y=%d",point.x,point.y);
方法1:
((CMainFrame*)GetParent())->m_wndStatusBar.SetPaneText(0,location,TRUE);
方法2:
SetMessageText在MSDN中的解釋是這樣的:Call this function to place a string in the status-bar pane that has an ID of 0. This is typically the leftmost, and longest, pane of the status bar.
((CMainFrame*)GetParent())->SetMessageText(location);
方法3:
GetMessageBar在MSDN中解釋:Call this member function to get a pointer to the status bar.
((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(location);
7. 為程序添加啟動(dòng)畫面:
Project->Add To Project->Components and Controls->Visual C++ component->Splash screen
修改啟動(dòng)畫面的等待時(shí)間,其中在函數(shù)OnCreate函數(shù)有設(shè)置:SetTimer(1, 1000, NULL);
利用上述的向?qū)ё詣?dòng)添加了一個(gè)新類,CSplashWnd,并且自動(dòng)在CMainFrame類中的OnCreate函數(shù)中添加了CSplashWnd::ShowSplashScreen(this),也就是將啟動(dòng)畫面添加到了運(yùn)行程序框架類中了。
聯(lián)系客服