• <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>
            數據加載中……

            Dialog中回車、Esc導致窗口關閉的問題

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

            我們可以對上面的第二種重載函數進行一番改造,使之符合我們的預期。

            將回車事件轉化為TAB事件,這樣就可以有效的解決這個問題。

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

                }

                
            return CDialog::PreTranslateMessage(pMsg);
            }

            但這時候又會有個問題,如果焦點定位到了真正的OK按鈕上,這時候回車應該是觸發了按鈕的click事件,但上面的方法會導致焦點繼續轉移。與我們實際的應用有出入。那么接下來再做一次修改升級:如果是按鈕,那么我們構造一個消息發出去。
            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);
            }

            這樣就既解決了回車導致關閉的問題,也同時方便了用戶回車時在按鈕上的焦點切換。

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

            国产精品99久久久精品无码| 四虎影视久久久免费| 思思久久精品在热线热| 亚洲欧美伊人久久综合一区二区| 久久精品一区二区三区AV| 欧美大香线蕉线伊人久久| 日韩欧美亚洲综合久久影院d3| 免费一级欧美大片久久网| 欧美亚洲国产精品久久高清 | 国产亚洲精品久久久久秋霞| 粉嫩小泬无遮挡久久久久久| 久久国产乱子伦精品免费午夜| 久久人人爽人人爽人人片AV东京热 | 精品久久人妻av中文字幕| 欧美激情精品久久久久久久| 亚洲国产精品无码久久久不卡| 99精品久久久久久久婷婷| 亚洲女久久久噜噜噜熟女| 色婷婷久久综合中文久久一本| 久久国产色AV免费观看| 欧美精品乱码99久久蜜桃| 久久精品国产99久久久香蕉| 久久婷婷五月综合97色一本一本| 久久精品无码一区二区日韩AV| 国产美女久久精品香蕉69| 亚洲精品国产综合久久一线| 99久久精品免费看国产免费| 97久久超碰成人精品网站| 7777精品久久久大香线蕉| 麻豆av久久av盛宴av| 精品乱码久久久久久夜夜嗨| 四虎国产精品免费久久久| 久久福利青草精品资源站| 精品综合久久久久久888蜜芽| 亚洲香蕉网久久综合影视| 久久亚洲精品无码aⅴ大香| 亚洲日韩欧美一区久久久久我 | 国产成人精品久久| 亚洲AV乱码久久精品蜜桃| 亚洲狠狠婷婷综合久久久久| 日产精品久久久久久久|