您的位置:首页 > 其它

MFC中OnInitDialog 函数初始化问题

2013-10-08 14:11 357 查看
最近用到了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函数调用,后要刷新窗口

就成功了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: