亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mfc教程12_ 對話框和對話框類cdialog.htm

?? 此文件是將MFC在線教程的14個網頁打包
?? HTM
?? 第 1 頁 / 共 5 頁
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0042)http://www.vczx.com/tutorial/mfc/mfc12.php -->
<HTML><HEAD><TITLE>MFC教程_ 對話框和對話框類CDialog</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3157" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<OL start=12>
  <P align=justify>
  <LI><A name=_Toc452640997></A><A name=_Toc457299109></A><B>對話框和對話框類CDialog</B> 

  <P></P>
  <P align=justify>對話框經常被使用,因為對話框可以從模板創建,而對話框模板是可以使用資源編輯器方便地進行編輯的。</P>
  <OL>
    <P align=justify>
    <LI><A name=_Toc452640998></A><A name=_Toc457299110></A><B>模式和無模式對話框</B> 
    <P></P>
    <P align=justify>對話框分兩種類型,模式對話框和無模式對話框。</P>
    <OL>
      <P align=justify>
      <LI><A name=_Toc457299111></A><B>模式對話框</B> 
      <P></P>
      <P align=justify>一個模式對話框是一個有系統菜單、標題欄、邊線等的彈出式窗口。在創建對話框時指定WS_POPUP, 
      WS_SYSMENU, WS_CAPTION和 DS_MODALFRAME風格。即使沒有指定WS_VISIBLE風格,模式對話框也會被顯示。</P>
      <P 
      align=justify>創建對話框窗口時,將發送WM_INITDIALOG消息(如果指定對話框的DS_SETFONT風格,還有WM_SETFONT消息)給對話框過程。</P>
      <P align=justify>對話框過程(Dialog box procedure)不是對話框窗口的窗口過程(Window 
      procedure)。在Win32里,對話框的窗口過程由Windows系統提供,用戶在創建對話框窗口時提供一個對話框過程由窗口過程調用。</P>
      <P 
      align=justify>對話框窗口被創建之后,Windows使得它成為一個激活的窗口,它保持激活直到對話框過程調用::EndDialog函數結束對話框的運行或者Windows激活另一個應用程序為止,在激活時,用戶或者應用程序不可以激活它的所屬窗口(Owner 
      window)。</P>
      <P 
      align=justify>從某個窗口創建一個模式對話框時,Windows自動地禁止使用(Disable)這個窗口和它的所有子窗口,直到該模式對話框被關閉和銷毀。雖然對話框過程可以Enable所屬窗口,但是這樣做就失去了模式對話框的作用,所以不鼓勵這樣做。</P>
      <P 
      align=justify>Windows創建模式對話框時,給當前捕獲鼠標輸入的窗口(如果有的話)發送消息WM_CANCLEMODE。收到該消息后,應用程序應該終止鼠標捕獲(Release 
      the mouse capture)以便于用戶能把鼠標移到模式對話框;否則由于Owner窗口被禁止,程序將失去鼠標輸入。</P>
      <P 
      align=justify>為了處理模式對話框的消息,Windows開始對話框自身的消息循環,暫時控制整個應用程序的消息隊列。如果Windows收到一個非對話框消息時,則它把消息派發給適當的窗口處理;如果收到了WM_QUIT消息,則把該消息放回應用程序的消息隊列里,這樣應用程序的主消息循環最終能處理這個消息。</P>
      <P 
      align=justify>當應用程序的消息隊列為空時,Windows發送WM_ENTERIDLE消息給Owner窗口。在對話框運行時,程序可以使用這個消息進行后臺處理,當然應該注意經常讓出控制給模式對話框,以便它能接收用戶輸入。如果不希望模式對話框發送WM_ENTERIDlE消息,則在創建模式對話框時指定DS_NOIDLEMSG風格。</P>
      <P 
      align=justify>一個應用程序通過調用::EndDialog函數來銷毀一個模式對話框。一般情況下,當用戶從系統菜單里選擇了關閉(Close)命令或者按下了確認(OK)或取消(CANCLE)按鈕,::EndDialog被對話框過程所調用。調用::EndDialog時,指定其參數nResult的值,Windows將在銷毀對話框窗口后返回這個值,一般,程序通過返回值判斷對話框窗口是否完成了任務或者被用戶取消。</P>
      <P align=justify></P>
      <LI><A name=_Toc457299112></A><B>無模式對話框</B> 
      <P></P></LI></OL>
    <P 
    align=justify>一個無模式對話框是一個有系統菜單、標題欄、邊線等的彈出式窗口。在創建對話框模板時指定WS_POPUP、WS_CAPTION、WS_BORDER和WS_SYSMENU風格。如果沒有指定WS_VISIBLE風格,無模式對話框不會自動地顯示出來。</P>
    <P 
    align=justify>一個無模式對話框既不會禁止所屬窗口,也不會給它發送消息。當創建一個模式對話框時,Windows使它成為活動窗口,但用戶或者程序可以隨時改變和設置活動窗口。如果對話框失去激活,那么即使所屬窗口是活動的,在Z軸順序上,它仍然在所屬窗口之上。</P>
    <P 
    align=justify>應用程序負責獲取和派發輸入消息給對話框。大部分應用程序使用主消息循環來處理,但是為了用戶可以使用鍵盤在控制窗口之間移動或者選擇控制窗口,應用程序應該調用::IsDialogMessage函數。</P>
    <P 
    align=justify>這里,順便解釋::IsDialogMessage函數。雖然該函數是為無模式對話框設計的,但是任何包含了控制子窗口的窗口都可以調用它,用來實現類似于對話框的鍵盤選擇操作。</P>
    <P align=justify>當::IsDialogMessage處理一個消息時,它檢查鍵盤消息并把它們轉換成相應對話框的選擇命令。例如,當Tab 
    鍵被壓下時,下一個或下一組控制被選中,當Down Arrow鍵按下后,一組控制中的下一個控制被選擇。</P>
    <P 
    align=justify>::IsDialogMessage完成了所有必要的消息轉換和消息派發,所以該函數處理的消息一定不要傳遞給TranslateMessage和DispatchMessage處理。</P>
    <P 
    align=justify>一個無模式對話框不能像模式對話框那樣返回一個值給應用程序。但是對話框過程可以使用::SendMessage給所屬窗口傳遞信息。</P>
    <P 
    align=justify>在應用程序結束之前,它必須銷毀所有的無模式對話框。使用::DestroyWindow銷毀一個無模式對話框,不是使用::EndDiaLog。一般來說,對話框過程響應用戶輸入,如用戶選擇了“取消”按鈕,則調用::DestroyWindow;如果用戶沒有有關動作,則應用程序必須調用::DestroyWindow。</P>
    <P align=justify></P>
    <LI><A name=_Toc452640999></A><A name=_Toc457299113></A><B>對話框的MFC實現</B> 
    <P></P>
    <P align=justify>在MFC中,對話框窗口的功能主要由CWnd和CDialog兩個類實現。</P>
    <OL>
      <P align=justify>
      <LI><A name=_Toc452641000></A><A 
      name=_Toc457299114></A><B>CDialog的設計和實現</B> 
      <P></P>
      <P 
      align=justify>MFC通過CDialog來封裝對話框的功能。CDialog從CWnd繼承了窗口類的功能(包括CWnd實現的有關功能),并添加了新的成員變量和函數來處理對話框。</P>
      <OL>
        <P align=justify>
        <LI><A name=_Toc457299115></A><B>CDialog的成員變量</B> 
        <P></P>
        <P align=justify>CDialog的成員變量有:</P>
        <P align=justify>protected:</P>
        <P align=justify>UINT m_nIDHelp; // Help ID (0 for none, see 
        HID_BASE_RESOURCE)</P>
        <P align=justify></P>
        <P align=justify>LPCTSTR m_lpszTemplateName; // name or 
        MAKEINTRESOURCE</P>
        <P align=justify>HGLOBAL m_hDialogTemplate; // indirect 
        (m_lpDialogTemplate == NULL)</P>
        <P align=justify>// indirect if (m_lpszTemplateName == NULL)</P>
        <P align=justify>LPCDLGTEMPLATE m_lpDialogTemplate;</P>
        <P align=justify>void* m_lpDialogInit; // DLGINIT resource data</P>
        <P align=justify>CWnd* m_pParentWnd; // parent/owner window</P>
        <P align=justify>HWND m_hWndTop; // top level parent window (may be 
        disabled)</P>
        <P 
        align=justify>成員變量保存了創建對話框的模板資源、對話框父窗口對象、頂層窗口句柄等信息。三個關于模板資源的成員變量m_lpszTemplateName、m_hDialogTemplate、m_lpDialogTemplate對應了三種模板資源,但在創建對話框時,只要一個模板資源就可以了,可以使用其中的任意一類。</P>
        <P align=justify></P>
        <LI><A name=_Toc457299116></A><B>CDialog的成員函數:</B> 
        <P></P></LI></OL></LI></OL></LI></OL></LI></OL>
<OL>
  <P align=justify>
  <LI>構造函數: 
  <P></P>
  <P align=justify>CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL 
  );</P>
  <P align=justify>CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );</P>
  <P align=justify>CDialog( );</P>
  <P 
  align=justify>CDialog重載了三個構造函數。其中,第三個是缺省構造函數;第一個和第二個構造函數從指定的對話框模板資源創建,pParentWnd指定了父窗口或所屬窗口,若空則設置父窗口為應用程序主窗口。</P>
  <P align=justify></P>
  <LI>初始化函數 
  <P></P>
  <P align=justify>BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = 
  NULL );</P>
  <P align=justify>BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );</P>
  <P align=justify>BOOL CreateIndirect( LPCDLGTEMPLATE lpDialogTemplate, CWnd* 
  pParentWnd = NULL );</P>
  <P align=justify>BOOL CreateIndirect( HGLOBAL hDialogTemplate, CWnd* 
  pParentWnd = NULL );</P>
  <P align=justify>BOOL InitModalIndirect( LPCDLGTEMPLATE lpDialogTemplate, 
  CWnd* pParentWnd = NULL );</P>
  <P align=justify>BOOL InitModalIndirect( HGLOBAL hDialogTemplate, CWnd* 
  pParentWnd = NULL );</P>
  <P>Create用來根據模板創建無模式對話框;CreateInDirect用來根據內存中的模板創建無模式對話框;InitModalIndirect用來根據內存中的模板創建模式對話框。它們都提供了兩個重載版本。</P>
  <P align=justify></P>
  <LI>對話框操作函數 
  <P></P>
  <P align=justify>void MapDialogRect( LPRECT lpRect ) const;</P>
  <P align=justify>void NextDlgCtrl( ) const;</P>
  <P align=justify>void PrevDlgCtrl( ) const;</P>
  <P align=justify>void GotoDlgCtrl( CWnd* pWndCtrl );</P>
  <P align=justify>void SetDefID( UINT nID );</P>
  <P align=justify>void SetHelpID( UINT nIDR );</P>
  <P align=justify>void EndDialog( int nResult );</P>
  <P align=justify></P>
  <LI>虛擬函數 
  <P></P></LI></OL>
<P align=justify>virtual int DoModal( );</P>
<P align=justify>virtual BOOL OnInitDialog( );</P>
<P align=justify>virtual void OnSetFont( CFont* pFont );</P>
<P align=justify>virtual void OnOK( );</P>
<P align=justify>virtual void OnCancel( );</P>
<OL>
  <OL>
    <OL>
      <P align=justify>
      <LI><A name=_Toc452641001></A><A name=_Toc457299117></A><B>MFC模式對話框的實現</B> 

      <P></P>
      <P>從前面的介紹可以知道,Win32 
      SDK編程下的模式對話框使用了Windows提供給對話框窗口的窗口過程和自己的對話框過程,對話框過程將被窗口過程調用。但在MFC下,所有的窗口類都使用了同一個窗口過程,CDialog也不例外。CDialog對象在創建Windows對話框時,采用了類似于CWnd的創建函數過程,采用子類化的手段將Windows提供給對話框的窗口過程取代為AfxWndProc或者AfxBaseWndProc,同時提供了對話框過程AfxDlgProc。那么,這些“過程”是如何實現或者協調的呢?下文將予以分析。</P>
      <OL>
        <P align=justify>
        <LI><A name=_Toc457299118></A><B>MFC對話框過程</B> 
        <P></P>
        <P>MFC對話框過程AfxDlgProc的原型和實現如下:</P>
        <P align=justify>BOOL CALLBACK AfxDlgProc(HWND hWnd,</P>
        <P align=justify>UINT message, PARAM, LPARAM)</P>
        <P align=justify>{</P>
        <P align=justify>if (message == WM_INITDIALOG)</P>
        <P align=justify>{</P>
        <P align=justify>//處理WM_INITDIALOG消息</P>
        <P align=justify>CDialog* pDlg = DYNAMIC_DOWNCAST(CDialog, </P>
        <P align=justify>CWnd::FromHandlePermanent(hWnd));</P>
        <P align=justify>if (pDlg != NULL)</P>
        <P align=justify>return pDlg-&gt;OnInitDialog();</P>
        <P align=justify>else</P>
        <P align=justify>return 1;</P>
        <P align=justify>}</P>
        <P align=justify>return 0;</P>
        <P align=justify>}</P>
        <P>由上可以看出,MFC的對話框函數AfxDlgProc僅處理消息WM_INITDIALOG,其他都留給對話框窗口過程處理。因此,它不同于SDK編程的對話框過程。程序員在SDK的對話框過程處理消息和事件,實現自己的對話框功能。</P>
        <P>AfxDlgProc處理WM_INITDIALOG消息時調用虛擬函數OnInitDialog,給程序員一個機會處理對話框的初始化。</P>
        <P align=justify></P>
        <LI><A name=_Toc457299119></A><B>模式對話框窗口過程</B> 
        <P></P>
        <P>本小節討論對話框的窗口過程。</P>
        <P>AfxWndProc是所有的MFC窗口類使用的窗口過程,它取代了模式對話框原來的窗口過程(Windows提供),那么,MFC如何完成Win32下對話框窗口的功能呢?</P>
        <P>考查模式對話框的創建過程。CDialog::DoModal用來創建模式對話框窗口并執行有關任務,和DoModal相關的是MFC內部使用的成員函數CDialog::PreModal和CDialog::PostModal。下面分別討論它們的實現。</P>
        <P align=justify>HWND CDialog::PreModal()</P>
        <P align=justify>{</P>
        <P align=justify>// cannot call DoModal on a dialog already constructed 
        as modeless</P>
        <P align=justify>ASSERT(m_hWnd == NULL);</P>
        <P align=justify></P>
        <P align=justify>// allow OLE servers to disable themselves</P>
        <P align=justify>AfxGetApp()-&gt;EnableModeless(FALSE);</P>
        <P align=justify></P>
        <P align=justify>// 得到父窗口</P>
        <P align=justify>CWnd* pWnd = CWnd::GetSafeOwner(m_pParentWnd, 
        &amp;m_hWndTop);</P>
        <P align=justify></P>
        <P align=justify>// 如同CWnd處理其他窗口的創建,設置一個窗口創建HOOK</P>
        <P align=justify>AfxHookWindowCreate(this);</P>
        <P align=justify></P>
        <P align=justify>//返回父窗口的句柄</P>
        <P align=justify>return pWnd-&gt;GetSafeHwnd();</P>
        <P align=justify>}</P>
        <P align=justify></P>
        <P align=justify>void CDialog::PostModal()</P>
        <P align=justify>{</P>
        <P align=justify>//取消窗口創建前鏈接的HOOK</P>
        <P align=justify>AfxUnhookWindowCreate(); // just in case</P>
        <P align=justify>//MFC對話框對象和對應的Windows對話框窗口分離</P>
        <P align=justify>Detach(); // just in case</P>
        <P align=justify></P>
        <P align=justify>// m_hWndTop是當前對話框的父窗口或所屬窗口,則恢復它</P>
        <P align=justify>if (::IsWindow(m_hWndTop))</P>
        <P align=justify>::EnableWindow(m_hWndTop, TRUE);</P>
        <P align=justify>m_hWndTop = NULL;</P>
        <P align=justify></P>
        <P align=justify>AfxGetApp()-&gt;EnableModeless(TRUE);</P>
        <P align=justify>}</P>
        <P align=justify></P>
        <P align=justify>int CDialog::DoModal()</P>
        <P align=justify>{</P>
        <P align=justify>// can be constructed with a resource template or 
        InitModalIndirect</P>
        <P align=justify>ASSERT(m_lpszTemplateName != NULL ||</P>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡影院免费观看| 久久精品久久99精品久久| 91麻豆国产自产在线观看| 最新中文字幕一区二区三区| 9人人澡人人爽人人精品| 亚洲美女免费视频| 欧美日韩一区二区三区高清 | 视频一区视频二区中文| 欧美一区二视频| 国产精品一区二区久久不卡| 中文字幕第一区| 欧美影片第一页| 久久99最新地址| 国产精品久久久久久久久快鸭| 色哦色哦哦色天天综合| 丝袜美腿亚洲一区| www精品美女久久久tv| 97se亚洲国产综合自在线观| 亚洲电影在线免费观看| 精品国产一区二区精华| 99久久精品99国产精品| 日韩精品乱码免费| 国产区在线观看成人精品| 91久久人澡人人添人人爽欧美 | 另类人妖一区二区av| 国产日韩欧美制服另类| 欧美日产国产精品| 国产xxx精品视频大全| 亚洲123区在线观看| 国产农村妇女毛片精品久久麻豆 | 色婷婷激情一区二区三区| 久久精品免费看| 伊人夜夜躁av伊人久久| 亚洲精品一区二区三区99| 日本精品一区二区三区高清 | 视频在线观看国产精品| 国产精品女同互慰在线看 | 欧美va亚洲va香蕉在线| 91国产福利在线| 国产成人精品午夜视频免费| 日韩国产精品91| 亚洲欧美综合另类在线卡通| 精品欧美一区二区久久| 欧美吻胸吃奶大尺度电影| 成人精品一区二区三区四区| 美女在线观看视频一区二区| 亚洲国产综合91精品麻豆| 亚洲国产电影在线观看| 精品精品国产高清a毛片牛牛| 一本久久a久久精品亚洲| 国产老妇另类xxxxx| 奇米一区二区三区| 亚洲愉拍自拍另类高清精品| 国产精品久久看| 国产色综合一区| 精品国产第一区二区三区观看体验| 欧美三区在线观看| 91麻豆国产福利精品| 成人污污视频在线观看| 国产一区不卡精品| 精品一区二区三区免费播放 | 久久久久久久久久久久久女国产乱| 欧美丝袜丝nylons| 91麻豆蜜桃一区二区三区| 成人黄色综合网站| 成人在线综合网| 国产麻豆精品在线| 国产美女一区二区| 国产乱人伦精品一区二区在线观看| 日本亚洲欧美天堂免费| 日本不卡的三区四区五区| 蜜臀av性久久久久蜜臀aⅴ四虎| 一区二区三区日韩精品视频| 亚洲三级电影网站| 亚洲色图色小说| 亚洲精品久久嫩草网站秘色| 亚洲欧美一区二区不卡| 亚洲黄色小视频| 亚洲成人午夜电影| 午夜精品久久久久久久久久| 日韩在线播放一区二区| 捆绑紧缚一区二区三区视频| 国产一区二区三区免费在线观看| 亚洲午夜精品一区二区三区他趣| 一区二区三区免费看视频| 亚洲精品成人悠悠色影视| 一级做a爱片久久| 亚洲电影一区二区| 免费的成人av| 国产成人午夜精品影院观看视频| 成人av影视在线观看| 日本高清不卡视频| 精品视频色一区| 91精品国产综合久久婷婷香蕉| 日韩午夜电影av| 久久精品人人做人人爽97| 亚洲少妇屁股交4| 三级精品在线观看| 国产精品18久久久久久久网站| 粉嫩av一区二区三区| 在线观看一区不卡| 欧美群妇大交群的观看方式| 精品国产一区二区精华| 国产精品久久久久久久久动漫| 一区二区三区免费| 精品一二三四区| av在线这里只有精品| 欧美日韩一区二区在线观看| 亚洲精品在线观看网站| 国产精品传媒入口麻豆| 午夜国产不卡在线观看视频| 国产在线精品视频| 在线观看中文字幕不卡| 欧美精品一区二区三区蜜桃视频 | 亚洲成人午夜影院| 国产成人8x视频一区二区| 欧美视频完全免费看| 久久天堂av综合合色蜜桃网| 亚洲精选视频在线| 看片网站欧美日韩| 欧美性一区二区| 国产欧美日韩另类一区| 亚洲妇熟xx妇色黄| 国产69精品一区二区亚洲孕妇| 欧美色欧美亚洲另类二区| 中文字幕欧美区| 日本不卡一区二区三区 | 国产福利不卡视频| 宅男在线国产精品| 综合色中文字幕| 国产一区高清在线| 制服丝袜亚洲色图| 亚洲精品国产第一综合99久久 | 亚洲成人资源在线| 丁香婷婷综合色啪| 欧美电视剧免费全集观看| 一区二区三区精品| 粉嫩一区二区三区在线看| 日韩精品一区国产麻豆| 亚洲一区在线观看免费观看电影高清| 国产成人在线网站| 精品久久久久久无| 日韩精品电影在线观看| 欧美在线色视频| 亚洲嫩草精品久久| jlzzjlzz亚洲女人18| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 久久国产精品99久久人人澡| 欧美午夜精品久久久久久孕妇| 国产精品久久久久久久久果冻传媒 | 91在线云播放| 国产精品久久久久国产精品日日| 久久不见久久见免费视频1| 欧美日韩视频在线第一区 | 久久免费的精品国产v∧| 首页国产丝袜综合| 欧美日韩成人综合天天影院| 亚洲高清免费一级二级三级| 欧美在线观看视频在线| 夜夜爽夜夜爽精品视频| 色婷婷亚洲精品| 一区二区三区在线视频观看 | 亚洲日穴在线视频| 91日韩精品一区| 亚洲欧美日韩在线播放| 99re成人在线| 一区二区三区在线观看网站| 色先锋久久av资源部| 亚洲综合无码一区二区| 色婷婷激情综合| 亚洲成av人片在www色猫咪| 欧美日韩性生活| 美女视频免费一区| 久久色在线视频| 国产高清无密码一区二区三区| 国产日韩欧美一区二区三区综合 | 色呦呦国产精品| 亚洲影视资源网| 69久久夜色精品国产69蝌蚪网| 偷偷要91色婷婷| 日韩精品一区国产麻豆| 国产91精品露脸国语对白| 亚洲人成网站色在线观看| 在线看日本不卡| 蜜桃视频一区二区三区| 久久精品一区二区三区四区| 成人aa视频在线观看| 玉米视频成人免费看| 欧美一区二区三区视频在线观看| 美腿丝袜在线亚洲一区| 国产精品蜜臀在线观看| 欧美三级电影在线看| 蜜芽一区二区三区| 欧美国产一区视频在线观看| 色哟哟国产精品| 激情文学综合丁香| 亚洲桃色在线一区| 在线播放亚洲一区| 高清不卡一二三区| 亚洲午夜精品在线|