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函数调用,后要刷新窗口
就成功了!
下面首先看一下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函数调用,后要刷新窗口
就成功了!
相关文章推荐
- MFC---一个对话框,初始时没有OnInitDialog()函数,我们如何初始化其数据成员及函数
- MFC_为MFC对话框建立初始化函数BOOL HistoryData::OnInitDialog()
- 怎样为MFC对话框建立初始化函数BOOL HistoryData::OnInitDialog()
- MFC中OnInitDialog与OnSize函数谁先调用
- MFC中OnInitDialog()函数的使用和使用SetWindowText()修改对话框的名称
- MFC中CTreeCtrl奇怪的SetCheck [OnInitDialog中SetCheck无效问题]
- Ctreectrl在初始化(OnInitDialog)中SetCheck的问题
- vs2008给子对话框添加初始化函数OnInitDialog()函数
- 一个对话框,初始时没有OnInitDialog()函数,我们如何初始化其数据成员及函数
- 如何重载MFC对话框的OnInitDialog()函数
- 18.3.20 MFC 遇到函数模板已经定义, 多次初始化之类的问题
- VS 2008, MFC: add OnInitDialog - how?
- VS2008重写函数 OnInitDialog
- 如果重写对话框的OnInitDialog()函数,如何保证DoDataExchange(CDataExchange* pDX)依然有效?
- 在MFC内无法发现OnInitDialog的解决方式
- MFC中对话框中OnInitDialog()和OnCreate()的区别
- 为什么在CDialog::OnInitDialog函数中绘图没效果呢?
- 解决 mfc OninitDialog里面隐藏对话框的方法
- 对话框函数CDialog::OnInitDialog()
- 注意mfc下oninitdialog()和onsize()的调用顺序