• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            數(shù)據(jù)加載中……

            Dialog中回車、Esc導(dǎo)致窗口關(guān)閉的問題

            如題,對(duì)于這種問題網(wǎng)上總結(jié)的有兩種方式來處理:
            1、重載OnOk、OnCancel函數(shù)
            2、重載PreTranslateMessage(MSG* pMsg) 函數(shù)。
            兩種方式都能達(dá)到希望的效果。但對(duì)話框中如果存在輸入控件的話,回車事件會(huì)在控件中得不到響應(yīng)。比如一個(gè)CEdit控件,回車后焦點(diǎn)依然在該控件中。

            我們可以對(duì)上面的第二種重載函數(shù)進(jìn)行一番改造,使之符合我們的預(yù)期。

            將回車事件轉(zhuǎn)化為TAB事件,這樣就可以有效的解決這個(gè)問題。

            BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
            {
                
            if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
                
            {
                    CWnd 
            *mwnd = GetNextDlgTabItem (GetFocus()); //取得當(dāng)前焦點(diǎn)控件的下一個(gè)控件的句柄
                    if (mwnd)
                    
            {
                        mwnd
            ->SetFocus(); //設(shè)置下一件控件得到輸入焦點(diǎn)
                        return TRUE;
                    }

                }

                
            return CDialog::PreTranslateMessage(pMsg);
            }

            但這時(shí)候又會(huì)有個(gè)問題,如果焦點(diǎn)定位到了真正的OK按鈕上,這時(shí)候回車應(yīng)該是觸發(fā)了按鈕的click事件,但上面的方法會(huì)導(dǎo)致焦點(diǎn)繼續(xù)轉(zhuǎn)移。與我們實(shí)際的應(yīng)用有出入。那么接下來再做一次修改升級(jí):如果是按鈕,那么我們構(gòu)造一個(gè)消息發(fā)出去。
            BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) 
            {
                
            if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
                
            {
                    CWnd 
            *wnd = GetFocus ();
                    
            if (wnd != NULL)
                    
            {
                        
            char str[256];
                        CString ClassName 
            = _T("Button");
                        GetClassName (wnd
            ->m_hWnd, str, 256);
                        
            if (ClassName == str)
                        
            {
                            UINT i 
            = wnd->GetDlgCtrlID ();
                            SendMessage (WM_COMMAND, i, (LPARAM)wnd
            ->m_hWnd);
                            
            return TRUE;
                        }

                    }

                    CWnd 
            *mwnd = GetNextDlgTabItem (wnd);
                    
            if (mwnd)
                    
            {
                        mwnd
            ->SetFocus();
                        
            return TRUE;
                    }

                }

                
            return CDialog::PreTranslateMessage(pMsg);
            }

            這樣就既解決了回車導(dǎo)致關(guān)閉的問題,也同時(shí)方便了用戶回車時(shí)在按鈕上的焦點(diǎn)切換。

            posted on 2011-04-21 10:06 Stone xin 閱讀(1038) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Window程序開發(fā)

            久久午夜电影网| 国产成人AV综合久久| 久久久久免费精品国产| 国产一区二区久久久| 久久久久亚洲AV无码永不| 久久99国产乱子伦精品免费| 国产精品久久久久久一区二区三区| 久久99亚洲综合精品首页| 成人久久免费网站| 国内精品久久久久久中文字幕| 亚洲国产成人精品无码久久久久久综合 | 亚洲人成伊人成综合网久久久| 久久福利片| 久久久久99精品成人片直播| 精品久久综合1区2区3区激情| 亚洲αv久久久噜噜噜噜噜| 国产一区二区精品久久凹凸| 亚洲精品无码久久千人斩| 国产精品青草久久久久福利99| 久久久久久国产精品无码下载| 91麻豆精品国产91久久久久久| 伊人久久大香线蕉AV色婷婷色| 国产激情久久久久影院老熟女免费 | 青青青青久久精品国产h| 国产99久久久久久免费看| 亚洲AV无码成人网站久久精品大| 精品国产综合区久久久久久| 国内精品久久久久久99蜜桃| 亚洲国产视频久久| 日韩欧美亚洲国产精品字幕久久久| 国产精品久久久久久| 国产69精品久久久久777| 久久久久99精品成人片直播| 亚洲中文精品久久久久久不卡| 亚洲综合久久久| 久久精品免费一区二区| 97精品伊人久久大香线蕉| 色悠久久久久久久综合网| 久久久久亚洲AV无码专区桃色| 久久无码AV中文出轨人妻 | 狠狠综合久久综合88亚洲|