我用CWinthread + CWnd做了个启动窗口,用于显示动画,sleep()一段时间后,结束该窗口线程,再显示主窗口,程序加在CXXApp的初始化函数中,但是显示的主窗口不直接显示出来,每次都得在任务栏点一下才能显示出来,怎么才能解决这个问题呢?意思是窗口线程退出后不能激活后续创建的主窗口,每次都是显示程序启动前的最后一个活动窗口

解决方案 »

  1.   

    CDialog::OnCancel() 关掉当前窗口  你可以在这句后面写你想激活的窗口
      

  2.   

    可以先来个最小化,然后立即Restore,然后窗口就肯定激活了。
      

  3.   

    说说我的观点,我也经常在程序启动时显示一个欢迎窗口,我的做法是直接从CDialog派生一个类,在CWinApp派生类的OnInitInstance函数中主对话框建立之前先DoModal我的欢迎窗口,这样不会出现楼主所说的问题。
    楼主说的问题我猜想是用到了多线程,这里不再说是否的合适的问题了。
    我不知道你的欢迎窗口到底是在哪儿结束的?结束以后到底干了什么?
    我给你一个解决办法:当你的欢迎窗口结束以后,使用下面的代码强制将你的主窗口放在最前面。如下:
    UINT nCmdShow = SW_SHOW;
    if (!IsWindowVisible())
    nCmdShow = SW_SHOW;
    else if (IsIconic())
    nCmdShow = SW_RESTORE;
    ShowWindow(nCmdShow);
    SetForegroundWindow(); //如果只是在任务栏上闪烁,则使用暴力手段把你的程序切换到前台.
    if(GetForegroundWindow()!=this)   
    {
    CRect rc;
    GetWindowRect( rc );
    //先切换到最前面   
    SetWindowPos(&wndTopMost ,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
    //模拟鼠标单击标题栏获得焦点   
    mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN,rc.left+1,rc.top+1,0,0);
    Sleep(1);
    mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP,rc.left+1,rc.top+1,0,0);
    //取消TOPMOST属性   
    SetWindowPos(&wndNoTopMost ,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
    //再次切换到前面   
    SetForegroundWindow();   
    }