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

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

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

?? MFC的教程。 包括: MFC教程_ 概述.files MFC教程_ MFC和Win32.files MFC教程_ CObject類.files MFC教程_ 消息映射的實現(xiàn).files
?? 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框架將不會讓它進入下一步的消息循環(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中被處理,不會進入消息發(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>//第一階段,判斷是否可以進行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>//必要的話,當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>// 進行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也分兩個階段進行處理。不同之處在于,這里不同于Run的Idle處理,RunModalLoop是給父窗口發(fā)送WM_ENTERIDLE消息(如果需要的話);另外,當前對話框的父窗口被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ǎ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首先進行數(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一区二区三区免费野_久草精品视频
亚洲欧洲成人av每日更新| 精品欧美乱码久久久久久| 亚洲123区在线观看| 亚洲国产精品精华液2区45| 欧美成人免费网站| 亚洲视频免费在线| 亚洲精品国产无天堂网2021| 中国av一区二区三区| 欧美国产日韩a欧美在线观看| 亚洲制服丝袜一区| 亚洲高清不卡在线观看| 亚洲午夜精品在线| 成人免费高清在线| 成人美女在线观看| 精品乱人伦一区二区三区| 亚洲精品日韩一| 成人av高清在线| 在线日韩国产精品| 欧美高清激情brazzers| 3751色影院一区二区三区| 日韩欧美国产三级| 欧美激情中文不卡| 久国产精品韩国三级视频| 国产精品亚洲成人| 日本高清视频一区二区| 4438成人网| 日韩成人伦理电影在线观看| 久久www免费人成看片高清| caoporn国产一区二区| 欧美三级中文字幕在线观看| 欧美一区二区精品| 中文字幕在线一区免费| 日韩vs国产vs欧美| 欧美精品黑人性xxxx| 午夜在线成人av| 欧美巨大另类极品videosbest | 国产 日韩 欧美大片| 99视频精品在线| 国产精品久久久久久久久晋中 | 成人毛片视频在线观看| 国产日韩精品一区| 婷婷久久综合九色综合绿巨人 | 91最新地址在线播放| 7777精品伊人久久久大香线蕉超级流畅 | 国产成人免费高清| 欧美最猛性xxxxx直播| 亚洲精品视频在线观看网站| 在线看国产日韩| 性久久久久久久久久久久 | 色综合久久久久久久久久久| 91精品欧美福利在线观看| 欧美bbbbb| 欧美日韩国产成人在线免费| 国产精品久久久久久亚洲伦 | 在线中文字幕一区二区| 亚洲综合视频在线| 69久久99精品久久久久婷婷| 免费美女久久99| 国产婷婷色一区二区三区在线| 午夜影视日本亚洲欧洲精品| 51久久夜色精品国产麻豆| 国产精品一区二区三区乱码| 自拍偷在线精品自拍偷无码专区| 欧美中文字幕不卡| 日韩av午夜在线观看| 国产欧美日韩麻豆91| 在线欧美一区二区| 美女一区二区久久| 欧美精品精品一区| 国产成人精品一区二区三区网站观看| 中文字幕在线观看不卡| 欧美三级中文字幕| 国产成人福利片| 亚洲福利一二三区| 久久久精品免费网站| 狠狠狠色丁香婷婷综合久久五月| 欧美精三区欧美精三区| 国产成人精品一区二| 偷窥少妇高潮呻吟av久久免费| 国产欧美一区二区三区网站 | 国产精品1区二区.| 亚洲与欧洲av电影| 国产三级欧美三级日产三级99| 在线观看日韩电影| 国产成人精品免费在线| 日韩精品一二三四| 欧美一区二区视频在线观看2022| 成人国产精品视频| 久久丁香综合五月国产三级网站| 亚洲色图欧美偷拍| 2021久久国产精品不只是精品| 九九久久精品视频| 亚洲成人一区二区在线观看| 亚洲国产精品v| 欧美本精品男人aⅴ天堂| 欧美日韩精品福利| av激情综合网| 成人性生交大片免费看在线播放| 青青青爽久久午夜综合久久午夜 | 久久综合成人精品亚洲另类欧美| 在线观看日韩一区| 97精品国产97久久久久久久久久久久| 久久99精品久久久久婷婷| 婷婷夜色潮精品综合在线| 亚洲午夜羞羞片| 亚洲乱码国产乱码精品精可以看 | 欧美精品一区二区三区视频| 国产成人亚洲综合a∨婷婷图片| 免费成人av在线播放| 亚洲 欧美综合在线网络| 亚洲蜜桃精久久久久久久| 欧美图片一区二区三区| 裸体一区二区三区| 日本成人在线电影网| 亚洲午夜电影在线| 亚洲综合自拍偷拍| 日韩精品一区二区三区视频在线观看| 欧美日韩五月天| 欧美日韩精品专区| 在线播放中文字幕一区| 欧美日韩亚洲综合一区| 欧美军同video69gay| 欧美日韩免费观看一区二区三区 | 精品在线视频一区| 久久国产精品99久久人人澡| 久久99热狠狠色一区二区| 免费欧美在线视频| 久久成人精品无人区| 国模一区二区三区白浆| 国产精品亚洲人在线观看| 成人精品一区二区三区中文字幕| 成人午夜免费视频| 色婷婷激情综合| 欧美日韩精品一区二区天天拍小说| 欧美日韩免费在线视频| 精品久久久久久久久久久久久久久| 精品电影一区二区| 国产欧美日本一区视频| 亚洲欧美日韩国产一区二区三区 | 日韩激情视频在线观看| 久久成人综合网| 成人黄色小视频| 91激情五月电影| 日韩欧美自拍偷拍| 欧美亚州韩日在线看免费版国语版| 欧美在线播放高清精品| 日韩视频免费直播| 欧美国产日韩在线观看| 亚洲午夜国产一区99re久久| 久久国产精品无码网站| 99久久久久久| 日韩欧美美女一区二区三区| 国产精品三级av| 日韩高清一级片| 粉嫩久久99精品久久久久久夜| 欧洲亚洲精品在线| 精品国产3级a| 亚洲一区二区三区四区五区黄| 麻豆成人久久精品二区三区小说| av在线综合网| 日韩欧美国产午夜精品| 尤物在线观看一区| 激情成人综合网| 欧美日韩日日骚| 国产精品久久久久婷婷| 日韩成人av影视| 91老司机福利 在线| 色先锋久久av资源部| 日韩免费观看高清完整版| 亚洲另类在线视频| 国产在线不卡一区| 国产91高潮流白浆在线麻豆| 欧美日本韩国一区二区三区视频| 中文字幕成人av| 久久66热re国产| 欧美年轻男男videosbes| 中文字幕亚洲视频| 久久99热99| 91精品欧美一区二区三区综合在| 亚洲天堂免费在线观看视频| 极品美女销魂一区二区三区免费| 欧美三级中文字| 亚洲视频精选在线| 成人动漫av在线| 久久精品人人做人人综合| 秋霞午夜av一区二区三区| 欧美视频在线观看一区二区| 亚洲色图制服诱惑| 91在线国内视频| 国产精品美女久久久久aⅴ国产馆| 久久99久国产精品黄毛片色诱| 欧美男男青年gay1069videost | 丁香激情综合国产| 久久免费看少妇高潮| 老汉av免费一区二区三区| 91精品国产色综合久久久蜜香臀| 亚洲一区二区五区| 在线国产亚洲欧美| 一区二区三区高清| 欧美私模裸体表演在线观看|