MFC单文档CFormView中初始化控件和改变控件的大小

今天在学习MFC单文档的时候,要实如今CFormView视图中初始化一些控件,而且这些控件的大小和位置都会随着视图的大小而进行改变,原本认为很容易,结果却碰到了不少问题。通过几个小时的搜集资料,终于在网上找到了一些合适的方法,如今结合网上的一些方法和我的的须要,将这些内容记录下来,供之后参考。
重写父类的虚方法OnInitialUpdate(),在这个重写函数中初始化
void CXXXView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
//下面是初始化控件
m_TabCtr.InsertItem(0, 'test1');
m_TabCtr.InsertItem(1, 'test2');
.....
}
OnInitialUpdate()这个函数的功能相似于OnInitialDialog(),都是在窗口完成了建立后才被系统调用的,所以通常都是用来初始化一些控件信息的。( 关于OnInitialUpdate 被调用两次问题,请参考http://blog.csdn.net/promotercx/article/details/7572662)
改变控件的大小和位置
在CXXXView类中添加WM_SIZE 消息响应函数
void CXXXView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if (IsWindowVisible()) //若是视图窗口可视,那么表示该窗口已经建立初始化好了,这样就能够对其余的控件进行操做,不然将会由于没有建立其余控件而崩溃
{
CRect rc;
GetClientRect(&rc);
m_TabCtrl.MoveWindow(0, 0, rc.Width(), rc.Height());
}
}
*********************************************************************************************************

OnInitialUpdate  这个函数在MSDN中讲到,Override this function to框架

perform any One-Time initialization that requires information aboutide

the document.d函数

OnInitialUpdate  OnInitialDialog
二者性质差很少。
都是用于初始化界面的,由框架调用。
前者是在View即将显示时调用,后者则是在dialog即将显示时调用.
学习

可是在以前作的一个东西中发现OnInitialUpdate  被调用了两次,一直没有ui

找到缘由,在其它的demo中从新作也没有出现这个现象。今天终于在一篇帖this

子中受到启发。
OnInitialUpdate  自己是指调用一次的,如create出来的view等状况下都正常。可是在下面的状况下就不同了。
(下面的状况我试过了,能够用)
建立一个无文档支持的单文档(SDI)MFC应用,使用CSplitterWnd分割视图,重载CMainFrame::OnCreateClient,在其中一个分割区域(Pane)建立继承自CView的窗体(假设为class CMyView : public CListView),其它使用默认设置。重载CMyView::OnInitialUpdate方法并设置断点,你会发现这个方法被回调了两次
spa

过一番调试发现,OnInitialUpdate的第一次回调发生在CSplitterWnd::CreateView方法中(winsplit.cpp),第二次回调发生在CMainFrame::LoadFrame方法中(winfrm.cpp),而两次回调都是因为这两个方法所给的参数CCreateContext *pContex为NULL引发的。.net

修改CXXXApp::InitInstance:调试

    CCreateContext cc;
    pFrame->LoadFrame(IDR_MAINFRAME,
        WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, &cc);
code

就不会产生第二次OnInitialUpdate回调了。

************************************************************************************************************************************

好比说在CFormView上有个按钮控件,为了让按钮的大小和位置随着窗体的变化而相应变化,能够以下实现:

在OnSize()函数里添加代码:

  1. void CLControl::OnSize(UINT nType, int cx, int cy)  
  2. {  
  3.     CView::OnSize(nType, cx, cy);  
  4.   
  5.     // TODO: Add your message handler code here  
  6.     Invalidate();  
  7. }  


在OnPaint()函数里添加代码:

  1. void CLControl::OnPaint()  
  2. {  
  3.     CPaintDC dc(this); // device context for painting  
  4.     // TODO: Add your message handler code here  
  5.     // Do not call CFormView::OnPaint() for painting messages  
  6.     if (IsWindowVisible())
  7.      {      
  8.     CRect rec;  
  9.     GetClientRect(&rec);  
  10.     m_LCbutton1.MoveWindow(rec.Width()/4,rec.Height()/4,    rec.Width()/2,rec.Height()/8);  
  11.     m_LCbutton2.MoveWindow(rec.Width()/4,rec.Height()*3/4,  rec.Width()/2,rec.Height()/8); 
  12.     }    

  1. }   

转:http://shitou7630.blog.163.com/blog/static/32699536201522703247795/