是 :"SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);"
这句 ?

解决方案 »

  1.   

    SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
    ??
      

  2.   

    我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊,不是有SWP_NOSIZE ,SWP_NOMOVE吗? 会忽略 cx,cy,x, y这4个参数比如我改成 SetWindowPos(&wndTopMost,100,100,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
    这样,对话框的位置也并不会 出现(100,100)啊。所以我才奇怪,对话框的位置到底是根据什么决定的。为什么对话框的位置无故出现在(0,0)对整个工程搜索:movewindow, setwindowpos,这2个移动位置的函数,代码里并不存在movewindow ,而setwindowpos只有一个地方用到,就是:
    SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); 这里用到

      

  3.   

    SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
    你只是指定了不移动而已,windows本身就是在0,0位置创建的。
      

  4.   

    我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊,不是有SWP_NOSIZE ,SWP_NOMOVE吗? 会忽略 cx,cy,x, y这4个参数比如我改成 SetWindowPos(&wndTopMost,100,100,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
    这样,对话框的位置也并不会 出现(100,100)啊。所以我才奇怪,对话框的位置到底是根据什么决定的。为什么对话框的位置无故出现在(0,0)对整个工程搜索:movewindow, setwindowpos,这2个移动位置的函数,代码里并不存在movewindow ,而setwindowpos只有一个地方用到,就是:
    SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); 这里用到


    对话框本身位置由资源里面设定值决定,而且我怀疑它创建的方式很可能是在(0,0)创建然后移动到指定位置而已,所以这没什么好奇怪的吧
      

  5.   

    我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊,不是有SWP_NOSIZE ,SWP_NOMOVE吗? 会忽略 cx,cy,x, y这4个参数比如我改成 SetWindowPos(&wndTopMost,100,100,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
    这样,对话框的位置也并不会 出现(100,100)啊。所以我才奇怪,对话框的位置到底是根据什么决定的。为什么对话框的位置无故出现在(0,0)对整个工程搜索:movewindow, setwindowpos,这2个移动位置的函数,代码里并不存在movewindow ,而setwindowpos只有一个地方用到,就是:
    SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); 这里用到


    对话框本身位置由资源里面设定值决定,而且我怀疑它创建的方式很可能是在(0,0)创建然后移动到指定位置而已,所以这没什么好奇怪的吧
    你这么一说,我特意看了资源,发现所有对话框都有相应的参数,确实有起始坐标x,y,而且默认都是(0,0).但是对话框工程运行后,对话框是在中间位置,说明windows强行将对话框移动到中间位置的.以上不是本贴重点.
    下面讨论本贴遇到的问题:本帖里的对话框的属性xpos,ypos的值都是0,0,按照 上面的说法,windows 也会强制移动到中间位置。事实上,本帖对话框的位置并非如此。而且 可以确定的是:对话框出现在0,0,绝对不会是我提供的代码setwindowpos导致的。而是 :由于使用了 windowplacement进行隐藏界面,windows此时没有按照常规去强行移动到中间位置。
    这恐怕是真实的原因。
    在这个项目里,我还遇到另一个小问题:我对托盘进行右键,然后右键后弹出一个pop up菜单,这个菜单只有过一个功能,就是关闭程序。我的问题是,有时候,菜单弹不出来, 有时候能弹出来,很是郁闷。getcursorpos, trackpopupmenu
      

  6.   

    我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊,不是有SWP_NOSIZE ,SWP_NOMOVE吗? 会忽略 cx,cy,x, y这4个参数比如我改成 SetWindowPos(&wndTopMost,100,100,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
    这样,对话框的位置也并不会 出现(100,100)啊。所以我才奇怪,对话框的位置到底是根据什么决定的。为什么对话框的位置无故出现在(0,0)对整个工程搜索:movewindow, setwindowpos,这2个移动位置的函数,代码里并不存在movewindow ,而setwindowpos只有一个地方用到,就是:
    SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); 这里用到


    对话框本身位置由资源里面设定值决定,而且我怀疑它创建的方式很可能是在(0,0)创建然后移动到指定位置而已,所以这没什么好奇怪的吧
    你这么一说,我特意看了资源,发现所有对话框都有相应的参数,确实有起始坐标x,y,而且默认都是(0,0).但是对话框工程运行后,对话框是在中间位置,说明windows强行将对话框移动到中间位置的.以上不是本贴重点.
    下面讨论本贴遇到的问题:本帖里的对话框的属性xpos,ypos的值都是0,0,按照 上面的说法,windows 也会强制移动到中间位置。事实上,本帖对话框的位置并非如此。而且 可以确定的是:对话框出现在0,0,绝对不会是我提供的代码setwindowpos导致的。而是 :由于使用了 windowplacement进行隐藏界面,windows此时没有按照常规去强行移动到中间位置。
    这恐怕是真实的原因。
    在这个项目里,我还遇到另一个小问题:我对托盘进行右键,然后右键后弹出一个pop up菜单,这个菜单只有过一个功能,就是关闭程序。我的问题是,有时候,菜单弹不出来, 有时候能弹出来,很是郁闷。getcursorpos, trackpopupmenu
    既然谈到位置, 也说说遇到的一个奇怪问题:在onintdialog 里使用movewindow所遇到的,movewindow(0,0,, 这样,对话框并不会移动到屏幕的0,0处。但是 你只要 movewindow到其他地方,绝对会移过去。 这非常奇怪。为此,我手痒,就将movewindow改成setwindowpos试试,结果setwindowpos 0,0成功了。不知道我表达清楚没
      

  7.   

    你的m_wpWindowPlacement的rcNormalPosition有没有初始化?
    隐藏界面前先GetWindowPlacement吧
      

  8.   


    发完整代码给你吧。 我肯定先 getwindwowplacement 了啊 NOTIFYICONDATA nid;
    nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
    nid.hWnd=this->m_hWnd;
    nid.uID=IDR_MAINFRAME;
    nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
    nid.uCallbackMessage= WM_SHOWTASK;//自定义的消息名称
    nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
    strcpy(nid.szTip,"Test");
    Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标 GetWindowPlacement(&m_wpWindowPlacement); //恢复时用
    ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);//从任务栏中去掉 WINDOWPLACEMENT wp;
    wp.length=sizeof(WINDOWPLACEMENT);
    wp.flags=WPF_RESTORETOMAXIMIZED;
    wp.showCmd=SW_HIDE;
    SetWindowPlacement(&wp);
    另一段代码:m_wpWindowPlacement.flags=WPF_RESTORETOMAXIMIZED; 
    m_wpWindowPlacement.showCmd=SW_SHOW; 
    SetWindowPlacement(&m_wpWindowPlacement); 
    SetWindowPos(&wndTopMost,100,100,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
    有兴趣的朋友可以自己 验证这代码,代码来自网上,窗口的位置是出现在 (0,0)原因 我已经在 6楼解释过了.其实对话框工程也好,还是 某些情况下创建对话框,  系统很可能 会强制移动你的对话框的位置。恰好在 托盘隐藏的方式,系统没有强制,所以对话框的位置在(0,0)
    本帖里的对话框的属性xpos,ypos的值都是0,0,按照 上面的说法,windows 也会强制移动到中间位置。事实上,本帖对话框的位置并非如此。而且 可以确定的是:对话框出现在0,0,绝对不会是我提供的代码setwindowpos导致的。而是 :由于使用了 windowplacement进行隐藏界面,windows此时没有按照常规去强行移动到中间位置。
    这恐怕是真实的原因。
    我再说一个特例:是非模式对话框的例子(单文档工程)里探出一个非模式对话框,该对话框的位置会出现在 父窗口的(0,0), 代码为:
    CMainFrame::OnCreate里的
    if(m_pDlg)
    {
    m_pDlg->Create(IDD_DIALOG1,this);
    m_pDlg->ShowWindow(SW_SHOW);
    }而如果我们把this改成 NULL. 则对话框出现在屏幕的中间位置.这几个例子, 足以证明,操作系统其实对对话框的位置会按照一定的规则去调整的。
      

  9.   

    我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊,不是有SWP_NOSIZE ,SWP_NOMOVE吗? 会忽略 cx,cy,x, y这4个参数比如我改成 SetWindowPos(&wndTopMost,100,100,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
    这样,对话框的位置也并不会 出现(100,100)啊。所以我才奇怪,对话框的位置到底是根据什么决定的。为什么对话框的位置无故出现在(0,0)对整个工程搜索:movewindow, setwindowpos,这2个移动位置的函数,代码里并不存在movewindow ,而setwindowpos只有一个地方用到,就是:
    SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); 这里用到


    对话框本身位置由资源里面设定值决定,而且我怀疑它创建的方式很可能是在(0,0)创建然后移动到指定位置而已,所以这没什么好奇怪的吧
    你这么一说,我特意看了资源,发现所有对话框都有相应的参数,确实有起始坐标x,y,而且默认都是(0,0).但是对话框工程运行后,对话框是在中间位置,说明windows强行将对话框移动到中间位置的.以上不是本贴重点.
    下面讨论本贴遇到的问题:本帖里的对话框的属性xpos,ypos的值都是0,0,按照 上面的说法,windows 也会强制移动到中间位置。事实上,本帖对话框的位置并非如此。而且 可以确定的是:对话框出现在0,0,绝对不会是我提供的代码setwindowpos导致的。而是 :由于使用了 windowplacement进行隐藏界面,windows此时没有按照常规去强行移动到中间位置。
    这恐怕是真实的原因。
    在这个项目里,我还遇到另一个小问题:我对托盘进行右键,然后右键后弹出一个pop up菜单,这个菜单只有过一个功能,就是关闭程序。我的问题是,有时候,菜单弹不出来, 有时候能弹出来,很是郁闷。getcursorpos, trackpopupmenu
    既然谈到位置, 也说说遇到的一个奇怪问题:在onintdialog 里使用movewindow所遇到的,movewindow(0,0,, 这样,对话框并不会移动到屏幕的0,0处。但是 你只要 movewindow到其他地方,绝对会移过去。 这非常奇怪。为此,我手痒,就将movewindow改成setwindowpos试试,结果setwindowpos 0,0成功了。不知道我表达清楚没movewindow(0,0..)这个用法        似乎不管用的 msdn没有给出说明
      

  10.   


    MFC的问题吧,估计MFC在调用onintdialog之后会调用CenterWindow
    你可以用SDK的方法试试,看看在WM_INITDIALOG MoveWindow管不管用
      

  11.   


    MFC的问题吧,估计MFC在调用onintdialog之后会调用CenterWindow
    你可以用SDK的方法试试,看看在WM_INITDIALOG MoveWindow管不管用是的,  sdk成功了INT_PTR CALLBACK MainDlg(HWND hdlg,UINT message ,WPARAM wp,LPARAM lp)
    {
    switch(message)
    {
    case WM_INITDIALOG:
    MoveWindow(hdlg,50,0,700,800,TRUE);
    return 1;
    break;
    case WM_CLOSE:
    EndDialog(hdlg,0);
    return 1;
    break;
    }
    return 0;
    }
      

  12.   

    你是MFC的话,对话框窗口出来以后会自动调用 CenterWindow;