16,472
社区成员
发帖
与我相关
我的任务
分享
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;
}
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. 则对话框出现在屏幕的中间位置.
这几个例子, 足以证明,操作系统其实对对话框的位置会按照一定的规则去调整的。