1. 程式人生 > >VC 視窗焦點問題以及回車鍵,tab鍵的相關

VC 視窗焦點問題以及回車鍵,tab鍵的相關

    CDlgaDlg dlg;

    m_pMainWnd = &dlg;

應用程式啟動時,必須對CXxxApp的成員變數m_pMainWnd進行賦值,否則無法執行。在單文件的工程中,我們看不到這種賦值操作,它是在

   if (!ProcessShellCommand(cmdInfo))

       return FALSE;

在ProcessShellCommand函式中對m_pMainWnd賦了值。

一、return false和return ture的區別:

1. 在CXxxApp的InitInstance()函式中:

return false:退出應用程式,不進入訊息迴圈。

return ture:應用程式進入訊息迴圈。

2. 在對話方塊類中的OnInitDialog()中:

return false:如果在OnInitDialog()函式中設定了某控制元件得到焦點,如:

      GetDlgItem(IDC_EDIT1))->SetFocus();

      應return false,否則上一句程式碼不會生效。

return ture:在OnInitDialog()函式中沒有設定了某控制元件得到焦點,應return ture。

說明:要使對話方塊上的某個控制元件在一顯示對話方塊,就具有焦點,還可以將該控制元件的

      Table Order設為1。

二、在對話方塊中響應回車鍵:

在對話方塊中回車,會執行預設按鈕(Default Button)的函式,預設的預設按鈕是IDOK。如果沒有預設按鈕,會執行對話方塊中的OnOK()函式。所以,在一個對話方塊中要控制回車鍵,可以採用下面的方法:

1. 在OnOK()函式中新增程式碼:

在對話方塊中新增四個文字框,我們想使用者按回車鍵時,四個文字框依次迴圈得到焦點:

if(GetFocus()==GetDlgItem(IDC_EDIT4))    //如果第四個文字框得到焦點

        GetDlgItem(IDC_EDIT1)->SetFocus();   //使第一個文字框得到焦點

else if (GetFocus()->GetDlgCtrlID()==IDOK)   //如果“確定”按鈕得到焦點

        CDialog::OnOK();            //對話方塊返回

else

        GetFocus()->GetNextWindow()->SetFocus(); 

//使當前具有焦點視窗的下一個(按照Table Order順序)視窗得到焦點

2. 新增按鈕,將其設定為預設按鈕,Visible屬性設為false,為它新增響應函式,在其中程式設計(程式碼類似1)。

3. 更換回調函式:

我們更換第一個文字框的回撥函式,讓它不響應回車鍵。

i.                     定義一個全域性變數WNDPROC  oldProc; 用於儲存原來的回撥函式的指標。

ii.                   在對話方塊類中的OnInitDialog()中用SetWindowLong函式更換第一個文字框的回撥函式為newProc

oldProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(long) newProc);

iii.                  定義newProc函式:

  LRESULT CALLBACK newProc (

HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam)

{

       if(uMsg==WM_CHAR)     //如果是字元訊息

       {

              if(0xd==wParam)   //如果是回車鍵

                     return 1;     //不處理就返回,即不響應回車鍵

       }

       return oldProc (hwnd,uMsg,wParam,lParam);

              //其它訊息仍由原來的回撥函式處理

}

說明:此種方法要文字設定文字框的MultiLine 和Want return屬性設為有效。

三、製作一個可以響應WM_MOUSEMOVE訊息的按鈕:

1. 新建一個類CHide ,從CButton派生,增加成員物件CHide *m_btnFriend,在類中響應WM_MOUSEMOVE訊息,在OnMouseMove中新增程式碼:

    ShowWindow(SW_HIDE);

    m_pmyFriend->ShowWindow(SW_NORMAL);

2. 在對話方塊的標頭檔案中加入#include “hide.h”

3. 為對話方塊上的“確定”和“取消”按鈕新增捆綁變數

i.                     靜態繫結:

a.       用ClassWizard為對話方塊上的“確定”和“取消”按鈕新增捆綁變數,

     CHide             m_btnOK;

       CHide             m_btnCancel;

並將其中一個按鈕的Visible屬性設為false。

b.       此種方法會在對話方塊的DoDataExchange函式中新增

       DDX_Control(pDX, IDCANCEL, m_btnCancel);

       DDX_Control(pDX, IDOK, m_btnOK);

c.       在對話方塊類中的OnInitDialog()中新增程式碼:

     m_btnOK.m_pmyFriend=&m_btnCancel;

       m_btnCancel.m_pmyFriend=&m_btnOK;

ii.                   動態繫結:

a.       定義兩個成員變數:

     CHide             m_btnOK;

       CHide             m_btnCancel;

b.       在對話方塊類中的OnInitDialog()中新增程式碼:

     m_btnOK.m_pmyFriend=&m_btnCancel;

m_btnCancel.m_pmyFriend=&m_btnOK;

m_btnOK.SubclassDlgItem(IDOK,this);

m_btnCancel.SubclassDlgItem(IDCANCEL,this);

=======================================================================================================

MFC中如何將焦點設定到指定控制元件上

我們常常會有這樣的需求,想在視窗開啟的時候就將焦點(游標)設定到某個指定的控制元件上去。

我們都知道設定焦點需要用到setFocus這個方法(幾乎任何程式設計環境都這樣VC,C#,VB,VF都這樣)。

但在VC中我們使用了setfocus並不一定會達到我們需要的效果。

如果我們僅僅設定了setfocus那是不夠的,我們需要將對話方塊中的OnInitDialog的最後那句return設定為FALSE;

我曾經在對話方塊中對各個控制元件的輸入進行校驗檢測,當檢測到不滿足要求的輸入則會彈出對話方塊提示。

我本來的目的是彈出提示框,但確定後回到窗體中後就將焦點和游標設定到對應的控制元件上,結果死都上不去。

一開始我以為是Setfocus的設定無效,後面發現是邏輯上錯了,因為當提示框顯示的時候,在提示框彈出前通過SetFocus設定的焦點都將作廢

發現這一點後,我將彈出提示框前需要設定獲得焦點的目標控制元件儲存起來,等提示框顯示完了我仍然可以對該控制元件進行設定焦點的操作,問題總算解決了

這裡寫出來,希望大家不要走我這樣的彎路哦!

順便說一下如何獲取到焦點所在的控制元件的ID號,也許這對大家操作焦點所在控制元件有作用;

MFC::
CWnd *pWnd = GetFocus(); 
if(pWnd == NULL)
;//no focus
else
UINT nID = pWnd->GetDlgCtrlID();

SDK:
HWND hWnd = ::GetFocus();
if(hWnd == NULL)
;//no focus 
else
UINT nID = ::GetDlgCtrlID(hWnd);

轉載註明出處哦,謝了!

========================================================================================

相關推薦

VC 視窗焦點問題以及回車鍵tab相關

    CDlgaDlg dlg;     m_pMainWnd = &dlg; 應用程式啟動時,必須對CXxxApp的成員變數m_pMainWnd進行賦值,否則無法執行。在單文件的工程中,我們看不到這種賦值操作,它是在    if (!ProcessShellCommand(cmdInfo

CRT 連接 ENSP時Tab 無法補全與回車鍵顯示雙行的解決方法

mark ado 遇到 無效 img ensp title tail 今天 今天使用 CRT 連接 ensp 時,出現了一個煩人的問題:CRT 連接 ENSP時,Tab 鍵無法補全與回車鍵顯示雙行。這個雖然不影響使用,但是總是感覺不舒服,所以只能把它處理掉。在網上找

在介面上用回車鍵代替tab切換焦點的辦法

現在資源視圖裡面,把對話方塊上所有需要切換焦點的視窗或者按鈕的tabstop屬性設定為TRUE。 為視窗對映PreTranslateMessage訊息處理函式 新增以下程式碼: if((pMsg-&

sublim text3快速生成html代碼時tab失效問題

ext3 ges idt 證明 tab 個人 發現 狀態切換 nbsp sublime text3是一款非常強大的文本編輯器,個人覺得做前端的話這款工具很好用。便攜,秒啟。唯一讓我覺得不是特別爽的就是插件啊,都需要自己安裝。不過瑕不掩瑜,這款編輯器是很適合開發前端和PHP的

jQuery實現文字框回車鍵tab

 <script type="text/javascript">         //功能:將回車鍵轉tab鍵         jQuery(function () {          

如何使用回車鍵模仿Tab

導讀: 李中未:         在Delphi程式設計中,如何實現用回車鍵在若干個編輯視窗中切換?比如,姓名和密碼兩個輸入視窗,輸入姓名後,只能用Tab鍵或用滑鼠定位游標到密碼輸入視窗,我想用回車鍵切換視窗。 回答:         先將窗體的KeyPreview屬性設為T

sqlite(sql)替換特殊字元(換行tab等)

換tab  sql語句: UPDATE table_name SET field_name=REPLACE(field_name,char(09),'') 但是 sqlite會報錯 在sqlite中 換tab 為x'09'所以sql為:  update  question_

回車鍵替換Tab完成迴圈索引功能。

    DRP視訊中有個小例子,為了給使用者更好的體驗,加上了個回車鍵替換Tab鍵的功能。然後把視訊的程式碼放到我這,就出不來了。最後判斷是瀏覽器的問題。因為在我的IE8測試版能夠實現,但是放到IE9

Eclipse設定Tab 跨越四個字元 以及 Eclipse設定 程式碼格式化非同級時統一採用四個字元區分開。

1. 設定Tab鍵 跨越四個字元    開啟選單欄  【windows】,之後一次選擇【Preferences】-【General】-【Editors】-【Text Editors】,然後勾選【Insert spaces for tabs】- 以及設定 [Displ

java 控制元件實現回車到下一個焦點控制元件功能同tab

簡單示例(紅色為關鍵句):import javax.swing.*;import java.awt.*;import java.awt.event.*;public class MyTest extends JFrame implements KeyListener{priv

WinForm中變EnterTab實現焦點轉移的方法

+= end prev mar select 窗口 detail com ota if (e.KeyCode == Keys.Enter) { //this.SelectNextControl

20.Shell介紹,history,Tab通配符重定向

echo slim 系統 重新 上一條 變量 分享圖片 三次 ali 五周第三次課(1月10日) 8.1 shell介紹 8.2 命令歷史 8.3 命令補全和別名 8.4 通配符 8.5 輸入輸出重定向 shell介紹 shell是一個命令解釋器,提供用戶和機器之間的交

python3實現tkinter視窗懸浮選單操作多執行緒控制

專案需要,做了一個demo直接上程式碼供大家參考,並且留為記錄 需要更深入瞭解,可以加微信qypangu相信交流,請注時"csdn  python" #!/usr/bin/python3 # -*- coding: utf-8 -*- import tkinter im

ubuntu12.04 為python3.3安裝readline模組 以及 tab命令補全

解決方法十分簡單:進入Python-3.3.3資料夾,在這裡操作 (1)sudo make clean #將原來編譯好的python刪掉 (2)vim Modules/Setup  找到160行,將這句前面的註釋號去掉(去掉#號) readline readli

Windows 右相關:不用按Shift直接顯示“在此處開啟命令視窗

分別把登錄檔  [HKEY_CLASSES_ROOT/Drive/shell/cmd]  [HKEY_CLASSES_ROOT/Directory/shell/cmd]  [HKEY_CLASS

【Qt】Qt之Tab切換焦點順序【轉】

簡介 Qt的視窗部件按使用者的習慣來處理鍵盤焦點。也就是說,其出發點是使用者的焦點能定向到任何一個視窗,或者視窗中任何一個部件。 焦點獲取方式比較多,例如:滑鼠點選、Tab鍵切換、快捷鍵、滑鼠滾輪等。 習慣性的,我們經常會使用Tab鍵來控制焦點順序,比如:使用者註冊時,個人資訊輸入框焦點的切換、執行

Qt之Tab切換焦點順序

void Widget::setorder() { QWidget::setTabOrder(ui->pcComboBox, ui->switcherComboBox); QWidget::setTabOrder(ui->switcherComboBox, u

回車鍵轉換為Tab

str textbox 技術分享 sha object event mage 知識 rgs 實現效果:    知識運用:   KeyEventArgs類的KeyValue屬性   public int KeyValue {get;}      //獲取KeyDown或Key

不改動duilib原始碼的情況下實現tab切換登入介面EDIT控制元件功能

 由於duilib是開源無專人管理的介面庫,導致網上流傳了各式各樣的版本。今天某某修復了這個bug上傳一版,明天某某修復另一個bug上傳別的版本,太過雜亂。而且之所以寫這篇文章,是因為公司用的duilib庫,存在EDIT控制元件對table鍵支援的bug。即焦點混亂。花了近一

Qt 之 Tab 切換焦點順序

簡介 Qt的視窗部件按使用者的習慣來處理鍵盤焦點。也就是說,其出發點是使用者的焦點能定向到任何一個視窗,或者視窗中任何一個部件。 焦點獲取方式比較多,例如:滑鼠點選、Tab鍵切換、快捷鍵、滑鼠滾輪等。 習慣性的,我們經常會使用Tab鍵來控制焦點順序,比如: