Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

建立視窗框架

953 views

Published on

  • Be the first to comment

  • Be the first to like this

建立視窗框架

  1. 1. 建立視窗框架 <ul><li>葉建榮 </li></ul><ul><li>巨匠電腦台北東區認證中心 </li></ul>
  2. 2. 視窗框架物件 <ul><li>視窗框架物件就是您在電腦螢幕上看到的視窗。在剛剛的程式範例裡,將直接利用 CFrameWnd 類別建立一個供應用程式物件建立的視窗框架物件。 </li></ul>
  3. 3. <ul><li>由 CFrameWnd 類別所建立的視窗框架物件,提供了基本視窗所具備的功能,如 系統選單 及右上角的三個 視窗控制按鈕。 </li></ul>視窗框架物件 系統選單 視窗控制按鈕
  4. 4. <ul><li>產生視窗框架物件與建立、顯示視窗,並不是同一件事,因為在視窗程式裡,產生一個視窗框架物件,是指在程式裡建立了一個視窗框架物件,當在程式裡,需要操作視窗框架時,我們可以直接操作該物件。 </li></ul><ul><li>建立一個視窗框架物件,則是指利用 CFrameWnd::Create 函數,向作業系統註冊了這個視窗框架。經過了視窗框架的產生、建立的過程後,才能利用 CFrameWnd::ShowWindow 函數,將視窗顯示在螢幕上。 </li></ul>視窗框架物件
  5. 5. <ul><li>BOOL InitInstance() // 程式進入點 </li></ul><ul><li>{ </li></ul><ul><li>CFrameWnd *Frame = new CFrameWnd(); </li></ul><ul><li>// 建立 CFrameWnd 物件 </li></ul><ul><li> m_pMainWnd = Frame; // 將 m_pMainWnd 設定為 Frame </li></ul><ul><li>Frame->Create(NULL,&quot;Hello MFC&quot;); // 建立視窗 </li></ul><ul><li> Frame->ShowWindow(SW_SHOW); // 顯示視窗 </li></ul><ul><li> return true; </li></ul><ul><li>} </li></ul>視窗框架物件 產生、建立 、 顯示 視窗框架物件
  6. 6. <ul><li>BOOL virtual CFrameWnd::Create( </li></ul><ul><li>LPCTSTR lpszClassName, </li></ul><ul><ul><li>LPCTSTR lpszWindowName, </li></ul></ul><ul><ul><li>DWORD dwStyle = </li></ul></ul><ul><ul><li>WS_OVERLAPPEDWINDOW, </li></ul></ul><ul><ul><li>const RECT& rect = rectDefault, </li></ul></ul><ul><ul><li>CWnd* pParentWnd = NULL, </li></ul></ul><ul><ul><li>LPCTSTR lpszMenuName = NULL, </li></ul></ul><ul><ul><li>DWORD dwExStyle = 0, </li></ul></ul><ul><ul><li>CCreateContext* pContext = NULL ); </li></ul></ul>建立視窗框架的函數
  7. 7. <ul><li>八個參數中的後六個參數都有預設值,只有前兩個參數必須指定。 </li></ul><ul><li>第一個參數 lpszClassName 指定 WNDCLASS 視窗類別,放置 NULL 是要以 MFC 內建的視窗類別產生一個標準的外框視窗。 </li></ul><ul><li>第二個參數 lpszWindowName 指定視窗標題,本例指定 &quot;Hello MFC&quot; 。 </li></ul>建立視窗框架的函數
  8. 8. <ul><li>第三個參數 dwStyle 指定視窗風格 (Windows Stylus) ,預設是 WS_OVERLAPPEDWINDOW ,是最常用的一種,它被定義為 ( 在 WINDOWS.H 之中 ) : </li></ul><ul><ul><li>#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX) </li></ul></ul><ul><li>視窗風格 (Windows Stylus) 的參數如下表所示: </li></ul>建立視窗框架的函數
  9. 9. Window Styles 建立一個視窗時,即將該視窗宣告為不可接收任何訊息。 WS_DISABLED 建立雙外框,但沒有標題的的視窗。 WS_DLGFRAME 當子視窗收到一個重繪訊息時,將不會重繪被其他子視窗覆蓋的部份。 WS_CLIPSIBLINGS 將視窗設定為第一個控制項,通常用於由控制項群組所組成的對話盒視窗,並可利用方向鍵在控制項間移動。 WS_GROUP 當在父視窗中繪圖時,繼會避開被子視窗遮蓋的部份不畫。 WS_CLIPCHILDREN 此祝窗為子視窗,但不能與 WS_POPUP 並用。 WS_CHILD 有標題欄 ( 含 WS_BORDER) ,但不可與 WS_DLGFRAME 樣式並用。 WS_CAPTION 有外框。 WS_BORDER 說明 特性參數
  10. 10. Window Styles 建立一個可重疊的視窗。 WS_OVERLAPPED 建立一個具有下列特性的視窗: WS_OVERLAPPED 、 WS_CAPTION 、 WS_SYSMENU 、 WS_THICKFRAME 、 WS_MINIMIZEBOX 、 WS_MAXIMIZEBOX 。 WS_OVERLAPPEDWINDOW 建立一個有最小化按鈕的視窗 ( 須與 WS_SYSMENU 並用 ) 。 WS_MINIMIZEBOX 建立一個彈出式視窗 ( 不可與 WS_CHILD 並用 ) 。 WS_POPUP 建立一個起始大小為最小化的視窗。 WS_MINIMIZE 建立一個有最大化按鈕的視窗 ( 須與 WS_SYSMENU 並用 ) 。 WS_MAXIMIZEBOX 建立一個起始大小為最大化的視窗。 WS_MAXIMIZE 建立一個具有水平捲軸的視窗。 WS_HSCROLL 說明 特性參數
  11. 11. Window Styles 建立一個具有垂直捲軸的視窗。 WS_VSCROLL 設定視窗一開始即顯示在螢幕上。 WS_VISIBLE 建立一個可用滑鼠調整大小的細外框視窗。 WS_THICKFRAME 設定使用者可以利用 Tab 鍵在視窗的控制項中移動。 WS_TABSTOP 建立一個左上角可拉出系統選單的視窗。 WS_SYSMENU 建立一個彈出式視窗並具有 WS_BORDER 、 WS_POPUP 、 WS_SYSMENU 等特性。 WS_POPUPWINDOW 說明 特性參數
  12. 12. <ul><li>因此若不想要視窗右上角的極大極小鈕,就得這麼做: </li></ul><ul><ul><li>Create(NULL, &quot;Hello MFC&quot;, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME, rectDefault, NULL, &quot;MainMenu&quot;); </li></ul></ul><ul><li>若希望視窗有垂直捲軸,可在第三個參數上增加 WS_VSCROLL 。 </li></ul><ul><li>除了上述標準的視窗風格,另有所謂的擴充風格,可以在 Create 的第七個參數 dwExStyle 指定之。擴充風格唯有以 ::CreateWindowEx( 而非 ::CreateWindow) 函式才能完成。事實上, CFrameWnd::Create 最終呼叫的正是 ::CreateWindowEx 。 </li></ul>建立視窗框架的函數
  13. 13. <ul><li>Create 的第四個參數 rect 指定視窗的位置與大小。預設值 rectDefault 是 CFrameWnd 的一個 static 成員變數,告訴 Windows 以預設方式指定視窗位置與大小,就好像在 SDK 程式中以 CW_USEDEFAULT 指定給 CreateWindow 函式一樣。如果你很有主見,希望視窗在特定位置有特定大小,可以這麼做: </li></ul><ul><ul><li>Create(NULL,&quot;Hello MFC&quot;,WS_OVERLAPPEDWINDOW, </li></ul></ul><ul><ul><li>CRect(40, 60, 240, 460), // 起始位置 (40,60) ,寬 200 ,高 400) </li></ul></ul><ul><ul><li>NULL,&quot;MainMenu&quot;); </li></ul></ul>建立視窗框架的函數
  14. 14. <ul><li>第五個參數 pParentWnd 指定父視窗。對於一個 top-level 視窗而言,此值應為 NULL ,表示沒有父視窗 ( 其實是有的,父視窗就是 desktop 視窗 ) 。 </li></ul><ul><li>第六個參數 lpszMenuName 指定一個定義在資源檔 (RC 檔 ) 的選單名稱。 </li></ul><ul><li>第八個參數 pContext 是一個指向 CCreateContext 結構的指標, framework 利用它,在具備 Document/View 架構的程式中初始化外框視窗。本例不具備 Document/View 架構,所以不必指定 pContext 參數,預設值為 NULL 。 </li></ul>建立視窗框架的函數
  15. 15. 建立視窗框架的函數 <ul><li>擴充風格 ( 第七個參數 dwExStyle) : </li></ul>設定視窗接受檔案以拖拽方式開啟。 WS_EX_ACCEPTFILES 讓視窗有向左對齊的屬性,此為預設值。 WS_EX_LEFT 建立一個雙外框且具有標題欄的視窗。 WS_EX_DLGMODALFRAME 允許使用者使用 Tab 鍵操作子視窗。 WS_EX_CONTROLPARENT 建立一個在標題欄具有問號按鈕的視窗,當使用者點擊該問號時,視窗將會收到 WM_HELP 訊息。 WS_EX_CONTEXTHELP 建立具有 3D 立體感的視窗 ( 帶陰影的邊界 ) 。 WS_EX_CLIENTEDGE 說明 參數
  16. 16. 建立視窗框架的函數 =WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE WS_EX_OVERLAPPEDWINDOW =WS_EX_WINDOWEDGE | WS_EX_TOPMOST WS_EX_PALETTEWINDOW 在視窗的客戶區左方效置一個捲軸。 WS_EX_LEFTSCROLLBAR 在視窗的客戶區左方效置一個捲軸,此為預設值。 WS_EX_RIGHTSCROLLBAR 讓視窗具有向右對齊的特性。 WS_EX_RIGHT 設定子視窗不必於被建立或消減時傳出 WM_PARENTNOTIFY 訊息給父視窗。 WS_EX_NOPATARENTNOTIFY 建立一個多文件的子視窗。 WS_EX_MDICHILD 以左向右的方式顯示視窗文字,預設值。 WS_EX_LTRREADING 說明 參數
  17. 17. 建立視窗框架的函數 建立一個透明視窗。 WS_EX_TRANSPARENT 以右向左的方式顯示視窗文字, WS_EX_RTLREADING 建立一個具有浮雕外框的視窗。 WS_EX_WINDOWEDGE 設定視窗置於所有不具 WS_EX_TOPMOST 特性視窗之上,即使該視窗並不處於有效狀態。 WS_EX_TOPMOST 建立一個工具視窗,該視窗被當成一個浮動的工具列使用。 WS_EX_TOOLWINDOW 建立一個 3D 外框的視窗,且不接受使用者之資料輸入。 WS_EX_STATICEDGE 說明 參數
  18. 18. <ul><li>BOOL CWnd::ShowWindow(int nCmdShow) </li></ul>顯示視窗框架的函數 以最小化方式顯示視窗。 SW_SHOWMINIMIZED 將視窗最小化,縮成一個 icon 。 SW_SHOWMINNOACTIVE 以最大化方式顯示視窗。 SW_SHOWMAXIMIZED 隱藏視窗,並將控制權交給其視窗。 SW_HIDE 以設計大小,顯示視窗。 SW_SHOW 顯示窗,如果視窗處於最大化或者最小化,則還原到預設的大小。 SW_RESTORE 將視窗最小化,並將控制權交給目前作業系統中最上層的視窗。 SW_MINIMIZE 說明 參數
  19. 19. 顯示視窗框架的函數 以目前的狀態顯示視窗。 SW_SHOWNA 顯示視窗,並將其設定為活動視窗,如果視窗為最小化或最大化,則還原至預設的位置與大小。 SW_SHOWNORMAL 以上一次顯示的大小與位置顯示視窗。 SW_SHOWNOACTIVE 說明 參數

×