是不是不起作用的窗口没有WS_EX_TOPMOST风格?

解决方案 »

  1.   

    已经发现是由于窗口中有ListCtrl控件造成的(有ListCtrl的窗口置顶无效,没有的ListCtrl的有效),但是还没有找到解决办法,求高人指点!!
      

  2.   

    我刚好也做了下,主窗口中也有两个属性子窗口,子窗口里也有Listctrl,有用哦
      

  3.   

    ::SetWindowPos(m_hWnd, HWND_TOPMOST, x, y, SCREEN_WIDTH, SCREEN_HEIGHT, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE);
    这样你看它还跑不跑
      

  4.   

    用 SWP_NOSIZE|SWP_NOMOVE 的话 x, y, SCREEN_WIDTH, SCREEN_HEIGHT 四个参数就无效了。
      

  5.   

    if(m_ckTop.GetCheck())
    ::SetWindowPos(AfxGetApp()->m_pMainWnd->m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);
        else
    ::SetWindowPos(AfxGetMainWnd()->m_hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);
      

  6.   

    我测过SetWindowPos()的返回值,返回值为1,显示这个函数执行是成功的。
    可这种问题只是一个界面的问题应该不会牵涉到太多参数,跟界面相关的代码我几乎都考虑过了。
    你们没有遇到过类似问题吗?
    我同事也有遇到同样的问题,我有点怀疑是我们共用的开发包的问题了...
      

  7.   

    做了几个简单的实验:
    1、主窗口为PropertySheet,上面添加两个PropertyPage,无任何控件,在PropertySheet中用::SetWindowPos(m_hWnd, HWND_TOPMOST, x, y, WIDTH, HEIGHT, SWP_SHOWWINDOW)设置窗口位于最顶层显示,可以实现,不会被其它窗口挡住。
    2、主窗口为Dialog,上面只有一个ListCtrl控件,用::SetWindowPos(m_hWnd, HWND_TOPMOST, x, y, WIDTH, HEIGHT, SWP_SHOWWINDOW),设置窗口位于最顶层显示,可以实现,不会被其它窗口挡住。
    3、主窗口为PropertySheet,上面添加两个PropertyPage,每个PropertyPage上都只有一个ListCtrl控件,在PropertySheet中用::SetWindowPos(m_hWnd, HWND_TOPMOST, x, y, WIDTH, HEIGHT, SWP_SHOWWINDOW)设置窗口位于最顶层显示,这时就出问题了!!!一点旁边窗口,这个窗口就掉下去了!不能保持在顶层!这个算是微软的Bug吗?欢迎大家来讨论一下。
    (顺便说一下,我的工作环境是:WinXP下,用Evc编程,程序在WinCE Emulator上运行。)
      

  8.   

    to kakashi0309:不是。是要让整个窗口位于最顶层显示,之后启动其它窗口都不能挡住它。比如就像Window任务管理器窗口,始终位于其它窗口之上,直到手动关闭或最小化它。
      

  9.   

    能否解释一下“主窗口为PropertySheet” 是什么意思? 不明白
      

  10.   

    现在又发现新的问题,子窗口上面有ListCtrl控件的也存在同样问题,不能保持置顶。
    PropertySheet还可以考虑用Tab Control替代掉,但子窗口这个ListCtrl又是不得不用的。
    解决不了,无奈了......
      

  11.   

    ::SetWindowPos(m_hWnd如果m_hWnd是某个窗口(如hParent)的子窗口, 当你点击在hParent之外时TOPMOST自然无效,除非你将hParent也置为TOPMOST
      

  12.   

    主窗口当然也是置为了TOPMOST的,其它不带ListCtrl的窗口就正常,就是有ListCtrl的子窗口会出事。
      

  13.   

    应该与listctrl无关. 有可能是代码的问题.你可以用下面的方法测试一下是否可置顶HWND hTop=m_hWnd;
    HWND hParent;wbile(NULL!=(hParent=GetParent(hTop))
    {
      hTop=hParent;
    }
    ::SetWindowPos(hTop, HWND_TOPMOST, ...
      

  14.   

    我试了依然不行。
    你说不是ListCtrl控件的问题,我的证明方法很简单,去掉ListCtrl控件就能置顶了,点哪儿都不会掉下去。
    我做过试验,新工程,主对话框点按钮,弹出子对话框,只在上面加了一个ListCtrl控件,什么代码都没加,设置TOPMOST就是不行,去了ListCtrl就行了。这还不能说明问题吗?
      

  15.   

    尝试下动态创建listctrl然后把它的属性也变为WS_EX_TOPMOST尝试下
      

  16.   

    你好,我最近在smartphone上面开发一个基于对话框的程序,也遇到跟你相同的问题,界面上也必须用list控件。试了网上能搜到的各种各样的办法就是不行,不知道你解决了没有。可以麻烦你给我留言吗?谢谢!
      

  17.   

    我在使用SetWindowPos时也遇到过问题
    当时的失效原因是我在字窗体show之后调用SetWindowPos就无效
    换到show之前调用SetWindowPos就好了
      

  18.   

    我是限制一个instance,如果程序已运行就把它的窗口调到最前面。现在死活实现不了。
      

  19.   

    是listctrl问题。可以通过设置任务栏来解决的,把任务栏的属性设置成 不要在最前面和自动隐藏就可以了。不知道大家有没有办法来解决Listctrl,而不是通过设置。
      

  20.   

    呵呵,可以这么实现了。
    CWnd *pTopDlg = FindWindow(_T("HHTaskBar"),NULL);
    if (pTopDlg != NULL)
    {
    pTopDlg->ShowWindow(SW_HIDE);
    }

    不过退出的时候记得给SHOW 回来.
      

  21.   

    ::FindWindow(_T("Shell_TrayWnd"), NULL); ::ShowWindow(hWnd, SW_HIDE);