如何设置应用程序窗口的初始大小和位置
来源:互联网 发布:mackeeper mac破解版 编辑:程序博客网 时间:2024/04/28 01:00
1.对于SDI与MDI,重写窗口的 PreCreateWindow函数即可。
参考:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_changing_the_styles_of_a_window_created_by_mfc.asp
2.可是对于基于对话框的MFC应用程序,这就不行了。
原因:一般的窗口的创建是使用Create函数,这个函数在创建窗口之前调用了PreCreateWindow函数,并且允许在创建创建之前在 PreCreateWindow注册一个拥有自定义窗口样式的新的窗口类,来创建一个拥有自定义类名新的窗口。而模式对话框是通过 CreateDialogIndirect来创建的,在这当中并没有调用PreCreateWindow函数,重载的PreCreateWindow函数根本就不被执行,因此在这个函数里修改对话框的窗口类是没有用的。
解决方法:
在CXXXDlg::OnInitDialog()中,添加下列2者之一均可。
------------------------------------------------------------------------------
CRect rect;
rect.left=0;
rect.top=0;
rect.right=200;
rect.bottom=100;
MoveWindow(&rect);
------------------------------------------------------------------------------
SetWindowPos(&wndTopMost,0,0,200,100,SWP_NOMOVE);
------------------------------------------------------------------------------
3.可是用了以上方法,你会突然发现,为什么窗口没去(0,0)的左上角,而呆在中央呢?
还是来看看MFC的源码吧。
AfxWndProc() -> AfxCallWndProc()
------------------------------------------------------------------------------
……
if (nMsg == WM_INITDIALOG)
_AfxPreInitDialog(pWnd, &rectOld, &dwStyle);
// delegate to object's WindowProc
lResult = pWnd->WindowProc(nMsg, wParam, lParam);
// more special case for WM_INITDIALOG
if (nMsg == WM_INITDIALOG)
_AfxPostInitDialog(pWnd, rectOld, dwStyle);
……
------------------------------------------------------------------------------
从这里可以看到,在调用OnInitDialog()之后,紧接着调用了_AfxPostInitDialog()。我们再去
_AfxPostInitDialog()里看看。
------------------------------------------------------------------------------
……
if (!pWnd->CheckAutoCenter())
return;
// center modal dialog boxes/message boxes
pWnd->CenterWindow();
……
------------------------------------------------------------------------------
看来如果CheckAutoCenter()的返回值为TRUE的话,就会调用CenterWindow()来让窗口居中了。
Go CheckAutoCenter()!
------------------------------------------------------------------------------
……
bResult = !(dwStyle & (DS_CENTER|DS_CENTERMOUSE|DS_ABSALIGN)) &&
x == 0 && y == 0;
……
return bResult; // TRUE if auto-center is ok
------------------------------------------------------------------------------
到此真相大白了。要想把窗口能放在(0, 0),DS_CENTER,DS_CENTERMOUSE,DS_ABSALIGN必须有一为TRUE,Center和Center Mouse显然不是我们想要的,那么把对话框的Absolute Align属性设置为TRUE。问题搞定。
- 如何设置应用程序窗口的初始大小和位置
- 3.9如何设置一个视图的初始位置和大小?
- 如何设置一个窗口的大小、位置和其他参数
- 在MFC中如何设置窗口的初始大小?
- Q设置窗口的初始大小
- 如何更改IE窗口初始大小及位置
- 改变单文档应用程序窗口的大小和位置
- mfc向导生成的 默认窗口大小和位置是如何设置的
- 设置窗口的客户区大小和位置
- unity里设置窗口大小和位置的代码
- QT_OpenGL设置窗口出事位置和大小
- 窗口位置、大小设置
- MFC 设置窗口的大小与位置
- DialogFragment如何设置大小和位置
- 改变浏览器窗口的大小和位置
- 记录窗口的位置和大小
- Qt 获取窗口的位置和大小
- MFC窗口位置和大小的获取
- 有关Windows版本的宏
- Using Eclipse to compile Android source code
- 转:MySQL 备份和恢复
- 记录窗口的位置和大小
- Bring your Android device up
- 如何设置应用程序窗口的初始大小和位置
- sql 行专列 列转行 普通行列转换
- SQL中Case的使用方法
- shell操作mysql
- Loadrunner实现AIX系统网络流量和内存监控
- C#中操作XML文件(读写改删全接触)
- 11月18日 健康情况
- ren
- Trixbox上安装sangoma pri数字卡视频教程