MFC中OnInitDialog 函数初始化问题

最近用到了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函数调用,后要刷新窗口

就成功了!

发布了24 篇原创文章 · 获赞 18 · 访问量 26万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览