打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
如何设置应用程序窗口的初始大小和位置
userphoto

2017.04.27

关注
http://blog.csdn.net/xdsoft365/article/details/6017173
2007年05月14日 星期一 下午 09:50
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。问题搞定。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
总结:VC小知识!
VC++之随父窗口变化调整控件大小
VC++更改对话框背景色和字体颜色
VC的内存绘图防止屏幕闪烁技术的实现
vc视频采集代码
CStatic控件的基本使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服