返回> 网站首页 

[转载]EasySize宏在CFormView类中的使用

yoours2012-05-02 10:12:47 阅读 1282

简介一边听听音乐,一边写写文章。

    最近用VC折腾一个界面,是一个基于单文档的程序,我将整个区域划分成了左右两个部分,并且分别关联到了两个CFormView类,然后在资源编辑器上新创建了两个对话框资源关联与前面提到的两个CFormView类上,对话框资源上有几个控件,然后我想在程序运行的时候让这几个控件跟随着整个视图的大小而变化,本来是可以在相应的CFormView类中的OnSize函数中通过使用movewindow函数或者setwindowpos函数实现,但是当时由于觉得太麻烦就使用了codeproject中的easysize这个宏,整体上使用很方便,但是后来发现这个宏好像只是在CDialog类中才能有很好的展示,在CFormView类中设置好easysize的map映射的时候却显示不出相应的控件,google了半天也没找到很好的解决办法,后来在easysize主页下面的那些讨论贴中倒是翻出了一个解决办法(办法由codeproject的Ali Rafiee提出):
 
     由于在CFormView类中的初始化和CDialog类的初始化的不同(CFormView类初始化时相应的控件好像还没创建),因此不能简单的在onsize函数中添加 UPDATE_EASYSIZE宏,所以在onsize中需要判断是否是第一次调用onsize函数,然后再做相应的处理,好了,话不多说,上代码:
 
void CMyView::OnSize(UINT nType, int cx, int cy)
{
      CFormView::OnSize(nType, cx, cy);

      if (m_bFirst && IsWindowVisible()&& GetWindow(GW_CHILD)!=NULL)
      {
             INIT_EASYSIZE;
             m_bFirst = FALSE;
             SetScrollSizes(MM_TEXT,CSize(0,0));
             UPDATE_EASYSIZE;
      }else if (!m_bFirst){
             SetScrollSizes(MM_TEXT,CSize(0,0));
             UPDATE_EASYSIZE;
      }
}

然后 Ali Rafiee说,还要将easysize.h文件中最后一句GetDlgItem(id)->MoveWindow(left,top,right-left,bottom-top,FALSE);/改成GetDlgItem(id)->MoveWindow(left,top,right-left,bottom-top,TRUE);/ ,其他地方不变,这样,在CFormView类中使用easysize也可以正常的展示了。

原文:
I found a solution for the form view problem (and it's working great for me). The problem is that when OnInitalUpdate gets called the form (eventhough created) has a width and height of zero. So what I did was put an if statment in the OnSize where the first time around I call INIT_EASYSIZE, and from there on I call UPDATE_EASYSIZE. Also you have to call SetScrollSizes(MM_TEXT,0,0) in order to get rid of the scrollbars.
 
void CMyView::OnSize(UINT nType, int cx, int cy)
{
    CFormView::OnSize(nType, cx, cy);
 
    if (m_bFirst && IsWindowVisible()&& GetWindow(GW_CHILD)!=NULL)
    {
        INIT_EASYSIZE;
        m_bFirst = FALSE;
        SetScrollSizes(MM_TEXT,CSize(0,0));
        UPDATE_EASYSIZE;
    }else if (!m_bFirst){
        SetScrollSizes(MM_TEXT,CSize(0,0));
        UPDATE_EASYSIZE;
    }
}
 
Hope this helps.
 Ali Rafiee 

I forgot to add that I also had to change the last line in Easysize.h from 
 GetDlgItem(id)->MoveWindow(left,top,right-left,bottom-top,FALSE);\
 to 
 GetDlgItem(id)->MoveWindow(left,top,right-left,bottom-top,TRUE);\
 So that the controls get redrawn correctly during the sizing
 
Ali Rafiee 
微信小程序扫码登陆

文章评论

1282人参与,0条评论