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

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

?? wtl for mfc programmers, part v - advanced dialog ui classes - wtl.htm

?? WT教程中文版 內有詳細的介紹 包括各個方面
?? HTM
?? 第 1 頁 / 共 3 頁
字號:
<SPAN class=cpp-keyword>bool</SPAN> SetHyperLink(LPCTSTR lpstrLink)</font></PRE>
<P>獲得或設置控件關聯(lián)超鏈接的URL,如果不指定超鏈接URL,控件會使用顯示的文字字符串作為URL。</P>
      
<H5><font color="#990000">Navigation</font></H5>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">bool</font></SPAN><font color="#0033FF"> Navigate()</font></PRE>
<P>導航到當前超鏈接的URL,該URL或者是由SetHyperLink()函數指定的URL,或者就是控件的窗口文字。</P>
      
<H5><font color="#990000">Tooltip management</font></H5>
      
<P>沒有公開的方法設置工具提示,所以需要直接使用CToolTipCtrl成員m_tip。</P>
<p>下圖顯示的就是ControlMania2對話框中的超鏈接控件:</p>
<P><IMG height=324 alt=" [WTL hyperlink - 12K] " 
      src="images/hyperlink5.png" 
      width=305 align=bottom border=0></P>
      
<P>在OnInitDialog()函數中設置URL:</P>
<PRE>   <font color="#0033FF"> m_wndLink.SetHyperLink ( _T(<SPAN class=cpp-string>"http://www.codeproject.com/"</SPAN>) );</font></PRE>
<H2><A name=uiupdctrl></A><font color="#FFFF66">對話框中控件的UI Updating</font></H2>
      
<P>對話框中的的UI updating控制比MFC中簡單得多,在MFC中,你需要響應未公開的WM_KICKIDLE消息,處理這個消息并觸發(fā)控件的updating,在WTL中,沒有這個詭計,不過向導存在一個BUG,需要手工添加一行代碼解決這個問題。</P>
<p>首先需要記住的是對話框必須是無模式的,因為CUpdateUI需要在程序的消息循環(huán)控制下工作。如果對話框是模式的,系統(tǒng)處理消息循環(huán),我們程序的空閑處理函數就不會被調用,由于CUpdateUI是在空閑時間工作的,所以沒有空閑處理就沒有UI 
  updating。</p>
<p>ControlMania2的對話框是非模式的,類定義的開始部分很像是一個框架窗口類:</p>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">class</font></SPAN><font color="#0033FF"> CMainDlg : <SPAN class=cpp-keyword>public</SPAN> CDialogImpl&lt;CMainDlg&gt;, <SPAN class=cpp-keyword>public</SPAN> CUpdateUI&lt;CMainDlg&gt;,
                 <SPAN class=cpp-keyword>public</SPAN> CMessageFilter, <SPAN class=cpp-keyword>public</SPAN> CIdleHandler
{
<SPAN class=cpp-keyword>public</SPAN>:
    <SPAN class=cpp-keyword>enum</SPAN> { IDD = IDD_MAINDLG };
 
    <SPAN class=cpp-keyword>virtual</SPAN> BOOL PreTranslateMessage(MSG* pMsg);
    <SPAN class=cpp-keyword>virtual</SPAN> BOOL OnIdle();
 
    BEGIN_MSG_MAP_EX(CMainDlg)
        MSG_WM_INITDIALOG(OnInitDialog)
        COMMAND_ID_HANDLER_EX(IDOK, OnOK)
        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
        COMMAND_ID_HANDLER_EX(IDC_ALYSON_BTN, OnAlysonODBtn)
    END_MSG_MAP()
 
    BEGIN_UPDATE_UI_MAP(CMainDlg)
    END_UPDATE_UI_MAP()
<SPAN class=cpp-comment>//...</SPAN>
};</font></PRE>
      
<P>注意CMainDlg類從CUpdateUI派生并含有一個update UI鏈。OnInitDialog()做了這些工作,這和前面介紹的框架窗口中的代碼很相似:</P>
<PRE>    <font color="#0033FF"><SPAN class=cpp-comment>// register object for message filtering and idle updates</SPAN>
    CMessageLoop* pLoop = _Module.GetMessageLoop();
    ATLASSERT(pLoop != NULL);
    pLoop-&gt;AddMessageFilter(<SPAN class=cpp-keyword>this</SPAN>);
    pLoop-&gt;AddIdleHandler(<SPAN class=cpp-keyword>this</SPAN>);
 
    UIAddChildWindowContainer(m_hWnd);</font></PRE>
      
<P>只是這次我們不是調用UIAddToolbar()或UIAddStatusBar(),而是調用UIAddChildWindowContainer(),它告訴CUpdateUI我們的對話框含有需要updating的字窗口,只要看看OnIdle(),你會懷疑少了寫什么:</P>
<PRE><font color="#0033FF">BOOL CMainDlg::OnIdle()
{
    <SPAN class=cpp-keyword>return</SPAN> FALSE;
}</font></PRE>
      
<P>你可能猜想這里應該調用另一個CUpdateUI的方法做一些實在的updating工作,你是對的,應該是這樣的,向導在OnIdle()中漏掉了一行代碼,現在加上:</P>
<PRE><font color="#0033FF">BOOL CMainDlg::OnIdle()
{
    <B>UIUpdateChildWindows();</B>
    <SPAN class=cpp-keyword>return</SPAN> FALSE;
}</font></PRE>
      
<P>為了演示UI updating,我們設定鼠標點擊左邊的位圖按鈕,使得右邊的按鈕變得可用或禁用。先在update UI鏈中添加一個消息入口,使用UPDUI_CHILDWINDOW標志表示此入口是子窗口類型:</P>
<PRE><font color="#0033FF">    BEGIN_UPDATE_UI_MAP(CMainDlg)
        <B>UPDATE_ELEMENT(IDC_ALYSON_BMPBTN, UPDUI_CHILDWINDOW)</B>
    END_UPDATE_UI_MAP()</font></PRE>
      
<P>在左邊的按鈕的單擊事件處理中,我們調用UIEnable()來翻轉另一個按鈕的使能狀態(tài):</P>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">void</font></SPAN><font color="#0033FF"> CMainDlg::OnAlysonODBtn ( UINT uCode, <SPAN class=cpp-keyword>int</SPAN> nID, HWND hwndCtrl )
{
<SPAN class=cpp-keyword>static</SPAN> <SPAN class=cpp-keyword>bool</SPAN> s_bBtnEnabled = <SPAN class=cpp-keyword>true</SPAN>;

    s_bBtnEnabled = !s_bBtnEnabled;
    UIEnable ( IDC_ALYSON_BMPBTN, s_bBtnEnabled );
}</font></PRE>
      
<H2><A name=ddv></A><font color="#FFFF66">DDV</font></H2>
      
<P>WTL的對話框數據驗證(DDV)比MFC簡單一些,在MFC中你需要分別使用DDX(對話框數據交換)宏和DDV(對話框數據驗證)宏,在WTL中只需一個宏就可以了,WTL包含基本的數據驗證支持,在DDV鏈中可以使用三個宏:</P>
      
<DL> 
  <DT><CODE>DDX_TEXT_LEN</CODE> 
  <DD>和DDX_TEXT一樣,只是還要驗證字符串的長度(不包含結尾的空字符)小于或等于限制長度。
  <DT><CODE>DDX_INT_RANGE</CODE> and <CODE>DDX_UINT_RANGE</CODE> 
  <DD>和DDX_INT,DDX_UINT一樣,還加了對數字的最大最小值的驗證。
  <DT><CODE>DDX_FLOAT_RANGE</CODE> 
  <DD>除了像DDX_FLOAT一樣完成數據交換之外,還驗證數字的最大最小值。</DD>
</DL>
      
<P>ControlMania2有一個ID是IDC_FAV_SEASON的edit box,它和成員變量m_nSeason相關聯(lián)。</P>
      
<P><IMG height=429 alt=" [Season selector edit box - 13K] " 
      src="images/cm2_seasonedit5.png" 
      width=373 align=bottom border=0></P>
      
<P>由于有效的值是1到7,所以使用這樣的數據驗證宏:</P>
<PRE><font color="#0033FF">    BEGIN_DDX_MAP(CMainDlg)
    <SPAN class=cpp-comment>//...</SPAN>
        DDX_INT_RANGE(IDC_FAV_SEASON, m_nSeason, <SPAN class=cpp-literal>1</SPAN>, <SPAN class=cpp-literal>7</SPAN>)
    END_DDX_MAP()</font></PRE>
      
<P>OnOK()調用DoDataExchange()獲得season的數值,并驗證是在1到7之間。</P>
      <H3><A name=ddvfail></A><font color="#FFFF66">處理DDV驗證失敗</font></H3>
      
<P>如果控件的數據驗證失敗,CWinDataExchange會調用重載函數OnDataValidateError(),默認到處理是驅動PC喇叭發(fā)出聲音,你可能想給出更友好的錯誤指示。OnDataValidateError()的函數原型是:</P>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">void</font></SPAN><font color="#0033FF"> OnDataValidateError ( UINT nCtrlID, BOOL bSave, _XData&amp; data );</font></PRE>
      
<P>_XData是一個WTL的內部數據結構,CWinDataExchange根據輸入的數據和允許的數據范圍填充這個數據結構。下面是這個數據結構的定義:</P>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">struct</font></SPAN><font color="#0033FF"> _XData
{
    _XDataType nDataType;
    <SPAN class=cpp-keyword>union</SPAN>
    {
        _XTextData textData;
        _XIntData intData;
        _XFloatData floatData;
    };
};</font></PRE>
      
<P>nDataType指示聯(lián)合中的三個成員那個是有意義的,nDataType 的取值可以是:</P>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">enum</font></SPAN><font color="#0033FF"> _XDataType
{
    ddxDataNull = <SPAN class=cpp-literal>0</SPAN>,
    ddxDataText = <SPAN class=cpp-literal>1</SPAN>,
    ddxDataInt = <SPAN class=cpp-literal>2</SPAN>,
    ddxDataFloat = <SPAN class=cpp-literal>3</SPAN>,
    ddxDataDouble = <SPAN class=cpp-literal>4</SPAN>
};</font></PRE>
      
<P>在我們的例子中,nDataType的值是ddxDataInt,這表示_XData中的_XIntData成員是有效的,_XIntData是個簡單的數據結構:</P>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">struct</font></SPAN><font color="#0033FF"> _XIntData
{
    <SPAN class=cpp-keyword>long</SPAN> nVal;
    <SPAN class=cpp-keyword>long</SPAN> nMin;
    <SPAN class=cpp-keyword>long</SPAN> nMax;
};</font></PRE>
      
<P>我們重載OnDataValidateError()函數,顯示錯誤信息并告訴用戶允許的數值范圍:</P>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">void</font></SPAN><font color="#0033FF"> CMainDlg::OnDataValidateError ( UINT nCtrlID, BOOL bSave, _XData&amp; data )
{
CString sMsg;
 
    sMsg.Format ( _T(<SPAN class=cpp-string>"Enter a number between %d and %d"</SPAN>),
                  data.intData.nMin, data.intData.nMax );
 
    MessageBox ( sMsg, _T(<SPAN class=cpp-string>"ControlMania2"</SPAN>), MB_ICONEXCLAMATION );
 
    ::SetFocus ( GetDlgItem(nCtrlID) );
}</font></PRE>
      
<P>_XData中的另外兩個結構_XTextData和_XFloatData的定義在atlddx.h中,感興趣的話可以打開這個文件查看一下。</P>
<h2><A name=resizing></A><font color="#FFFF66">改變對話框的大小</font></h2>
<P>WTL引起我的注意的第一件事是對可調整大小對話框的內建的支持。在這之前我曾寫過一篇<a href="http://www.codeproject.com/wtl/wtldlgresize.asp">關于這個主題的文章</a>,詳情請參考這篇文章。簡單的說就是將CDialogResize類添加到對話框的集成列表,在OnInitDialog()中調用DlgResize_Init(),然后將消息鏈入CDialogResize。</P>
      <H2><A name=upnext></A><font color="#FFFF66">繼續(xù)</font></H2>
      
<P>下一章,我將介紹如何在對話框中使用ActiveX控件和如何處理控件觸發(fā)的事件。</P>
<H2><A name=references></A><font color="#FFFF66">參考</font></H2>
      <P><A href="http://www.codeproject.com/wtl/wtldlgresize.asp">Using WTL's 
      Built-in Dialog Resizing Class</A> - Michael Dunn</P>
      <P><A href="http://www.codeproject.com/wtl/propsheetddx.asp">Using DDX and 
      DDV with WTL</A> - Less Wright</P>
      
<H2><A name=revisionhistory></A><font color="#FFFF66">修改記錄</font></H2>
<P>2003年4月28日,本文第一次發(fā)表。</P>

</body>
</html>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91猫先生在线| 亚洲综合自拍偷拍| 成人avav影音| 天天射综合影视| 国产精品嫩草影院com| 欧美一级二级在线观看| 欧美国产禁国产网站cc| 极品少妇一区二区三区精品视频| 中文字幕乱码一区二区免费| 91麻豆精品国产91久久久使用方法 | 中文字幕欧美一| 日韩一区二区在线观看视频播放| 99re8在线精品视频免费播放| 久久精品国产一区二区三区免费看 | 9191久久久久久久久久久| av高清不卡在线| 国产精品一区二区三区四区| 日本免费在线视频不卡一不卡二| 一区二区三区美女| 亚洲天堂免费在线观看视频| 国产欧美日韩麻豆91| 亚洲成av人片在www色猫咪| 色婷婷av一区二区三区大白胸 | 日本道精品一区二区三区| 国产精品人人做人人爽人人添| 久久国产生活片100| 欧美色网站导航| 亚洲精品国产视频| 波多野结衣在线aⅴ中文字幕不卡| 久久久久久综合| 国产中文字幕精品| 亚洲人成网站色在线观看| 日韩欧美中文字幕精品| 日本乱人伦aⅴ精品| aaa亚洲精品一二三区| 激情成人午夜视频| 手机精品视频在线观看| 亚洲美女视频一区| 国产精品丝袜久久久久久app| 日韩精品一区二区三区蜜臀| 欧洲国内综合视频| 国内精品第一页| 亚洲欧美国产77777| 中文字幕一区二区三区在线不卡 | 欧美日韩免费一区二区三区视频| voyeur盗摄精品| 国产精品中文字幕日韩精品 | 精品久久久久99| 4438成人网| 欧美精品一卡二卡| 欧美在线不卡视频| 日本丶国产丶欧美色综合| 波多野结衣在线一区| 国产91对白在线观看九色| 国产精品99久久久久久久女警| 毛片基地黄久久久久久天堂| 免费成人在线视频观看| 日本色综合中文字幕| 日本sm残虐另类| 亚洲午夜久久久久久久久久久 | 国产婷婷色一区二区三区| 成人h精品动漫一区二区三区| 亚洲综合激情网| 中文字幕一区二区三区在线播放 | 精品日韩在线一区| av午夜精品一区二区三区| 在线视频一区二区免费| 亚洲精品第一国产综合野| 亚洲色图欧美激情| 悠悠色在线精品| 亚洲综合色噜噜狠狠| 亚洲第一成人在线| 免费三级欧美电影| 国产精品一区二区不卡| 成人h动漫精品一区二区| 色综合久久天天| 精品婷婷伊人一区三区三| 91国内精品野花午夜精品| 欧美三级视频在线| 日韩欧美中文字幕一区| 国产亚洲欧美日韩俺去了| 国产精品久久久久久久午夜片| 亚洲视频一区二区在线观看| 一二三区精品视频| 视频一区二区不卡| 精一区二区三区| 99精品视频在线观看| 欧美日韩在线亚洲一区蜜芽| 精品免费视频一区二区| 日本一区二区不卡视频| 一个色在线综合| 久久99精品久久只有精品| 成人av在线观| 欧美日韩色一区| 国产亚洲成av人在线观看导航| 亚洲视频在线观看三级| 日日夜夜精品视频天天综合网| 激情综合色综合久久| 波多野结衣91| 欧美一区二区私人影院日本| 亚洲国产精品黑人久久久| 亚洲一线二线三线久久久| 激情文学综合网| 在线视频你懂得一区二区三区| 亚洲成a人v欧美综合天堂下载 | 自拍偷拍欧美激情| 17c精品麻豆一区二区免费| 亚洲一区二区在线播放相泽| 精品一区二区免费| 狠狠色综合播放一区二区| 884aa四虎影成人精品一区| 欧美在线观看一区二区| 欧美午夜宅男影院| 久久午夜免费电影| 亚洲国产一区二区三区青草影视| 激情五月播播久久久精品| 91久久人澡人人添人人爽欧美| 精品国产凹凸成av人导航| 亚洲日本护士毛茸茸| 精品无人码麻豆乱码1区2区 | av在线一区二区三区| 在线视频观看一区| 欧美电影精品一区二区| 亚洲欧美一区二区久久| av成人免费在线观看| 正在播放亚洲一区| 亚洲欧美激情插| 日韩极品在线观看| 99re6这里只有精品视频在线观看| 欧美刺激脚交jootjob| 亚洲嫩草精品久久| 成人性生交大片免费看中文网站| 日韩欧美另类在线| 日韩成人免费看| 一本到高清视频免费精品| 欧美激情一区二区三区四区| 久久精品99久久久| 欧美伊人精品成人久久综合97| 亚洲一区在线视频| 99精品国产99久久久久久白柏| 久久综合成人精品亚洲另类欧美 | a级精品国产片在线观看| 欧美成人艳星乳罩| 免费看日韩精品| 欧美日韩在线一区二区| 国产精品888| 亚洲天天做日日做天天谢日日欢 | 中文字幕av在线一区二区三区| 久久电影网电视剧免费观看| 91精品国产91热久久久做人人| 免费高清在线视频一区·| 欧美mv日韩mv| 成人性视频网站| 久久久国产一区二区三区四区小说| 一区二区在线观看视频| 91美女在线看| 亚洲精品v日韩精品| 99久久亚洲一区二区三区青草| 欧美国产欧美综合| 国产999精品久久| 欧美国产一区二区在线观看| 成人av免费网站| 亚洲色图欧美在线| 色乱码一区二区三区88| 中文字幕中文字幕在线一区| 99免费精品在线观看| 中文字幕日韩一区| 在线观看欧美精品| 亚洲成人第一页| 欧美精品久久99| 精彩视频一区二区三区| 久久九九久久九九| bt欧美亚洲午夜电影天堂| 亚洲欧美另类综合偷拍| 欧美老肥妇做.爰bbww视频| 日韩不卡一区二区三区| 久久精品视频在线看| 成人av电影观看| 自拍偷自拍亚洲精品播放| 欧美日韩五月天| 国产在线视视频有精品| 中文字幕一区二区三区在线不卡| 欧美在线观看禁18| 蜜臀91精品一区二区三区| 欧美成人猛片aaaaaaa| 国产一区二区在线影院| 欧美一区二区免费观在线| 岛国av在线一区| 欧美一区二区免费观在线| 亚洲人成影院在线观看| 一本色道久久综合狠狠躁的推荐| 天天av天天翘天天综合网| 久久综合九色欧美综合狠狠| jiyouzz国产精品久久| 日韩女优av电影| 欧美精品一区二| 日本亚洲电影天堂| 日韩精品免费专区| 人人超碰91尤物精品国产| 卡一卡二国产精品 |