今天在学习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()函数里添加代码:
- void CLControl::OnSize(UINT nType, int cx, int cy)
- {
- CView::OnSize(nType, cx, cy);
-
- // TODO: Add your message handler code here
- Invalidate();
- }
在OnPaint()函数里添加代码:
- void CLControl::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
- // TODO: Add your message handler code here
- // Do not call CFormView::OnPaint() for painting messages
- if (IsWindowVisible())
- {
- CRect rec;
- GetClientRect(&rec);
- m_LCbutton1.MoveWindow(rec.Width()/4,rec.Height()/4, rec.Width()/2,rec.Height()/8);
- m_LCbutton2.MoveWindow(rec.Width()/4,rec.Height()*3/4, rec.Width()/2,rec.Height()/8);
- }
- }
转:http://shitou7630.blog.163.com/blog/static/32699536201522703247795/