对话框位置算是windows的bug吗?

combobox2013 2013-11-22 10:56:20
对话框位置算是windows的bug吗?


对话框做成托盘问题:

OnInitDialog里采用shell_notify将程序做成托盘。

紧接着setwindowplacement(&wp);(wp是一个临时WINDOWPLACEMENT),

采用这种方式隐藏界面,即:

windowplacement wp;
wp.length = ;
wp.flags = WPF_RESTORETOMAXIMIZED;
wp.showcmd = sw_hide;
setwindowplacement(&wp);




当用户双击托盘的时候:

case WM_LBUTTONDBLCLK://双击左键的处理
{
m_wpWindowPlacement.flags=WPF_RESTORETOMAXIMIZED;
m_wpWindowPlacement.showCmd=SW_SHOW;
SetWindowPlacement(&m_wpWindowPlacement);
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
}

这是后,我发现一个奇怪的bug:

对话框显示在屏幕上的绝对坐标不对,居然是(0,0)。

按道理说:
对话框的位置应该居中才对。 这位置到底是谁决定? 是windows随机决定的吗?


...全文
226 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrace 2013-11-23
  • 打赏
  • 举报
回复
你是MFC的话,对话框窗口出来以后会自动调用 CenterWindow;
bsnry 2013-11-23
  • 打赏
  • 举报
回复
引用 13 楼 gfm688 的回复:
[quote=引用 12 楼 bsnry 的回复:] 既然谈到位置, 也说说遇到的一个奇怪问题: 在onintdialog 里使用movewindow所遇到的,movewindow(0,0,, 这样,对话框并不会移动到屏幕的0,0处。 但是 你只要 movewindow到其他地方,绝对会移过去。 这非常奇怪。 为此,我手痒,就将movewindow改成setwindowpos试试,结果setwindowpos 0,0成功了。 不知道我表达清楚没 movewindow(0,0..)这个用法 似乎不管用的 msdn没有给出说明
MFC的问题吧,估计MFC在调用onintdialog之后会调用CenterWindow 你可以用SDK的方法试试,看看在WM_INITDIALOG MoveWindow管不管用[/quote] 是的, 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; }
gfm688 2013-11-23
  • 打赏
  • 举报
回复
引用 12 楼 bsnry 的回复:
既然谈到位置, 也说说遇到的一个奇怪问题: 在onintdialog 里使用movewindow所遇到的,movewindow(0,0,, 这样,对话框并不会移动到屏幕的0,0处。 但是 你只要 movewindow到其他地方,绝对会移过去。 这非常奇怪。 为此,我手痒,就将movewindow改成setwindowpos试试,结果setwindowpos 0,0成功了。 不知道我表达清楚没 movewindow(0,0..)这个用法 似乎不管用的 msdn没有给出说明
MFC的问题吧,估计MFC在调用onintdialog之后会调用CenterWindow 你可以用SDK的方法试试,看看在WM_INITDIALOG MoveWindow管不管用
bsnry 2013-11-23
  • 打赏
  • 举报
回复
引用 7 楼 combobox2013 的回复:
[quote=引用 6 楼 combobox2013 的回复:] [quote=引用 5 楼 xuddk727 的回复:] [quote=引用 3 楼 combobox2013 的回复:] [quote=引用 1 楼 schlafenhamster 的回复:] 是 :"SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);" 这句 ?
引用 2 楼 lt114896 的回复:
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); ??
我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊, 不是有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); 这里用到 [/quote] 对话框本身位置由资源里面设定值决定,而且我怀疑它创建的方式很可能是在(0,0)创建然后移动到指定位置而已,所以这没什么好奇怪的吧[/quote] 你这么一说,我特意看了资源,发现所有对话框都有相应的参数,确实有起始坐标x,y,而且默认都是(0,0). 但是对话框工程运行后,对话框是在中间位置,说明windows强行将对话框移动到中间位置的. 以上不是本贴重点. 下面讨论本贴遇到的问题: 本帖里的对话框的属性xpos,ypos的值都是0,0,按照 上面的说法,windows 也会强制移动到中间位置。 事实上,本帖对话框的位置并非如此。 而且 可以确定的是:对话框出现在0,0,绝对不会是我提供的代码setwindowpos导致的。 而是 :由于使用了 windowplacement进行隐藏界面,windows此时没有按照常规去强行移动到中间位置。 这恐怕是真实的原因。 在这个项目里,我还遇到另一个小问题: 我对托盘进行右键,然后右键后弹出一个pop up菜单,这个菜单只有过一个功能,就是关闭程序。 我的问题是,有时候,菜单弹不出来, 有时候能弹出来,很是郁闷。 getcursorpos, trackpopupmenu [/quote] 既然谈到位置, 也说说遇到的一个奇怪问题: 在onintdialog 里使用movewindow所遇到的,movewindow(0,0,, 这样,对话框并不会移动到屏幕的0,0处。 但是 你只要 movewindow到其他地方,绝对会移过去。 这非常奇怪。 为此,我手痒,就将movewindow改成setwindowpos试试,结果setwindowpos 0,0成功了。 不知道我表达清楚没 [/quote] movewindow(0,0..)这个用法 似乎不管用的 msdn没有给出说明
combobox2013 2013-11-23
  • 打赏
  • 举报
回复
引用 10 楼 gfm688 的回复:
你的m_wpWindowPlacement的rcNormalPosition有没有初始化? 隐藏界面前先GetWindowPlacement吧
发完整代码给你吧。 我肯定先 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. 则对话框出现在屏幕的中间位置. 这几个例子, 足以证明,操作系统其实对对话框的位置会按照一定的规则去调整的。
schlafenhamster 2013-11-22
  • 打赏
  • 举报
回复
试试 : CenterWindow
combobox2013 2013-11-22
  • 打赏
  • 举报
回复
引用 6 楼 combobox2013 的回复:
[quote=引用 5 楼 xuddk727 的回复:] [quote=引用 3 楼 combobox2013 的回复:] [quote=引用 1 楼 schlafenhamster 的回复:] 是 :"SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);" 这句 ?
引用 2 楼 lt114896 的回复:
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); ??
我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊, 不是有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); 这里用到 [/quote] 对话框本身位置由资源里面设定值决定,而且我怀疑它创建的方式很可能是在(0,0)创建然后移动到指定位置而已,所以这没什么好奇怪的吧[/quote] 你这么一说,我特意看了资源,发现所有对话框都有相应的参数,确实有起始坐标x,y,而且默认都是(0,0). 但是对话框工程运行后,对话框是在中间位置,说明windows强行将对话框移动到中间位置的. 以上不是本贴重点. 下面讨论本贴遇到的问题: 本帖里的对话框的属性xpos,ypos的值都是0,0,按照 上面的说法,windows 也会强制移动到中间位置。 事实上,本帖对话框的位置并非如此。 而且 可以确定的是:对话框出现在0,0,绝对不会是我提供的代码setwindowpos导致的。 而是 :由于使用了 windowplacement进行隐藏界面,windows此时没有按照常规去强行移动到中间位置。 这恐怕是真实的原因。 在这个项目里,我还遇到另一个小问题: 我对托盘进行右键,然后右键后弹出一个pop up菜单,这个菜单只有过一个功能,就是关闭程序。 我的问题是,有时候,菜单弹不出来, 有时候能弹出来,很是郁闷。 getcursorpos, trackpopupmenu [/quote] 既然谈到位置, 也说说遇到的一个奇怪问题: 在onintdialog 里使用movewindow所遇到的,movewindow(0,0,, 这样,对话框并不会移动到屏幕的0,0处。 但是 你只要 movewindow到其他地方,绝对会移过去。 这非常奇怪。 为此,我手痒,就将movewindow改成setwindowpos试试,结果setwindowpos 0,0成功了。 不知道我表达清楚没
combobox2013 2013-11-22
  • 打赏
  • 举报
回复
引用 5 楼 xuddk727 的回复:
[quote=引用 3 楼 combobox2013 的回复:] [quote=引用 1 楼 schlafenhamster 的回复:] 是 :"SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);" 这句 ?
引用 2 楼 lt114896 的回复:
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); ??
我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊, 不是有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); 这里用到 [/quote] 对话框本身位置由资源里面设定值决定,而且我怀疑它创建的方式很可能是在(0,0)创建然后移动到指定位置而已,所以这没什么好奇怪的吧[/quote] 你这么一说,我特意看了资源,发现所有对话框都有相应的参数,确实有起始坐标x,y,而且默认都是(0,0). 但是对话框工程运行后,对话框是在中间位置,说明windows强行将对话框移动到中间位置的. 以上不是本贴重点. 下面讨论本贴遇到的问题: 本帖里的对话框的属性xpos,ypos的值都是0,0,按照 上面的说法,windows 也会强制移动到中间位置。 事实上,本帖对话框的位置并非如此。 而且 可以确定的是:对话框出现在0,0,绝对不会是我提供的代码setwindowpos导致的。 而是 :由于使用了 windowplacement进行隐藏界面,windows此时没有按照常规去强行移动到中间位置。 这恐怕是真实的原因。 在这个项目里,我还遇到另一个小问题: 我对托盘进行右键,然后右键后弹出一个pop up菜单,这个菜单只有过一个功能,就是关闭程序。 我的问题是,有时候,菜单弹不出来, 有时候能弹出来,很是郁闷。 getcursorpos, trackpopupmenu
许文君 2013-11-22
  • 打赏
  • 举报
回复
引用 3 楼 combobox2013 的回复:
[quote=引用 1 楼 schlafenhamster 的回复:] 是 :"SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);" 这句 ?
引用 2 楼 lt114896 的回复:
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); ??
我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊, 不是有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); 这里用到 [/quote] 对话框本身位置由资源里面设定值决定,而且我怀疑它创建的方式很可能是在(0,0)创建然后移动到指定位置而已,所以这没什么好奇怪的吧
许文君 2013-11-22
  • 打赏
  • 举报
回复
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); 你只是指定了不移动而已,windows本身就是在0,0位置创建的。
combobox2013 2013-11-22
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
是 :"SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);" 这句 ?
引用 2 楼 lt114896 的回复:
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); ??
我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊, 不是有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); 这里用到
lt114896 2013-11-22
  • 打赏
  • 举报
回复
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); ??
schlafenhamster 2013-11-22
  • 打赏
  • 举报
回复
是 :"SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);" 这句 ?
gfm688 2013-11-22
  • 打赏
  • 举报
回复
你的m_wpWindowPlacement的rcNormalPosition有没有初始化? 隐藏界面前先GetWindowPlacement吧
combobox2013 2013-11-22
  • 打赏
  • 举报
回复
引用 7 楼 combobox2013 的回复:
[quote=引用 6 楼 combobox2013 的回复:] [quote=引用 5 楼 xuddk727 的回复:] [quote=引用 3 楼 combobox2013 的回复:] [quote=引用 1 楼 schlafenhamster 的回复:] 是 :"SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);" 这句 ?
引用 2 楼 lt114896 的回复:
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); ??
我就知道 会猜测是这一句有问题,很明显跟这一句没有关系啊, 不是有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); 这里用到 [/quote] 对话框本身位置由资源里面设定值决定,而且我怀疑它创建的方式很可能是在(0,0)创建然后移动到指定位置而已,所以这没什么好奇怪的吧[/quote] 你这么一说,我特意看了资源,发现所有对话框都有相应的参数,确实有起始坐标x,y,而且默认都是(0,0). 但是对话框工程运行后,对话框是在中间位置,说明windows强行将对话框移动到中间位置的. 以上不是本贴重点. 下面讨论本贴遇到的问题: 本帖里的对话框的属性xpos,ypos的值都是0,0,按照 上面的说法,windows 也会强制移动到中间位置。 事实上,本帖对话框的位置并非如此。 而且 可以确定的是:对话框出现在0,0,绝对不会是我提供的代码setwindowpos导致的。 而是 :由于使用了 windowplacement进行隐藏界面,windows此时没有按照常规去强行移动到中间位置。 这恐怕是真实的原因。 在这个项目里,我还遇到另一个小问题: 我对托盘进行右键,然后右键后弹出一个pop up菜单,这个菜单只有过一个功能,就是关闭程序。 我的问题是,有时候,菜单弹不出来, 有时候能弹出来,很是郁闷。 getcursorpos, trackpopupmenu [/quote] 既然谈到位置, 也说说遇到的一个奇怪问题: 在onintdialog 里使用movewindow所遇到的,movewindow(0,0,, 这样,对话框并不会移动到屏幕的0,0处。 但是 你只要 movewindow到其他地方,绝对会移过去。 这非常奇怪。 为此,我手痒,就将movewindow改成setwindowpos试试,结果setwindowpos 0,0成功了。 不知道我表达清楚没 [/quote] 顶起来, 这个问题是什么原因导致的 是windows对movewindow免疫了嘛?

16,548

社区成员

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

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

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