在设计的时候按Ctrl+T来测试对话框Tab键有效,但是程序运行的时候却无效了。可能的原因是什么?另外,对话框弹出之后,一定要用鼠标点一下文本框才能输入字符。在WM_INITDIALOG消息里已经用下面的语句设置了焦点:
SetFocus(GetDlgItem(hDlg, IDC_CardNum)); 
为什么会这样呢?

解决方案 »

  1.   

    在OnInitDialog中SetFocus后返回值应该 return FALSE;
    而不是 return TRUE;
      

  2.   

    是return FALSE;,代码是这样的:
    case WM_INITDIALOG:
    hInst = (HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE);
    SetFocus(GetDlgItem(hDlg, IDC_CardNum)); // 设置输入焦点
    hwndInfo = CreateWindow("STATIC", "", WS_VISIBLE | WS_CHILD, 80, 130, 100, 20, 
    hDlg, NULL, hInst, NULL);
    return FALSE;
      

  3.   

    // MyDialog.cpp
    #include "MyDialog.h"BOOL CMyDialog::OnInitDialog() 
    {
      CDialog::OnInitDialog();
      
      // TODO: Add extra initialization.
      m_cMyEdit.SetWindowText("My Name"); // Initialize control values.
      m_cMyList.ShowWindow(SW_HIDE);      // Show or hide a control, etc.  return TRUE;  // Return TRUE unless you set the focus to a control.
                    // EXCEPTION: OCX Property Pages should return FALSE
    }
      

  4.   

    如上:// Return TRUE unless you set the focus to a control.当你要改变默认的控件焦点时,return FALSE;
      

  5.   

    改成这样:
    case WM_INITDIALOG:
    hInst = (HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE);

    hwndInfo = CreateWindow("STATIC", "", WS_VISIBLE | WS_CHILD, 80, 130, 100, 20, 
    hDlg, NULL, hInst, NULL);
    SetFocus(GetDlgItem(hDlg, IDC_CardNum)); // 设置输入焦点
    return FALSE;
      

  6.   

    返回TRUE和FALSE结果都一样的。
    另外我没用MFC,只用Win API,然后处理窗口消息。有没有可能是什么消息没处理好?
      

  7.   

    还有,你的hDlg是全局变量不,或是static
      

  8.   

    gwinner(动力引擎),你是说把两条语句换个顺序?试过了不行,不处理WM_INITDIALOG消息也不行。
      

  9.   

    hDlg是对话框处理函数的参数:BOOL CALLBACK CXDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
      

  10.   

    找到表面原因了:
    在托盘上加了图标之后,有两个方式打开对话框:
        1 直接左键单击图标;
        2 右键单击图标弹出菜单,再选择弹出对话框。
    如果是第一种方式弹出的对话框Tab键就无效,第二种方式就没问题。为什么会这样呢?
    PS:由于一个账号最多只能连续回复3次,所以只能注册一个新的来说明情况~~。