MFC 初始化以及操作点击按钮弹出的对话框解决办法
MFC 初始化以及操作点击按钮弹出的对话框
在主对话框上点击一个按钮弹出新的模态对话框 新对话框上有List Control (显示数据)
Edit Control(编辑输入信息) 以及三个按钮 分别添加增加 修改 删除信息处理事件
对话框类及实现文件如下:
// DlgGroupInfo 对话框实现文件
IMPLEMENT_DYNAMIC(DlgGroupInfo, CDialog)
DlgGroupInfo::DlgGroupInfo(CWnd* pParent /*=NULL*/)
: CDialog(DlgGroupInfo::IDD, pParent),m_index(-1)
{
//CRect rect;
//m_ListGroupInfo.GetClientRect(&rect);
//m_ListGroupInfo.SetExtendedStyle(m_ListGroupInfo.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
//m_ListGroupInfo.InsertColumn(0,"班组",LVCFMT_CENTER, 10, 0); //list中第一列
//CStdioFile Rfile("pz.txt",CFile::modeCreate|CFile::modeRead);
//CString str;
//while(Rfile.ReadString(str))
//{
// m_vtGroup.push_back(str);
//}
//Rfile.Close();
//int index = 0;
//for (int i = 0; i < m_vtGroup.size(); i++)
//{
// m_ListGroupInfo.InsertItem(index, "");
// m_ListGroupInfo.SetItemText(index,0, m_vtGroup.at(i));
// index++;
//}
}
DlgGroupInfo::~DlgGroupInfo()
{
}
void DlgGroupInfo::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
/*DDX_Control(pDX, IDC_LIST_GROUP_INFO, m_ListGroupInfo);
DDX_Control(pDX, IDC_EDIT_GROUP_NAME, m_EditGroupName);
DDX_Control(pDX, IDC_COMBO_GROUP, m_cbGroup);*/
}
BEGIN_MESSAGE_MAP(DlgGroupInfo, CDialog)
ON_BN_CLICKED(IDC_BUTTON_GROUP_ADD, &DlgGroupInfo::OnBnClickedButtonGroupAdd)
ON_BN_CLICKED(IDC_BUTTON_GROUP_UPDATE, &DlgGroupInfo::OnBnClickedButtonGroupUpdate)
ON_BN_CLICKED(IDC_BUTTON_GROUP_DELETE, &DlgGroupInfo::OnBnClickedButtonGroupDelete)
ON_NOTIFY(NM_CLICK, IDC_LIST_GROUP_INFO, &DlgGroupInfo::OnNMClickListGroupInfo)
END_MESSAGE_MAP()
// DlgGroupInfo 消息处理程序
void DlgGroupInfo::OnBnClickedButtonGroupAdd()
{
// TODO: 在此添加控件通知处理程序代码
CString strValue;
m_EditGroupName.GetWindowText(strValue);
if (strValue.IsEmpty())
{
AfxMessageBox("班组名称不能为空");
return;
}
for(int i = 0; i < m_vtGroup.size(); i++)
{
if(strcmp(strValue,m_vtGroup.at(i)) == 0)
{
AfxMessageBox("有相同记录");
return;
}
}
//在班组配置文件尾部追加信息
m_vtGroup.push_back(strValue);
CFile fGroupPZ;
fGroupPZ.Open("pz.txt", CFile::modeCreate | CFile::modeReadWrite);
for (int i=0; i<m_vtGroup.size(); i++)
{
fGroupPZ.Write(m_vtGroup.at(i), strlen(m_vtGroup.at(i)));
fGroupPZ.Write("\r\n", strlen("\r\n"));
}
fGroupPZ.Close();
//list 控件添加班组信息
int rowNo = m_ListGroupInfo.GetItemCount();
m_ListGroupInfo.InsertItem(rowNo, "");
m_ListGroupInfo.SetItemText(rowNo,0, strValue);
m_EditGroupName.SetWindowText("");
}
void DlgGroupInfo::OnBnClickedButtonGroupUpdate()
{
// TODO: 在此添加控件通知处理程序代码
CString strValue;
m_EditGroupName.GetWindowText(strValue);
if (strValue.IsEmpty())
{
AfxMessageBox("班组名称不能为空");
return;
}
for(int i = 0; i < m_vtGroup.size(); i++)
{
if(strcmp(strValue,m_vtGroup.at(i)) == 0)
{
AfxMessageBox("有相同记录");
return;
}
}
m_vtGroup.at(m_index) = strValue;
//更新配置文件
CFile fGroupPZ;
fGroupPZ.Open("pz.txt", CFile::modeCreate | CFile::modeReadWrite);
for (int i = 0; i < m_vtGroup.size(); i++)
{
fGroupPZ.Write(m_vtGroup.at(i), strlen(m_vtGroup.at(i)));
fGroupPZ.Write("\r\n", strlen("\r\n"));
}
fGroupPZ.Close();
//显示更新的班组信息
m_EditGroupName.SetWindowText("");
m_ListGroupInfo.SetItemText(m_index, 0, strValue);
}
void DlgGroupInfo::OnBnClickedButtonGroupDelete()
{
// TODO: 在此添加控件通知处理程序代码
CString strValue;
m_EditGroupName.GetWindowText(strValue);
m_vtGroup.erase(m_vtGroup.begin() + m_index);
//更新配置文件
CFile fGroupPZ;
fGroupPZ.Open("pz.txt", CFile::modeCreate | CFile::modeReadWrite);
for (int i = 0; i < m_vtGroup.size(); i++)
{
fGroupPZ.Write(m_vtGroup.at(i), strlen(m_vtGroup.at(i)));
fGroupPZ.Write("\r\n", strlen("\r\n"));
}
fGroupPZ.Close();
m_EditGroupName.SetWindowText("");
m_ListGroupInfo.DeleteItem(m_index);
}
void DlgGroupInfo::OnNMClickListGroupInfo(NMHDR *pNMHDR, LRESULT *pResult)
{
//LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
m_index = pNMLV->iItem;
if ( m_index != -1)
{
m_strGpName = m_ListGroupInfo.GetItemText(m_index, 0);
m_EditGroupName.SetWindowText(m_strGpName);
}
else
{
}
*pResult = 0;
}
类写好后,点击主对话框的按钮以弹出新对话框,此时若DlgGroupInfo类构造函数的内容(初始化List Control控件)以及DoDataExchange函数的内容不注释 新对话框的创建就会有失败 求大神指教如何修改
------解决思路----------------------
向你的DlgGroupInfo类中添加虚函数OnInitDialog()(在“属性栏”操作),然后将你的那一坨初始化操作放到OnInitDialog()函数里面实现即可。楼主需要琢磨下“类”和“对象”的区别。
在主对话框上点击一个按钮弹出新的模态对话框 新对话框上有List Control (显示数据)
Edit Control(编辑输入信息) 以及三个按钮 分别添加增加 修改 删除信息处理事件
对话框类及实现文件如下:
/ DlgGroupInfo 对话框 头文件
class DlgGroupInfo : public CDialog
{
DECLARE_DYNAMIC(DlgGroupInfo)
public:
DlgGroupInfo(CWnd* pParent = NULL); // 标准构造函数
virtual ~DlgGroupInfo();
// 对话框数据
enum { IDD = IDD_DIALOG_GROUP };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_ListGroupInfo;
CEdit m_EditGroupName;
std::vector<CString> m_vtGroup; //保存数据
int m_index; // list control 数据下标
CString m_strGpName; //Edit 控件数据
afx_msg void OnBnClickedButtonGroupAdd();
afx_msg void OnBnClickedButtonGroupUpdate();
afx_msg void OnBnClickedButtonGroupDelete();
afx_msg void OnNMClickListGroupInfo(NMHDR *pNMHDR, LRESULT *pResult);
};
// DlgGroupInfo 对话框实现文件
IMPLEMENT_DYNAMIC(DlgGroupInfo, CDialog)
DlgGroupInfo::DlgGroupInfo(CWnd* pParent /*=NULL*/)
: CDialog(DlgGroupInfo::IDD, pParent),m_index(-1)
{
//CRect rect;
//m_ListGroupInfo.GetClientRect(&rect);
//m_ListGroupInfo.SetExtendedStyle(m_ListGroupInfo.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
//m_ListGroupInfo.InsertColumn(0,"班组",LVCFMT_CENTER, 10, 0); //list中第一列
//CStdioFile Rfile("pz.txt",CFile::modeCreate|CFile::modeRead);
//CString str;
//while(Rfile.ReadString(str))
//{
// m_vtGroup.push_back(str);
//}
//Rfile.Close();
//int index = 0;
//for (int i = 0; i < m_vtGroup.size(); i++)
//{
// m_ListGroupInfo.InsertItem(index, "");
// m_ListGroupInfo.SetItemText(index,0, m_vtGroup.at(i));
// index++;
//}
}
DlgGroupInfo::~DlgGroupInfo()
{
}
void DlgGroupInfo::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
/*DDX_Control(pDX, IDC_LIST_GROUP_INFO, m_ListGroupInfo);
DDX_Control(pDX, IDC_EDIT_GROUP_NAME, m_EditGroupName);
DDX_Control(pDX, IDC_COMBO_GROUP, m_cbGroup);*/
}
BEGIN_MESSAGE_MAP(DlgGroupInfo, CDialog)
ON_BN_CLICKED(IDC_BUTTON_GROUP_ADD, &DlgGroupInfo::OnBnClickedButtonGroupAdd)
ON_BN_CLICKED(IDC_BUTTON_GROUP_UPDATE, &DlgGroupInfo::OnBnClickedButtonGroupUpdate)
ON_BN_CLICKED(IDC_BUTTON_GROUP_DELETE, &DlgGroupInfo::OnBnClickedButtonGroupDelete)
ON_NOTIFY(NM_CLICK, IDC_LIST_GROUP_INFO, &DlgGroupInfo::OnNMClickListGroupInfo)
END_MESSAGE_MAP()
// DlgGroupInfo 消息处理程序
void DlgGroupInfo::OnBnClickedButtonGroupAdd()
{
// TODO: 在此添加控件通知处理程序代码
CString strValue;
m_EditGroupName.GetWindowText(strValue);
if (strValue.IsEmpty())
{
AfxMessageBox("班组名称不能为空");
return;
}
for(int i = 0; i < m_vtGroup.size(); i++)
{
if(strcmp(strValue,m_vtGroup.at(i)) == 0)
{
AfxMessageBox("有相同记录");
return;
}
}
//在班组配置文件尾部追加信息
m_vtGroup.push_back(strValue);
CFile fGroupPZ;
fGroupPZ.Open("pz.txt", CFile::modeCreate | CFile::modeReadWrite);
for (int i=0; i<m_vtGroup.size(); i++)
{
fGroupPZ.Write(m_vtGroup.at(i), strlen(m_vtGroup.at(i)));
fGroupPZ.Write("\r\n", strlen("\r\n"));
}
fGroupPZ.Close();
//list 控件添加班组信息
int rowNo = m_ListGroupInfo.GetItemCount();
m_ListGroupInfo.InsertItem(rowNo, "");
m_ListGroupInfo.SetItemText(rowNo,0, strValue);
m_EditGroupName.SetWindowText("");
}
void DlgGroupInfo::OnBnClickedButtonGroupUpdate()
{
// TODO: 在此添加控件通知处理程序代码
CString strValue;
m_EditGroupName.GetWindowText(strValue);
if (strValue.IsEmpty())
{
AfxMessageBox("班组名称不能为空");
return;
}
for(int i = 0; i < m_vtGroup.size(); i++)
{
if(strcmp(strValue,m_vtGroup.at(i)) == 0)
{
AfxMessageBox("有相同记录");
return;
}
}
m_vtGroup.at(m_index) = strValue;
//更新配置文件
CFile fGroupPZ;
fGroupPZ.Open("pz.txt", CFile::modeCreate | CFile::modeReadWrite);
for (int i = 0; i < m_vtGroup.size(); i++)
{
fGroupPZ.Write(m_vtGroup.at(i), strlen(m_vtGroup.at(i)));
fGroupPZ.Write("\r\n", strlen("\r\n"));
}
fGroupPZ.Close();
//显示更新的班组信息
m_EditGroupName.SetWindowText("");
m_ListGroupInfo.SetItemText(m_index, 0, strValue);
}
void DlgGroupInfo::OnBnClickedButtonGroupDelete()
{
// TODO: 在此添加控件通知处理程序代码
CString strValue;
m_EditGroupName.GetWindowText(strValue);
m_vtGroup.erase(m_vtGroup.begin() + m_index);
//更新配置文件
CFile fGroupPZ;
fGroupPZ.Open("pz.txt", CFile::modeCreate | CFile::modeReadWrite);
for (int i = 0; i < m_vtGroup.size(); i++)
{
fGroupPZ.Write(m_vtGroup.at(i), strlen(m_vtGroup.at(i)));
fGroupPZ.Write("\r\n", strlen("\r\n"));
}
fGroupPZ.Close();
m_EditGroupName.SetWindowText("");
m_ListGroupInfo.DeleteItem(m_index);
}
void DlgGroupInfo::OnNMClickListGroupInfo(NMHDR *pNMHDR, LRESULT *pResult)
{
//LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
m_index = pNMLV->iItem;
if ( m_index != -1)
{
m_strGpName = m_ListGroupInfo.GetItemText(m_index, 0);
m_EditGroupName.SetWindowText(m_strGpName);
}
else
{
}
*pResult = 0;
}
类写好后,点击主对话框的按钮以弹出新对话框,此时若DlgGroupInfo类构造函数的内容(初始化List Control控件)以及DoDataExchange函数的内容不注释 新对话框的创建就会有失败 求大神指教如何修改
------解决思路----------------------
向你的DlgGroupInfo类中添加虚函数OnInitDialog()(在“属性栏”操作),然后将你的那一坨初始化操作放到OnInitDialog()函数里面实现即可。楼主需要琢磨下“类”和“对象”的区别。