最近用到了MFC的TabCtrl控件显示 其中有一个A窗体是要显示在TabCtrl中的,而A窗体中有一个ListCtrl控件,现在的问题是要在A的OnInitDialog中初始化ListCtrl的样式;
下面首先看一下A窗体的情况:
我要将A中ListCtrl初始化为两列:序号和文件路径。。。等其他的一下样式改变。
下图为主窗口,TabCtrl控件就在这个窗口上,这也是做完以后的效果图。
下面才是重点:
主窗口OnInitDialog代码
#ifndef TabInit
// ------------------------ TabCtrl ------------------------
CRect rect;
//删除有所标签项
myTAB_SCRIN_SingleAndBatch.DeleteAllItems();
//插入标签
myTAB_SCRIN_SingleAndBatch.InsertItem(0,"单个处理");
myTAB_SCRIN_SingleAndBatch.InsertItem(1,"批处理");
//设置页面的位置在m_tab控件范围内
myTAB_SCRIN_SingleAndBatch.GetClientRect(rect);
rect.top+=20;
rect.bottom-=4;
rect.left+=4;
rect.right-=4;
//标签1 单个处理 绑定
a = new A;
a->Create(IDD_DIALOG_SINGLE_PROCESS, &myTAB_SCRIN_SingleAndBatch); //此句后执行Page1SingleProcess的初始化函数
a->MoveWindow(rect);
//标签2 批处理 绑定
b = new CBatchProcessDlg;
b->Create(IDD_DIALOG_BATCH_PROCESS, &myTAB_SCRIN_SingleAndBatch);
b->MoveWindow(rect);
//默认选中第一个标签项
myTAB_SCRIN_SingleAndBatch.SetCurSel(0);
a->ShowWindow(SW_SHOW);
#endif
A 窗口OnInitDialog代码
BOOL CSingleProcessDlg::OnInitDialog()
{
//myLIST_SINGLE_KeyFilesInfoInit 初始化
#ifndef myLIST_SINGLE_KeyFilesInfoInit
myLIST_SINGLE_KeyFilesInfo.SetBkColor(RGB(255, 251, 228));
myLIST_SINGLE_KeyFilesInfo.SetTextColor(RGB(0,0,0));
myLIST_SINGLE_KeyFilesInfo.SetTextBkColor(RGB(255, 251, 238));
CRect rect;
myLIST_SINGLE_KeyFilesInfo.GetWindowRect(&rect);
int width = rect.Width();
myLIST_SINGLE_KeyFilesInfo.ModifyStyle(0, LVS_REPORT);
int n = 0;
myLIST_SINGLE_KeyFilesInfo.InsertColumn(n++, _T("序号"), LVCFMT_LEFT, 40);
myLIST_SINGLE_KeyFilesInfo.InsertColumn(n++, _T("文件路径"), LVCFMT_LEFT, width-40);
myLIST_SINGLE_KeyFilesInfo.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
#endif
return TRUE;
}
这样程序执行的效果为:
即 A中关于ListCtrl样式的代码没有起作用!
调试发现这段代码确实执行了,但myLIST_SINGLE_KeyFilesInfo.GetWindowRect(&rect); 得到的rect值为随机值,
最后发现原因是:
主窗口执行a->Create(IDD_DIALOG_SINGLE_PROCESS, &myTAB_SCRIN_SingleAndBatch);这句后A的OnInitDialog()执行,这是create后的窗体参数并没有刷新
以至于GetWindowRect 获得的rect为随机值。
这样,只要在A的OnInitDialog()函数的开始位置 刷新一下数据就可以了
加上代码:
UpdateData(FALSE); //必不可少,否则ListCtrl的绘制将会出现问题,,,,由Page1SingleProcess->Create函数调用,后要刷新窗口
就成功了!