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

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。问题搞定。

你可能感兴趣的:(MFC)