无模式窗口怎么激活呢。

chinarendotcom 2004-12-08 12:00:31
一个maindlg中加了一个成员m_dlg;
maindlg.oninidlg()
{
'''
m_Dlg.Create(CLogDlg::IDD, this);
m_Dlg.ShowWindow(TRUE);
..
}

这样,但是我想使弹出的logon窗口,处于激活状态,怎么实现。??
这个程序:就是一个登陆的界面,现在要求登陆弹出时,处于激活。但是他是个非模式窗口。??
...全文
302 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
qrlvls 2004-12-08
  • 打赏
  • 举报
回复
你也可以使用CDialogBar来处理
chinarendotcom 2004-12-08
  • 打赏
  • 举报
回复
aoosang(智慧的鱼) 还是你明白。呵呵分不会少的。
现在我就在做第二种的方法。没有解决。
kyh1234567 2004-12-08
  • 打赏
  • 举报
回复
UP
aoosang 2004-12-08
  • 打赏
  • 举报
回复
是你的登录对话框建错位置,两种方案,第一就像楼上所说,在app的InitInstance()添加登陆对话框的代码,如下
在BOOL CXXXApp::InitInstance()
{
.....
m_Dlg.Create(CChildTestDlg::IDD, this);
m_Dlg.ShowWindow(SW_SHOW);
//m_Dlg.SetFocus();
....
}
此时主对话框还没有创建,只有登陆对话框出现.
第二种,就是在你的主对话框的OnInitDialog()函数中,不过此时要采用模式对话框,
因为你在OnInitDialog()中如果采用非模式对话框,就是SetFocus()也没有用的,因为此时主对话框的OnInitDialog()函数还要继续运行,等到主对话框对象建立以后,焦点自然在主对话框上了,如果想用非模式,那就想办法等你的主对话框建立以后再将你m_dlg 对象SetFocus()。
在给你做demo,非模式对话框,如果试验成功,再告诉你怎么做
koko1998 2004-12-08
  • 打赏
  • 举报
回复
在BOOL CXXXApp::InitInstance()
{
.....
m_Dlg.Create(CChildTestDlg::IDD, this);
m_Dlg.ShowWindow(SW_SHOW);
//m_Dlg.SetFocus();
....
}
老夏Max 2004-12-08
  • 打赏
  • 举报
回复
如果可以的话,可以将程序发到:xia_qingqi@broadxent.com.cn
我帮你看看!注明帖子的URL!
hyamw 2004-12-08
  • 打赏
  • 举报
回复
如果觉得不好理解,就这样:
//CChildTestDlg.cpp
//OnActivate函数里面改成这样:
if (nState == WA_ACTIVE)
{
m_nCount ++;
if (m_nCount == 3)
{
m_bLog = TRUE;
}
}
hyamw 2004-12-08
  • 打赏
  • 举报
回复
嘿嘿,我刚才测试了一下确实不行,接收不到WM_SYSCOMMAND消息,不过用另外一种方法解决了:
在登陆窗口的OnActive()响应消息里面添加如下:
//CChildTestDlg.cpp
m_nCount ++;//这是一个计数器
if (m_nCount == 5)
{
m_bLog = TRUE;
}
CDialog::OnActivate(nState, pWndOther, bMinimized);
然后主窗口里面的OnActivate()不用改,就用原来的

if (!m_Dlg.m_bLog)
{
::SetActiveWindow(m_Dlg.m_hWnd);
}
else
CDialog::OnActivate(nState, pWndOther, bMinimized);
chinarendotcom 2004-12-08
  • 打赏
  • 举报
回复
还是不行,有个问题,就是主对话框,必须激活,你没有激活,直接点击最小化没有用。
chinarendotcom 2004-12-08
  • 打赏
  • 举报
回复
问题已经解决。 用aoosang(智慧的鱼) 的方法。
还有一种方法就是可以加一个定时器,在定时器中中创建登陆dlg,显示出来。
hyamw 2004-12-08
  • 打赏
  • 举报
回复
那就这样:
if (!m_Dlg.m_bLog && nState != WA_CLICKACTIVE)
::SetActiveWindow(m_Dlg.m_hWnd);
else
CDialog::OnActivate(nState, pWndOther, bMinimized);
kaste 2004-12-08
  • 打赏
  • 举报
回复
CDialog *m_dialog=new CDialog;
ASSERT_VALID(m_dialog);
BOOL bResult=m_dialog->Create(ID_DILOAG1);
ASSERT(bResult);

m_dialog->ShowWindow(SW_SHOW);

chinarendotcom 2004-12-08
  • 打赏
  • 举报
回复
如果按照hyamw(林锋)的方法,在登录的时候,如果用户没有登录,用户是没有办法点击主对话框中的最小化按钮的。是不是。不太好呀。
hyamw 2004-12-08
  • 打赏
  • 举报
回复
补充一下,m_bLog标志需要你处理登陆对话框被关闭的消息,也就是说应该让主对话框的得到焦点的时候,设置该标志。初始化状态是false;
hyamw 2004-12-08
  • 打赏
  • 举报
回复
在OnInitDialog()里面添加:
m_Dlg.Create(CChildTestDlg::IDD, this);
m_Dlg.ShowWindow(SW_SHOW);
然后再消息映射里添加:
ON_WM_ACTIVATE()

接着重载OnActivate函数,添加:
if (!m_Dlg.m_bLog)
::SetActiveWindow(m_Dlg.m_hWnd);
else
CDialog::OnActivate(nState, pWndOther, bMinimized);

mDlg.m_bLog是一个登陆对话框被关闭的标志。
我测试过的
chinarendotcom 2004-12-08
  • 打赏
  • 举报
回复
那我就是想在启动的时候,出现login对话框,是得到焦点的地方,那写在主对话框的哪里呢???
chinarendotcom 2004-12-08
  • 打赏
  • 举报
回复
m_Dlg.Create(CLogDlg::IDD, this);
m_Dlg.ShowWindow(TRUE);
m_Dlg.SetFocus();
不行。
不要想当然,各位。做个试验呀。
张佩 2004-12-08
  • 打赏
  • 举报
回复
不是在OnInitDialog里面啦,在你外面的调用语句里。
张佩 2004-12-08
  • 打赏
  • 举报
回复
m_Dlg.Create(CLogDlg::IDD, this);
m_Dlg.ShowWindow(TRUE);
m_Dlg.SetFocus();
tigerjacky 2004-12-08
  • 打赏
  • 举报
回复
::SetForegroundWindow(m_hWnd);
::SetActiveWindow(m_hWnd);
::BringWindowToTop(m_hWnd);
加载更多回复(12)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧