1. 在窗口創(chuàng)建之前修改窗口外觀: 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. 修改窗口的標題:通過修改CREATESTRUCT結(jié)構(gòu)體中的 對于窗口的類型和大小,,是在創(chuàng)建窗口的時候設定的,而窗口的圖標,,光標,,背景是在設計窗口設計類的時候的設定的,是由MFC底層代碼設計,,但可以自己創(chuàng)建窗口類,,然后讓系統(tǒng)按照自己定義的窗口類執(zhí)行。將以下代碼放在CMainFrame類的PreCreateWindow函數(shù)中添加: WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); //設置窗口背景為黑色 wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_WARNING); wndcls.hInstance=AfxGetInstanceHandle(); //因為MFC本身也有DefWindowProc函數(shù),,但參數(shù)不一致,,所以還是調(diào)用win32的函數(shù) wndcls.lpfnWndProc=::DefWindowProc; //不想修改系統(tǒng)操作,所以調(diào)用系統(tǒng)默認的回調(diào)函數(shù) wndcls.lpszClassName="style test"; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); cs.lpszClass="style test"; //按照自己的設計創(chuàng)建 運行以上代碼后發(fā)現(xiàn)窗口圖標改變了,但光標和背景沒有改變,,這是因為上述代碼修改是框架類,,光標和背景屬于View類,所以還要在View類中PreCreateWindow修改,。在實現(xiàn)上述代碼后,,在CView的PreCreateWindow函數(shù)中添加如下代碼就可以實現(xiàn)修改光標和背景顏色的目的: cs.lpszClass="style test"; //修改光標和背景 也可以通過以下方式實現(xiàn): cs.lpszClass=AfxRegisterWndClass(NULL,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0); 注:所以在CMainFrame類中只能修改的是Icon 隨意如果采用這種代碼實現(xiàn),編寫的代碼較多,,會比較麻煩,,有一種替代的方法: 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); //文檔的標題也去掉了 下面一種實現(xiàn)是從現(xiàn)有的窗口風格中去除某一種屬性: LONG currentStyle=GetWindowLong(m_hWnd,GWL_STYLE); //得到現(xiàn)有窗口的風格 SetWindowLong(m_hWnd,GWL_STYLE,currentStyle & ~WS_MAXIMIZEBOX ); 去除了最大化框 //在創(chuàng)建窗口后修改圖標 SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_WARNING)); //在創(chuàng)建窗口后修改光標和背景(注:以下代碼在CView的OnCreate函數(shù)中實現(xiàn):) SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH)); //設置背景顏色 SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_CROSS)); //設置光標 3. 加載外部導入的圖標: LoadIcon如果加載的是系統(tǒng)圖標,則第一個參數(shù)是null,,但如果是自己的圖標,,則必須取得實例句柄。MAKEINTRESOURCE宏將資源號轉(zhuǎn)換為字符指針類型 HICON m_hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1)); //theApp在別的cpp文件中定義,,則必須在本cpp中進行extern CStyleApp theApp聲明 HICON m_hIcon=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2)); HICON m_hIcon=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3)); 4. 工具欄: 給欄上的圖標間加上分隔符:按住鼠標左鍵拖動分隔符后的圖標一小段距離即可,。 刪除欄上的圖標:將指定圖標拖出工具欄即可。 創(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ū)ё詣觿?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可???,因為此段代碼已經(jīng)有了,所以省去 DockControlBar(&m_newToolBar); //是新的toolbar??吭?/span>MainFrame上 Otherwise, follow these steps:
顯示和隱藏工具欄: //第一種方法: if(m_newToolBar.IsWindowVisible()) //工具欄也是一個窗口 { m_newToolBar.ShowWindow(SW_HIDE); } else { m_newToolBar.ShowWindow(SW_SHOW); } RecalcLayout(TRUE); //整個工具欄所在的控制欄顯示或消失 DockControlBar(&m_newToolBar); //將新的toolbar??吭?/span>MainFrame上 //第二種方法,,這種方法是最好的,一行代碼實現(xiàn)了上面的功能 ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE); 5. 狀態(tài)欄: 向?qū)?chuàng)建狀態(tài)欄是在CMainFrame類的OnCreate函數(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 } 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)欄中顯示的許多小面板 以下代碼實現(xiàn)在狀態(tài)欄上顯示當前時間(該函數(shù)也是在OnCreate函數(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ù)是設置面板的style,size等 m_wndStatusBar.SetPaneInfo(idx,IDS_TIMER,SBPS_NORMAL,size.cx); //使寬度合適 //SetPaneText函數(shù)是在指定的面板上顯示內(nèi)容 m_wndStatusBar.SetPaneText(idx,strTime); 6. 進度欄: 創(chuàng)建類的成員函數(shù):CProgressCtrl m_progress; 創(chuàng)建水平進度條 m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,CRect(100,100,200,120),this,IDS_PROGRESS); 垂直進度條 m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,CRect(100,100,120,220),this,IDS_PROGRESS); m_progress.SetRange(0,100); //設置范圍 m_progress.SetStep(10); //設置步進長度 將創(chuàng)建的進度欄放在狀態(tài)欄的指定編號的面板上(以下代碼放在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)建,,則只需要將進度條移動到指定矩形框內(nèi) m_progress.SetRange(0,100); m_progress.SetStep(10); 注:上述代碼沒有放在CMainFrame類的OnCreate函數(shù)中是因為OnCreate函數(shù)創(chuàng)建好的時候窗口上的控件還沒有創(chuàng)建好,,所以想得到狀態(tài)欄上指定面板的矩形大小時候,會取不到值(可以想象成狀態(tài)欄也是窗口上的一個控件),。 將鼠標在視圖上移動時對應的x,,y坐標時時顯示在狀態(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. 為程序添加啟動畫面: Project->Add To Project->Components and Controls->Visual C++ component->Splash screen 修改啟動畫面的等待時間,其中在函數(shù)OnCreate函數(shù)有設置:SetTimer(1, 1000, NULL); 利用上述的向?qū)ё詣犹砑恿艘粋€新類,,CSplashWnd,,并且自動在CMainFrame類中的OnCreate函數(shù)中添加了CSplashWnd::ShowSplashScreen(this),也就是將啟動畫面添加到了運行程序框架類中了,。 |
|
來自: Alex@ZW > 《孫鑫VC學習筆記》