对话框控件的焦点设置

时间:2021-09-11 05:53:02
我用MFC做了一个应用程序。应用程序对象CTvPlayerApp theApp;
程序启动后,在
BOOL CTvPlayerApp::InitInstance()
{
       CTvPlayerDlg dlg;
       m_pMainWnd = &dlg;
       INT_PTR nResponse = dlg.DoModal();//在这里创建了一个模态对话框

在模态对话框初始化时
BOOL CTvPlayerDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    m_VideoWindow.ModifyStyle(0, WS_CLIPCHILDREN);
    int tmp_W = GetSystemMetrics(SM_CXSCREEN);
    int tmp_H = GetSystemMetrics(SM_CYSCREEN);
    SetWindowPos(&CWnd::wndNoTopMost,-2,-2,tmp_W+8,tmp_H+8,SWP_HIDEWINDOW);
    LoadProgramList();这是一个函数
    return TRUE; 

在函数中:有这么一个判断
void CTvPlayerDlg::LoadProgramList()
{
  if()
   .........
  else 
   {    
      if (AfxMessageBox(L"节目列表为空,必须进行节目搜索,搜索请选择“确定”,退出请选择“取消”!",MB_OKCANCEL) == IDOK)
       {
if (m_pSearchDlg != NULL)
{
 delete m_pSearchDlg;
 m_pSearchDlg = NULL;
}
m_pSearchDlg = new CSearchDlg;       //创建了一个非模态对话框,有一个CShockwaveflash控件
m_pSearchDlg->Create(IDD_DIALOG_SEARCH, NULL);
m_pSearchDlg->inputTvDlg(this);
      }
      else
       {
OnBnClickedCancel();
        }
   }
}
非模态对话框CSearchDlg的初始化函数如下:
BOOL CNSearchDlg::OnInitDialog()
{
CDialog::OnInitDialog();

int tmp_W = GetSystemMetrics(SM_CXSCREEN);
int tmp_H = GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(&CWnd::wndTopMost, -2, -2, tmp_W+4, tmp_H+4, SWP_SHOWWINDOW);

CWnd *pWndsearch = GetDlgItem(IDC_SHOCKWAVEFLASH_SEARCH);
if(pWndsearch)
{
CRect searchRect(0, 0, tmp_W+4, tmp_H+4);
pWndsearch->MoveWindow(searchRect);
}
CString strAppFullName;
CString strAppPath;
GetModuleFileName(AfxGetApp()->m_hInstance, strAppFullName.GetBuffer(MAX_PATH), MAX_PATH);
strAppFullName.ReleaseBuffer();
int nPos = 0;
nPos = strAppFullName.ReverseFind(_T('\\'));
strAppPath = strAppFullName.Left(nPos + 1);
CString strFilePath = strAppPath + _T("Initsearch.swf");
m_searchUI.put_Movie(strFilePath);
m_searchUI.SetFocus();//在这里我设置了控件的焦点
return FALSE;  // return TRUE unless you set the focus to a control}
可是用SetFocus()这个也不能把焦点放到控件上来,而且我测试了发现焦点在那个模态对话框CTvPlayerDlg上,
求高手帮忙解决。

9 个解决方案

#1


简化一点就是:
应用程序创建模态对话框CTvPlayerDlg--------
模态对换框初始化时有函数void CTvPlayerDlg::LoadProgramList()
-----------函数之中又创建了一个非模态对话框CSearchDlg---------
非模态对话框有一个CShockwaveflash控件
我想在创建非模态对话框时把焦点设置到flash控件上,可是应用了SetFocus()函数怎么也不能把焦点设置过来,焦点一直在模态对话框CTvPlayerDlg上,
为什么??
求高手帮忙。急!!!!!!!!!!!

#2


我在模态对话框的按键消息处理函数中这样写时:

BOOL CTvPlayerDlg::PreTranslateMessage(MSG* pMsg)
{
  if (pMsg->wParam == 66)
  {    
    if (m_pSearchDlg != NULL)
     { 
       delete m_pSearchDlg;
        m_pSearchDlg = NULL;
      }
     m_pSearchDlg = new CSearchDlg; 
      m_pSearchDlg->Create(IDD_DIALOG_SEARCH, NULL);
     m_pSearchDlg->inputTvDlg(this); 
    }
   return CDialog::PreTranslateMessage(pMsg);
 }
焦点就是正确的,就落在非模态对话框的空间上。真搞不懂???

#3


快来人啊,急求帮助!!!!!!!!!!!!!
!!!!!!!!!!!!!

#4


子对话框的属性中 将 style设置为child

#5


引用 4 楼 heksn 的回复:
子对话框的属性中 将 style设置为child

如何设置?

#6


引用 1 楼 happy_bluesky 的回复:
简化一点就是:
应用程序创建模态对话框CTvPlayerDlg--------
模态对换框初始化时有函数void CTvPlayerDlg::LoadProgramList()
-----------函数之中又创建了一个非模态对话框CSearchDlg---------
非模态对话框有一个CShockwaveflash控件
我想在创建非模态对话框时把焦点设置到flash控件上,可是应用了……

你要把CShockwaveflash控件
的tab order设置为1
编辑你的CSearchDlg对话框,选择菜单layout->tab order;
鼠标单击即可

#7


引用 4 楼 heksn 的回复:
子对话框的属性中 将 style设置为child

我依你说的把风格设置为child之后,CSearchDlg对话框就没有显示了,这个对话框是在
if (AfxMessageBox(L"节目列表为空,必须进行节目搜索,搜索请选择“确定”,退出请选择“取消”!",MB_OKCANCEL) == IDOK)
{
 m_pSearchDlg = new CSearchDlg; //创建了一个非模态对话框,有一个CShockwaveflash控件
m_pSearchDlg->Create(IDD_DIALOG_SEARCH, NULL);
m_pSearchDlg->inputTvDlg(this); 
}
这里创建的,点击确定之后,没有创建CSerachDlg对话框。。。。。

继续求高手指点啊。。。。。

#8


引用 6 楼 yinquan8241 的回复:
引用 1 楼 happy_bluesky 的回复:
简化一点就是:
应用程序创建模态对话框CTvPlayerDlg--------
模态对换框初始化时有函数void CTvPlayerDlg::LoadProgramList()
-----------函数之中又创建了一个非模态对话框CSearchDlg---------
非模态对话框有一个CShockwaveflash控件
我想在创建……

我CTAL+D看了,CShockwaveflash控件
的TAB order是1的。。。

#9


在线等啊,来高手指点指点啊。。。。。。。。。。

#1


简化一点就是:
应用程序创建模态对话框CTvPlayerDlg--------
模态对换框初始化时有函数void CTvPlayerDlg::LoadProgramList()
-----------函数之中又创建了一个非模态对话框CSearchDlg---------
非模态对话框有一个CShockwaveflash控件
我想在创建非模态对话框时把焦点设置到flash控件上,可是应用了SetFocus()函数怎么也不能把焦点设置过来,焦点一直在模态对话框CTvPlayerDlg上,
为什么??
求高手帮忙。急!!!!!!!!!!!

#2


我在模态对话框的按键消息处理函数中这样写时:

BOOL CTvPlayerDlg::PreTranslateMessage(MSG* pMsg)
{
  if (pMsg->wParam == 66)
  {    
    if (m_pSearchDlg != NULL)
     { 
       delete m_pSearchDlg;
        m_pSearchDlg = NULL;
      }
     m_pSearchDlg = new CSearchDlg; 
      m_pSearchDlg->Create(IDD_DIALOG_SEARCH, NULL);
     m_pSearchDlg->inputTvDlg(this); 
    }
   return CDialog::PreTranslateMessage(pMsg);
 }
焦点就是正确的,就落在非模态对话框的空间上。真搞不懂???

#3


快来人啊,急求帮助!!!!!!!!!!!!!
!!!!!!!!!!!!!

#4


子对话框的属性中 将 style设置为child

#5


引用 4 楼 heksn 的回复:
子对话框的属性中 将 style设置为child

如何设置?

#6


引用 1 楼 happy_bluesky 的回复:
简化一点就是:
应用程序创建模态对话框CTvPlayerDlg--------
模态对换框初始化时有函数void CTvPlayerDlg::LoadProgramList()
-----------函数之中又创建了一个非模态对话框CSearchDlg---------
非模态对话框有一个CShockwaveflash控件
我想在创建非模态对话框时把焦点设置到flash控件上,可是应用了……

你要把CShockwaveflash控件
的tab order设置为1
编辑你的CSearchDlg对话框,选择菜单layout->tab order;
鼠标单击即可

#7


引用 4 楼 heksn 的回复:
子对话框的属性中 将 style设置为child

我依你说的把风格设置为child之后,CSearchDlg对话框就没有显示了,这个对话框是在
if (AfxMessageBox(L"节目列表为空,必须进行节目搜索,搜索请选择“确定”,退出请选择“取消”!",MB_OKCANCEL) == IDOK)
{
 m_pSearchDlg = new CSearchDlg; //创建了一个非模态对话框,有一个CShockwaveflash控件
m_pSearchDlg->Create(IDD_DIALOG_SEARCH, NULL);
m_pSearchDlg->inputTvDlg(this); 
}
这里创建的,点击确定之后,没有创建CSerachDlg对话框。。。。。

继续求高手指点啊。。。。。

#8


引用 6 楼 yinquan8241 的回复:
引用 1 楼 happy_bluesky 的回复:
简化一点就是:
应用程序创建模态对话框CTvPlayerDlg--------
模态对换框初始化时有函数void CTvPlayerDlg::LoadProgramList()
-----------函数之中又创建了一个非模态对话框CSearchDlg---------
非模态对话框有一个CShockwaveflash控件
我想在创建……

我CTAL+D看了,CShockwaveflash控件
的TAB order是1的。。。

#9


在线等啊,来高手指点指点啊。。。。。。。。。。