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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

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

?? 此文件是將MFC在線教程的14個網(wǎng)頁打包
?? HTM
?? 第 1 頁 / 共 5 頁
字號:
        <P align=justify>CDialog::OnCmdMsg不僅適用于模式對話框,也適用于無模式對話框。</P>
        <P align=justify></P>
        <LI><A name=_Toc457299122></A><B>消息預(yù)處理和Dialog消息</B> 
        <P></P>
        <P 
        align=justify>另外,對話框窗口的消息處理還有一個特點,就是增加了對Dialog消息的處理,如同在介紹::IsDialogMessage函數(shù)時所述。如果是Dialog消息,MFC框架將不會讓它進(jìn)入下一步的消息循環(huán)。為此,MFC覆蓋了CDialog的虛擬函數(shù)PreTranslateMessage,該函數(shù)的實現(xiàn)如下:</P>
        <P align=justify>BOOL CDialog::PreTranslateMessage(MSG* pMsg)</P>
        <P align=justify>{</P>
        <P align=justify>// 用于無模式或者模式對話框的處理</P>
        <P align=justify>ASSERT(m_hWnd != NULL);</P>
        <P align=justify></P>
        <P align=justify>//過濾tooltip messages</P>
        <P align=justify>if (CWnd::PreTranslateMessage(pMsg))</P>
        <P align=justify>return TRUE;</P>
        <P align=justify></P>
        <P align=justify>//在Shift+F1幫助模式下,不轉(zhuǎn)換Dialog messages</P>
        <P align=justify>CFrameWnd* pFrameWnd = GetTopLevelFrame();</P>
        <P align=justify>if (pFrameWnd != NULL &amp;&amp; 
        pFrameWnd-&gt;m_bHelpMode)</P>
        <P align=justify>return FALSE;</P>
        <P align=justify></P>
        <P align=justify>//處理Escape鍵按下的消息</P>
        <P align=justify>if (pMsg-&gt;message == WM_KEYDOWN &amp;&amp;</P>
        <P align=justify>(pMsg-&gt;wParam == VK_ESCAPE || pMsg-&gt;wParam == 
        VK_CANCEL) &amp;&amp;</P>
        <P align=justify>(::GetWindowLong(pMsg-&gt;hwnd, GWL_STYLE) &amp; 
        ES_MULTILINE) &amp;&amp;</P>
        <P align=justify>_AfxCompareClassName(pMsg-&gt;hwnd, _T("Edit")))</P>
        <P align=justify>{</P>
        <P align=justify>HWND hItem = ::GetDlgItem(m_hWnd, IDCANCEL);</P>
        <P align=justify>if (hItem == NULL || ::IsWindowEnabled(hItem))</P>
        <P align=justify>{</P>
        <P align=justify>SendMessage(WM_COMMAND, IDCANCEL, 0);</P>
        <P align=justify>return TRUE;</P>
        <P align=justify>}</P>
        <P align=justify>}</P>
        <P align=justify>// 過濾來自控制該對話框子窗口的送給該對話框的Dialog消息</P>
        <P align=justify>return PreTranslateInput(pMsg);</P>
        <P align=justify>}</P>
        <P 
        align=justify>從其實現(xiàn)可以看出,如果是Tooltip消息或者Dialog消息,這些消息將在PreTranslateMessage中被處理,不會進(jìn)入消息發(fā)送的處理。</P>
        <P 
        align=justify>PreTranslateInput是CWnd的成員函數(shù),它調(diào)用::IsDialogMessage函數(shù)來處理Dialog消息。</P>
        <P align=justify>PreTranslateMessage的實現(xiàn)不僅用于模式對話框,而且用于無模式對話框。</P>
        <P align=justify></P>
        <LI><A name=_Toc457299123></A><B>模式對話框的消息循環(huán)</B> 
        <P></P></LI></OL>
      <P 
      align=justify>從DoModal的實現(xiàn)可以看出,DoModal調(diào)用CreateDlgIndirect創(chuàng)建的是無模式對話框,MFC如何來接管和控制應(yīng)用程序的消息隊列,實現(xiàn)一個模式對話框的功能呢?</P>
      <P 
      align=justify>CDialog調(diào)用了RunModalLoop來實現(xiàn)模式窗口的消息循環(huán)。RunModalLoop是CWnd的成員函數(shù),它和相關(guān)函數(shù)的實現(xiàn)如下:</P>
      <P align=justify>int CWnd::RunModalLoop(DWORD dwFlags)</P>
      <P align=justify>{</P>
      <P align=justify>ASSERT(::IsWindow(m_hWnd)); //窗口必須已經(jīng)創(chuàng)建且不在模式狀態(tài) 
      ASSERT(!(m_nFlags &amp; WF_MODALLOOP)); </P>
      <P align=justify></P>
      <P align=justify>// 以下變量用于Idle處理</P>
      <P align=justify>BOOL bIdle = TRUE;</P>
      <P align=justify>LONG lIdleCount = 0;</P>
      <P align=justify>BOOL bShowIdle = (dwFlags &amp; MLF_SHOWONIDLE) 
      &amp;&amp; </P>
      <P align=justify>!(GetStyle() &amp; WS_VISIBLE);</P>
      <P align=justify>HWND hWndParent = ::GetParent(m_hWnd);</P>
      <P align=justify>m_nFlags |= (WF_MODALLOOP|WF_CONTINUEMODAL);</P>
      <P align=justify>MSG* pMsg = &amp;AfxGetThread()-&gt;m_msgCur;</P>
      <P align=justify></P>
      <P align=justify>//獲取和派發(fā)消息直到模式狀態(tài)結(jié)束</P>
      <P align=justify>for (;;)</P>
      <P align=justify>{</P>
      <P align=justify>ASSERT(ContinueModal());</P>
      <P align=justify></P>
      <P align=justify>//第一階段,判斷是否可以進(jìn)行Idle處理</P>
      <P align=justify>while (bIdle &amp;&amp;!::PeekMessage(pMsg, NULL, NULL, 
      NULL, PM_NOREMOVE))</P>
      <P align=justify>{</P>
      <P align=justify>ASSERT(ContinueModal());</P>
      <P align=justify></P>
      <P align=justify>//必要的話,當(dāng)Idle時顯示對話框窗口</P>
      <P align=justify>if (bShowIdle)</P>
      <P align=justify>{</P>
      <P align=justify>ShowWindow(SW_SHOWNORMAL);</P>
      <P align=justify>UpdateWindow();</P>
      <P align=justify>bShowIdle = FALSE;</P>
      <P align=justify>}</P>
      <P align=justify></P>
      <P align=justify>// 進(jìn)行Idle處理</P>
      <P align=justify>//必要的話發(fā)送WM_ENTERIDLE消息給父窗口</P>
      <P align=justify>if (!(dwFlags &amp; MLF_NOIDLEMSG) &amp;&amp;hWndParent 
      != NULL &amp;&amp; lIdleCount == 0)</P>
      <P align=justify>{</P>
      <P align=justify>::SendMessage(hWndParent, WM_ENTERIDLE, </P>
      <P align=justify>MSGF_DIALOGBOX, (LPARAM)m_hWnd);</P>
      <P align=justify>}</P>
      <P align=justify>//必要的話發(fā)送WM_KICKIDLE消息給父窗口</P>
      <P align=justify>if ((dwFlags &amp; MLF_NOKICKIDLE) ||</P>
      <P align=justify>!SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, 
      lIdleCount++))</P>
      <P align=justify>{</P>
      <P align=justify>//終止Idle處理</P>
      <P align=justify>bIdle = FALSE;</P>
      <P align=justify>}</P>
      <P align=justify>}</P>
      <P align=justify></P>
      <P align=justify>//第二階段,發(fā)送消息</P>
      <P align=justify>do</P>
      <P align=justify>{</P>
      <P align=justify>ASSERT(ContinueModal());</P>
      <P align=justify></P>
      <P align=justify>// 若是WM_QUIT消息,則發(fā)送該消息到消息隊列,返回;否則發(fā)送消息。</P>
      <P align=justify>if (!AfxGetThread()-&gt;PumpMessage())</P>
      <P align=justify>{</P>
      <P align=justify>AfxPostQuitMessage(0);</P>
      <P align=justify>return -1;</P>
      <P align=justify>}</P>
      <P align=justify></P>
      <P align=justify>//必要的話,顯示對話框窗口</P>
      <P align=justify>if (bShowIdle &amp;&amp;</P>
      <P align=justify>(pMsg-&gt;message == 0x118 || pMsg-&gt;message == 
      WM_SYSKEYDOWN))</P>
      <P align=justify>{</P>
      <P align=justify>ShowWindow(SW_SHOWNORMAL);</P>
      <P align=justify>UpdateWindow();</P>
      <P align=justify>bShowIdle = FALSE;</P>
      <P align=justify>}</P>
      <P align=justify></P>
      <P align=justify>if (!ContinueModal())</P>
      <P align=justify>goto ExitModal;</P>
      <P align=justify></P>
      <P align=justify>//在派發(fā)了“正常 ”消息后,重新開始Idle處理</P>
      <P align=justify>if (AfxGetThread()-&gt;IsIdleMessage(pMsg))</P>
      <P align=justify>{</P>
      <P align=justify>bIdle = TRUE;</P>
      <P align=justify>lIdleCount = 0;</P>
      <P align=justify>}</P>
      <P align=justify>} while (::PeekMessage(pMsg, NULL, NULL, NULL, 
      PM_NOREMOVE));</P>
      <P align=justify>}</P>
      <P align=justify></P>
      <P align=justify>ExitModal:</P>
      <P align=justify>m_nFlags &amp;= ~(WF_MODALLOOP|WF_CONTINUEMODAL);</P>
      <P align=justify>return m_nModalResult;</P>
      <P align=justify>}</P>
      <P align=justify></P>
      <P align=justify>BOOL CWnd::ContinueModal()</P>
      <P align=justify>{</P>
      <P align=justify>return m_nFlags &amp; WF_CONTINUEMODAL;</P>
      <P align=justify>}</P>
      <P align=justify></P>
      <P align=justify>void CWnd::EndModalLoop(int nResult)</P>
      <P align=justify>{</P>
      <P align=justify>ASSERT(::IsWindow(m_hWnd));</P>
      <P align=justify></P>
      <P align=justify>// this result will be returned from 
      CWnd::RunModalLoop</P>
      <P align=justify>m_nModalResult = nResult;</P>
      <P align=justify></P>
      <P align=justify>// make sure a message goes through to exit the modal 
      loop</P>
      <P align=justify>if (m_nFlags &amp; WF_CONTINUEMODAL)</P>
      <P align=justify>{</P>
      <P align=justify>m_nFlags &amp;= ~WF_CONTINUEMODAL;</P>
      <P align=justify>PostMessage(WM_NULL);</P>
      <P align=justify>}</P>
      <P align=justify>}</P>
      <P 
      align=justify>和CWinThread::Run的處理過程比較,RunModalLoop也分兩個階段進(jìn)行處理。不同之處在于,這里不同于Run的Idle處理,RunModalLoop是給父窗口發(fā)送WM_ENTERIDLE消息(如果需要的話);另外,當(dāng)前對話框的父窗口被Disabled,是不接收用戶消息的。</P>
      <P 
      align=justify>RunModalLoop是一個實現(xiàn)自己的消息循環(huán)的示例,消息循環(huán)的條件是模式化狀態(tài)沒有結(jié)束。實現(xiàn)線程自己的消息循環(huán)見8.5.6節(jié)。</P>
      <P 
      align=justify>當(dāng)用戶按下按鈕“取消”、“確定”時,將導(dǎo)致RunModalLoop退出消息循環(huán),結(jié)束對話框模式狀態(tài),并調(diào)用::EndDialog關(guān)閉窗口。有關(guān)關(guān)閉對話框的處理如下:</P>
      <P align=justify>void CDialog::EndDialog(int nResult)</P>
      <P align=justify>{</P>
      <P align=justify>ASSERT(::IsWindow(m_hWnd));</P>
      <P align=justify></P>
      <P align=justify>if (m_nFlags &amp; (WF_MODALLOOP|WF_CONTINUEMODAL))</P>
      <P align=justify>EndModalLoop(nResult);</P>
      <P align=justify></P>
      <P align=justify>::EndDialog(m_hWnd, nResult);</P>
      <P align=justify>}</P>
      <P align=justify>void CDialog::OnOK()</P>
      <P align=justify>{</P>
      <P align=justify>if (!UpdateData(TRUE)) {</P>
      <P align=justify>TRACE0("UpdateData failed during dialog 
      termination.\n");</P>
      <P align=justify>// the UpdateData routine will set focus to correct 
      item</P>
      <P align=justify>return;</P>
      <P align=justify>}</P>
      <P align=justify>EndDialog(IDOK);</P>
      <P align=justify>}</P>
      <P align=justify></P>
      <P align=justify>void CDialog::OnCancel()</P>
      <P align=justify>{</P>
      <P align=justify>EndDialog(IDCANCEL);</P>
      <P align=justify>}</P>
      <P align=justify>上述函數(shù)OnOk、OnCancle、EndDialog都可以用來關(guān)閉對話框窗口。其中:</P>
      <P align=justify>OnOk首先進(jìn)行數(shù)據(jù)交換,獲取對話框中各個控制子窗口的數(shù)據(jù),然后調(diào)用EndDialog結(jié)束對話框。</P>
      <P align=justify>OnCancle直接EndDialog結(jié)束對話框。</P>
      <P 
      align=justify>EndDialog首先修改m_nFlag的值,表示結(jié)束模式循環(huán),然后調(diào)用::EndDialog關(guān)閉對話框窗口。</P>
      <P align=justify></P>
      <LI><A name=_Toc452641002></A><A name=_Toc457299124></A><B>對話框的數(shù)據(jù)交換</B> 
      <P></P>
      <P 
      align=justify>對話框數(shù)據(jù)交換指以下兩種動作,或者是把內(nèi)存數(shù)據(jù)寫入對應(yīng)的控制窗口,或者是從控制窗口讀取數(shù)據(jù)并保存到內(nèi)存變量中。MFC為了簡化這些操作,以CDataExchange類和一些數(shù)據(jù)交換函數(shù)為基礎(chǔ),提供了一套數(shù)據(jù)交換和校驗的機制。</P>
      <OL>
        <P align=justify>
        <LI><A name=_Toc457299125></A><B>數(shù)據(jù)交換的方法</B> 
        <P></P>
        <P 
        align=justify>首先,定義保存數(shù)據(jù)的內(nèi)存變量──給對話框添加成員變量,每個控制窗口可以對應(yīng)一個成員變量,或者是控制窗口類型,或者是控制窗口表示的數(shù)據(jù)的類型。例如,對于對話框的一個編輯控制窗口,可以定義一個CEdit類型的成員變量,或者一個CString類型的成員變量。</P>
        <P align=justify>其次,覆蓋對話框的虛擬函數(shù)DoDataExchange,實現(xiàn)數(shù)據(jù)交換和驗證。</P>
        <P 
        align=justify>ClassWizard可以協(xié)助程序員自動地添加成員變量,修改DoDataExchange。例如,一個對話框有兩個控制窗口,其中的一個編輯框表示姓名,ID是IDC_NAME,另一個編輯框表示年齡,ID是IDC_AGE,ClassWizard添加如下的成員變量:</P>
        <P align=justify>// Dialog Data</P>

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女mm1313爽爽久久久蜜臀| 日韩视频不卡中文| 在线不卡的av| 国产精品视频在线看| 亚洲大片精品永久免费| 国产精品一区二区果冻传媒| 欧美日韩精品一区二区三区四区| 欧美精品一区二区三区久久久| 亚洲综合丝袜美腿| 成人免费电影视频| 久久亚洲欧美国产精品乐播| 香蕉加勒比综合久久| 91碰在线视频| 欧美国产日本韩| 国产一区二区三区不卡在线观看 | 欧美丰满一区二区免费视频| 亚洲日本护士毛茸茸| 国产成人免费在线观看| 精品欧美一区二区久久| 奇米影视一区二区三区小说| 欧美无乱码久久久免费午夜一区| 最近日韩中文字幕| 成人毛片老司机大片| 中文字幕av在线一区二区三区| 国产一区二区免费看| 精品国产不卡一区二区三区| 日本亚洲最大的色成网站www| 欧美午夜精品久久久久久超碰| 亚洲人成网站影音先锋播放| 成人的网站免费观看| 久久日韩粉嫩一区二区三区| 国产风韵犹存在线视精品| 日韩欧美色综合| 久久精品国产一区二区三| 欧美一区二区视频在线观看| 欧美aⅴ一区二区三区视频| 欧美女孩性生活视频| 性感美女久久精品| 日韩欧美一区二区免费| 久久精品国产精品亚洲精品| 欧美一区二区三区四区在线观看 | 在线观看国产91| 亚洲丝袜制服诱惑| 高清在线不卡av| 日本一区二区在线不卡| 丁香亚洲综合激情啪啪综合| 国产精品人人做人人爽人人添| 91视频在线看| 亚洲一区二区三区精品在线| 欧美日韩高清一区二区不卡| 蜜乳av一区二区| 国产亚洲精品资源在线26u| 成人免费视频caoporn| 中文字幕综合网| 欧美日韩激情在线| 精品一区二区免费看| 国产人成一区二区三区影院| 91视频你懂的| 麻豆精品国产传媒mv男同| 久久品道一品道久久精品| 972aa.com艺术欧美| 亚洲成在线观看| 日韩欧美一区二区在线视频| 成人免费av网站| 五月天激情综合网| 国产欧美一区二区精品性色 | 欧美日产在线观看| 精品亚洲国内自在自线福利| 中文字幕一区二区三区av| 4438x成人网最大色成网站| 国产老肥熟一区二区三区| 亚洲欧美一区二区在线观看| 色吧成人激情小说| 免费观看日韩av| **欧美大码日韩| 日韩一区二区精品在线观看| 成人高清av在线| 久久99九九99精品| 亚洲乱码国产乱码精品精98午夜| 欧美xxxxx牲另类人与| 色综合av在线| 国产精品资源在线| 日日噜噜夜夜狠狠视频欧美人| 国产日韩精品久久久| 欧美一区二区视频在线观看2022| 成人在线视频一区二区| 日韩精品1区2区3区| 中文字幕视频一区| 久久午夜羞羞影院免费观看| 在线观看亚洲成人| 成人高清视频免费观看| 精品在线免费视频| 水野朝阳av一区二区三区| 中文字幕 久热精品 视频在线| 日韩免费高清视频| 欧美日韩在线免费视频| 91在线国内视频| 国产福利一区二区三区| 老司机免费视频一区二区| 亚洲欧洲99久久| 中文字幕第一页久久| 国产亚洲成年网址在线观看| 91精品国产一区二区三区| 91麻豆精东视频| 成人av电影在线播放| 成人小视频在线| 国产91在线|亚洲| 国产999精品久久| 免费黄网站欧美| 色综合久久九月婷婷色综合| 成人国产精品免费观看动漫| 国产在线一区观看| 久久成人18免费观看| 美国毛片一区二区三区| 青青草97国产精品免费观看 | 欧美激情一区不卡| 国产亚洲综合色| 欧美国产日韩a欧美在线观看| 国产日韩精品一区二区三区在线| 欧美精品一区二区三| 久久久一区二区三区捆绑**| 久久久蜜桃精品| 国产精品免费视频网站| 最新国产精品久久精品| 亚洲人成7777| 一区二区三区欧美日| 又紧又大又爽精品一区二区| 洋洋av久久久久久久一区| 亚洲国产成人精品视频| 日本最新不卡在线| 国产精品主播直播| 91蝌蚪porny成人天涯| 欧美午夜电影在线播放| 欧美一级日韩一级| 国产亚洲欧美一级| 伊人开心综合网| 日精品一区二区三区| 精油按摩中文字幕久久| 国产精品综合视频| 91丨porny丨在线| 91麻豆精品国产| 久久精品一区八戒影视| 一区二区三区蜜桃| 久久成人18免费观看| 97se狠狠狠综合亚洲狠狠| 欧美日韩一区三区四区| 欧美精品一区二区久久久| 国产精品久久久久影院| 天堂在线亚洲视频| 风间由美性色一区二区三区| 在线观看网站黄不卡| 日韩精品在线一区二区| 国产精品免费观看视频| 欧美aa在线视频| 99re在线精品| 亚洲精品一区二区三区四区高清| 亚洲人成在线观看一区二区| 免费精品视频最新在线| 色综合久久六月婷婷中文字幕| 欧美一卡在线观看| 亚洲少妇30p| 精品一区免费av| 在线一区二区三区做爰视频网站| 日韩一区二区三区电影| 亚洲视频网在线直播| 精品在线一区二区三区| 欧美男女性生活在线直播观看| 国产欧美一区二区精品性| 日本欧美一区二区| 在线看国产日韩| 国产精品人成在线观看免费 | 5月丁香婷婷综合| 国产精品第13页| 国产一二精品视频| 91精品国产入口| 一区二区三区四区精品在线视频| 国产一区二区三区电影在线观看| 在线电影国产精品| 一区二区三区中文字幕| 国产精品影视网| 日韩精品专区在线影院重磅| 亚洲一区二区三区四区五区中文| 成人动漫av在线| 国产偷国产偷精品高清尤物 | 亚洲国产精品视频| 91在线播放网址| 国产精品久久毛片a| 国产精品99久久久久久久vr| 日韩一区二区三免费高清| 亚洲成人av电影在线| 色综合久久中文综合久久牛| 中文一区一区三区高中清不卡| 国产一区欧美一区| 精品国产乱码久久久久久图片| 天天影视涩香欲综合网| 精品婷婷伊人一区三区三| 一个色在线综合| 欧美日韩国产不卡| 午夜影院在线观看欧美| 欧美老肥妇做.爰bbww视频|