mfc中视图view是怎样随着主窗口的大小改变而改变的

mfc中视图view是怎样随着主窗口的大小改变而改变的,第1张

mfc 窗口大小变化时让窗口内部控件也一起随比例改变位置:

void CXTest2Dlg::OnSize(UINT nType, int cx, int cy)

{

CDialog::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码

//将窗口移动到合适位置和大小

CRect rc,rc0,rc1;

GetClientRect(&rc0);//先取得整个对话框的大小及位置

//设置Tab控件位置

rc1top=rc0top;

rc1left=rc0left+1;

rc1bottom=rc0bottom-30;

rc1right=rc0right-1;

if(GetDlgItem(IDC_TAB1)!=NULL)

{

GetDlgItem(IDC_TAB1)->MoveWindow(&rc1);

}

//设置时钟位置

rc1top=rc0bottom-20;

rc1left=rc0left+5;

rc1bottom=rc0bottom;

rc1right=rc0left+160;

if(GetDlgItem(IDC_CLOCKTEST)!=NULL)

{

GetDlgItem(IDC_CLOCKTEST)->MoveWindow(&rc1);

}

//设置关闭按钮位置

rc1top=rc1top-5;

rc1left=rc0right-200;

rc1bottom=rc1bottom;

rc1right=rc0right-120;

if(GetDlgItem(IDOK)!=NULL)

{

GetDlgItem(IDOK)->MoveWindow(&rc1);

}

//设置取消按钮位置

rc1left=rc0right-100;

rc1right=rc0right-20;

if(GetDlgItem(IDCANCEL)!=NULL)

{

GetDlgItem(IDCANCEL)->MoveWindow(&rc1);

}

//将三个对话框资源定位到Tab控件中

if(GetDlgItem(IDC_TAB1)!=NULL)

{

GetDlgItem(IDC_TAB1)->GetClientRect(&rc);

rc1top=rctop+20;

rc1left=rcleft+1;

rc1bottom=rcbottom-10;

rc1right=rcright-1;

tab1GetClientRect(&rc1);

tab1GetDlgItem(IDC_MSGINFO)->MoveWindow(&rc1);//移动第一个

rc1bottom=rcbottom-35;//第二个及第三个底部留出按钮位置

tab2GetDlgItem(IDC_BNSLIST)->MoveWindow(&rc1);

tab3GetDlgItem(IDC_MSGERRINFO)->MoveWindow(&rc1);

可以用滚动视图CSrcollView,设置滚动范围800600,这样即使窗口缩小了,实际客户区仍有这么大;

可以禁止系统菜单的放缩和最大化,通过MoveWindow或者初始化窗口属性cs变量固定窗口大小,不可缩小也不可放大;

截获框架CMainFrame的OnSize,在里面强行设置(不推荐,效果不好)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

void CMainFrame::OnSize(UINT nType, int cx, int cy)

{

if(cx<800)

{

cx = 800;

CRect rect;

GetWindowRect(rect);

rectright = rectleft+cx;

MoveWindow(rect,true);

}

CSDIFrameWnd::OnSize(nType, cx, cy);

// TODO: Add your message handler code here

1、在视图里面添加这个函数 当视图改变时改变控件的大小

void CQueryBusView::OnSize(UINT nType, int cx, int cy)

{

CRecordView::OnSize(nType, cx, cy);

m_RecordListMoveWindow(0,0,cx,cy,TRUE);

//m_RecordList是一个控件变量 MoveWindow可以改变控件的大小,当窗体尺寸改变时候

// TODO: Add your message handler code here

}

MFC中的控件大小是可以修改的,但是有点麻烦,具体方法如下:

CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。

void MoveWindow(int x,int y,int nWidth,int nHeight);void MoveWindow(LPCRECT lpRect);第一种用法需给出控件新的坐标和宽度、高度;第二种用法给出存放位置的CRect对象;例:CWnd pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT1为控件ID号pWnd->MoveWindow( CRect(0,0,100,100) ); //在窗口左上角显示一个宽100、高100的编辑控件

SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:BOOL SetWindowPos(const CWnd pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);第一个参数我不会用,一般设为NULL;x、y控件位置;cx、cy控件宽度和高度;nFlags常用取值:SWP_NOZORDER:忽略第一个参数;SWP_NOMOVE:忽略x、y,维持位置不变;SWP_NOSIZE:忽略cx、cy,维持大小不变;例:CWnd pWnd;pWnd = GetDlgItem( IDC_BUTTON1 ); //获取控件指针,IDC_BUTTON1为控件ID号pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE ); //把按钮移到窗口的(50,80)处pWnd = GetDlgItem( IDC_EDIT1 );pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE ); //把编辑控件的大小设为(100,80),位置不变pWnd = GetDlgItem( IDC_EDIT1 );pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER ); //编辑控件的大小和位置都改变以上方法也适用于各种窗口。

先获取视图当前相对于屏幕的位置,然后再获取整个框架相对于屏幕的位置,计算出两者left和top,right, bottom的偏移量,然后按照这个偏移量用SetWindowPos函数对整个框架放大并移动即可

假如框架当前坐标为2, 2, 100,100 视图坐标为 3, 3, 99, 99, 那么各偏移量为 -1 -1 1 1因此你需要将框架的左上角移动到桌面-1, -1这个点, 然后算出框架的大小为整个屏幕大小+2(屏幕的宽和高),这样视图的大小刚好满了整个屏幕

在CFormView里面添加Onsize消息响应,在里面按比例放大缩小控件大小,当视图大小变化了,控件大小及其相对位置也要变化,使用MoveWindow

举个例子,你先保存原来视图大小宽widOld,高heiOld

然后某一次视图大小宽变为widNew,你算出这个增加的比例,控件的比例也按这个放大或者缩小就是了。

即使你更改了属性,资源视图里窗口也是那么大,运行时则会自动最大化

最大化时控件在左上角显示,其余部分什么都没有

建议对话框不要设置可以最大化,因为界面是提前布置好的

最大化后没什么意义

如果你想要窗口变大,可以在资源视图里把窗口拉大

以上就是关于mfc中视图view是怎样随着主窗口的大小改变而改变的全部的内容,包括:mfc中视图view是怎样随着主窗口的大小改变而改变的、如何设置MFC单文档窗口大小、mfc中,我在视图类的OnInitialUpdate()中创建了一个编辑框控件,怎样使这个控件随主窗口大小变化而变化。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10145911.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存