现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

MFC控件大小随窗口变化

2012-08-28 10:05 工业·编程 ⁄ 共 1081字 ⁄ 字号 暂无评论

    控件一般都是在对话框内的,单文档内嵌入对话框,然后在对话框内添加控件,所以也对话框内的控件。在这个对话框内的控件的父窗口也就是此对话框。理解父窗口是必须的。我们让控件随对话框变化也就是让控件随父窗口变化

1、一般用两个函数来实现

a.void MoveWindow(int x,int y,int nWidth,int nHeight);

x.y为起始地方的横纵坐标,也就是开始的长,高。是以左上角有(0,0)坐标的
nWidth, nHeight为控件新的宽和高,随对话框变化也就是要改变这两个值了

b.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,维持大小不变;

2、如何来实现

    父窗口改变时都会发送VM_SIZE消息,响应此消息来决定控件的大小和位置。ctrl+w或是在父窗口右击调出classwizard,每个对话框在产生时都会生成一个类和一个对应的XXX.cpp和XXX.h文件。找到此类的VM_SIZE消息,并生成消息响应函数,并编辑。在VM_SIZE的响应函数里:(在消息响应函数内有传入参数cx, cy分别代表其横纵坐标)

    首先找到控件的句柄:CWnd *Item=GetDlgItem(IDC_totaltel); (IDC_totaltel为对话框内控件的ID号)

    然后用MoveWindow()
    if (Item != NULL)
    {
        Item->MoveWindow(cx *3/4, 150 ,cx/5,cy/6);//cx为横坐标,即向左cx*3/4,150为横,纵坐标开始位置
    }
或是用SetWindowPos()
    if (Item != NULL)
    {
        //AfxMessageBox("THIS");
        Item->SetWindowPos(NULL, 0 , 0 , cx, 90 , SWP_NOZORDER);//cx为横坐标,即向左
    }

3、总结

   只要看控件在哪个上面,它的父窗口是哪一个,在它的父窗口里重载VM_SIZE的消息响应函数即可.

    对话框里的:列表控件,树,按钮,图片,编辑窗口(这几个是我实现了的)等都是这样做。

VC中自动改变控件位置和大小的对话框类

给我留言

留言无头像?