目的:让列宽随着界面变化自由变化
1.查看MSDN
CListCtrl SetColumnWidth
BOOL SetColumnWidth(
int nCol, //列索引
int cx //列宽度
);
2、本节代码部分有改动。所有声明的变量(全局)和结构体放在代码首部,规范代码。下面贴出目前为止,
void CPcRemoteDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
double dcx = cx;
if (m_CList_Online.m_hWnd != NULL)
{
CRect rc;
rc.left = 1; //列表的左坐标
rc.top = 80; //列表的上坐标
rc.right = cx - 1; //列表的右坐标
rc.bottom = cy - 160; //列表的下坐标
m_CList_Online.MoveWindow(rc);
//对话框的总宽度
for (int i = 0; i<g_Column_Online_Count; i++)
{ //循环遍历每一个列
double dd = g_Column_Online_Data[i].nWidth; //得到当前列的宽度
dd /= g_Column_Online_Width; //看一看当前宽度占总长度的几分之几
dd *= dcx; //用原来的长度乘以所占的几分之几得到当前的宽度
int lenth = dd; //转换为int 类型
m_CList_Online.SetColumnWidth(i, lenth); //设置当前的宽度
}
}
if (m_CList_Message.m_hWnd != NULL)
{
CRect rc;
rc.left = 1; //列表的左坐标
rc.top = cy - 156; //列表的上坐标
rc.right = cx - 1; //列表的右坐标
rc.bottom = cy - 6; //列表的下坐标
m_CList_Message.MoveWindow(rc);
for (int i = 0; i<g_Column_Message_Count; i++) { //遍历每一个列
double dd = g_Column__Message_Data[i].nWidth; //得到当前列的宽度
dd /= g_Column_Message_Width; //看一看当前宽度占总长度的几分之几
dd *= dcx; //用原来的长度乘以所占的几分之几得到当前的宽度
int lenth = dd; //转换为int 类型
m_CList_Message.SetColumnWidth(i, (lenth)); //设置当前的宽度
}
}
}
项目所有代码:
(1)变量和结构体放在首部,代码如下:
int g_Column_Online_Width = 0; //新增
int g_Column_Online_Count = 7; //列表的个数 修改代码位置
int g_Column_Message_Count = 3; //列表的个数 修改代码位置
int g_Column_Message_Width = 0; //列总宽度
typedef struct
{
char *title; //列表的名称
int nWidth; //列表的宽度
}COLUMNSTRUCT;
COLUMNSTRUCT g_Column_Online_Data[] =
{
{ "IP", 100 },
{ "区域", 150 },
{ "计算机名/备注", 160 },
{ "操作系统", 128 },
{ "CPU", 88 },
{ "摄像头", 101 },
{ "PING", 101 }
};
COLUMNSTRUCT g_Column__Message_Data[] =
{
{ "信息类型", 168 },
{ "时间", 100 },
{ "信息内容", 660 }
};
2、InitList函数中所有代码
int CPcRemoteDlg::InitList()
{
// TODO: 在此处添加实现代码.
for (int i = 0; i < g_Column_Online_Count; i++)
{
m_CList_Online.InsertColumn(i, g_Column_Online_Data[i].title, LVCFMT_CENTER, g_Column_Online_Data[i].nWidth);
g_Column_Online_Width += g_Column_Online_Data[i].nWidth; //新增
}
for (int i = 0; i < g_Column_Message_Count; i++)
{
m_CList_Message.InsertColumn(i, g_Column__Message_Data[i].title, LVCFMT_CENTER, g_Column__Message_Data[i].nWidth);
g_Column_Message_Width += g_Column__Message_Data[i].nWidth; //新增
}
return 0;
}
3、onsize函数代码如下:
void CPcRemoteDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
double dcx = cx;
if (m_CList_Online.m_hWnd != NULL)
{
CRect rc;
rc.left = 1; //列表的左坐标
rc.top = 80; //列表的上坐标
rc.right = cx - 1; //列表的右坐标
rc.bottom = cy - 160; //列表的下坐标
m_CList_Online.MoveWindow(rc);
//对话框的总宽度
for (int i = 0; i<g_Column_Online_Count; i++)
{ //循环遍历每一个列
double dd = g_Column_Online_Data[i].nWidth; //得到当前列的宽度
dd /= g_Column_Online_Width; //看一看当前宽度占总长度的几分之几
dd *= dcx; //用原来的长度乘以所占的几分之几得到当前的宽度
int lenth = dd; //转换为int 类型
m_CList_Online.SetColumnWidth(i, lenth); //设置当前的宽度
}
}
if (m_CList_Message.m_hWnd != NULL)
{
CRect rc;
rc.left = 1; //列表的左坐标
rc.top = cy - 156; //列表的上坐标
rc.right = cx - 1; //列表的右坐标
rc.bottom = cy - 6; //列表的下坐标
m_CList_Message.MoveWindow(rc);
for (int i = 0; i<g_Column_Message_Count; i++) { //遍历每一个列
double dd = g_Column__Message_Data[i].nWidth; //得到当前列的宽度
dd /= g_Column_Message_Width; //看一看当前宽度占总长度的几分之几
dd *= dcx; //用原来的长度乘以所占的几分之几得到当前的宽度
int lenth = dd; //转换为int 类型
m_CList_Message.SetColumnWidth(i, (lenth)); //设置当前的宽度
}
}
}
4、初始化OninitDlalog代码如下:
BOOL CPcRemoteDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
InitList();
CRect rect;
GetWindowRect(&rect);
rect.bottom += 20;
MoveWindow(rect);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
5、运行效果:
自由拖动大小,区域自动改变。
6、总结:
本节内容的思想:
首先获取原始每列的宽度 ,以及总列宽,计算得出每列占总列宽的百分比,当改变界面大小后,计算得出当前的总宽度,以及占得百分比,设置新的列宽。