mfc listcontrol获取选中行

时间: 2023-05-31 16:20:24 浏览: 158
### 回答1: 您可以使用以下代码来获取MFC ListControl中选中的行: 1. 首先,获取ListControl控件的指针: CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_CONTROL); 2. 然后,使用以下代码来获取选中的行: POSITION pos = pListCtrl->GetFirstSelectedItemPosition(); if (pos != NULL) { int nItem = pListCtrl->GetNextSelectedItem(pos); // nItem就是选中的行号 } 注意:如果ListControl控件是多选的,那么可以使用GetNextSelectedItem()函数来获取下一个选中的行。 ### 回答2: MFC ListControl 是 MFC 中比较常用的一个控件,通常用于显示表格形式的数据。而在 ListControl 中获取选中行是一个常见的操作,可以通过以下步骤实现: 1. 在资源编辑器中添加 ListControl 控件,并设置好其属性,例如设置为 Report 样式。 2. 在代码中定义 ListControl 对象,并在 OnInitDialog 函数中获取 ListControl 控件 ID 并与 ListControl 对象绑定。 3. 通过 ListControl 对象提供的 GetNextItem 函数循环获取 ListControl 中选中的行,直到返回 -1 为止,即可获取到所有选中的行。 具体代码实现如下: ``` // 定义 ListControl 对象 CListCtrl m_ListControl; // 在 OnInitDialog 函数中获取 ListControl 控件 ID 并与 ListControl 对象绑定 BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 获取 ListControl 控件 ID m_ListControl.Attach(GetDlgItem(IDC_LIST_CONTROL)->GetSafeHwnd()); // 设置 ListControl 列表头 m_ListControl.InsertColumn(0, _T("ColumnName1"), LVCFMT_LEFT, 100); m_ListControl.InsertColumn(1, _T("ColumnName2"), LVCFMT_LEFT, 100); // 在 ListControl 中添加数据 m_ListControl.InsertItem(0, _T("Row1-Column1")); m_ListControl.SetItemText(0, 1, _T("Row1-Column2")); m_ListControl.InsertItem(1, _T("Row2-Column1")); m_ListControl.SetItemText(1, 1, _T("Row2-Column2")); return TRUE; } // 获取 ListControl 中选中的行 void CMyDialog::OnButtonGetSelected() { int nIndex = -1; CString strSelected; while ((nIndex = m_ListControl.GetNextItem(nIndex, LVNI_SELECTED)) != -1) { strSelected = m_ListControl.GetItemText(nIndex, 0); // 处理选中的行数据 // ... } } ``` 在上述代码中,我们通过 GetDlgItem 函数获取到 ListControl 控件的 HWND,再通过 Attach 函数将其绑定到 ListControl 对象上。循环调用 GetNextItem 函数即可获取到选中的行,通过 GetItemText 函数可以获取到行中指定列的数据。最后可以在处理选中的行数据的地方进行相应的逻辑处理。 ### 回答3: MFC中的List Control 控件是非常常用的一种控件,主要用于展示一些表格数据,比如文件列表等。而在操作这些表格数据时,常常需要获取用户所选中的行,然后执行相应的操作,下面介绍一种获取选中行的方法。 首先判断是否有选中行,需要使用List Control的GetSelectedCount()函数,该函数可以获取当前选中的行数,如果返回值为0,表示没有选中任何行,我们可以在这里防止程序出错,然后再获取选中的行。 接下来就需要使用List Control的GetNextItem()函数来获取选中行的索引,该函数需要传入两个参数,即当前项的索引和一个获取的方式,这里我们使用 LVNI_SELECTED 模式,即可以获取到选中的项的索引。 最后利用选中项的索引就可以获取到所有选中的项的数据,这里的数据一般是按列存储的,需要使用 List Control 的GetItemText() 函数来逐列获取每个项的数据。这个函数需要传入两个参数,即需要获取的项的索引和列的索引,返回该项和列的文本数据。 综上,获取List Control的选中行的步骤如下: 1. 判断是否有选中行:GetSelectedCount()函数返回值为0则没有选中行。 2. 获取选中行的索引:GetNextItem()函数传入 LVNI_SELECTED 模式可以获取到选中的项的索引。 3. 获取选中行的数据:通过GetItemText()函数逐列获取选中行的数据。 需要注意的是,由于List Control是按列存储的,所以在获取数据时,需要按照列的顺序来获取数据,即先获取第一列的数据,再获取第二列的数据,以此类推。

相关推荐

### 回答1: 要在MFC ListControl中添加按钮,可以按照以下步骤进行操作: 1. 在资源编辑器中,选择你想要在ListControl中添加按钮的对话框。 2. 在工具栏上选择“按钮”工具,并在对话框上点击并拖动以创建一个按钮控件。 3. 调整按钮的尺寸和位置,确保它适合于ListControl中的某一行。 4. 为按钮控件添加一个合适的控件ID,并将其保存在您的代码中。 5. 在对话框的头文件中添加按钮控件的成员变量声明,例如:CButton m_btnAdd。 6. 在对话框类的OnInitDialog()函数中调用按钮控件的SubclassDlgItem()函数,将按钮控件与资源中的对应控件进行关联。例如:m_btnAdd.SubclassDlgItem(IDC_BUTTON_ADD, this); 7. 在ListControl所在的对话框类的头文件中添加一个成员变量来表示ListControl控件,例如:CListCtrl m_listControl。 8. 在OnInitDialog()函数中通过调用SubclassDlgItem()函数,将ListControl与资源中的对应控件进行关联。例如:m_listControl.SubclassDlgItem(IDC_LIST_CONTROL, this); 9. 创建一个添加按钮的消息处理函数,例如:OnAddButtonClicked()。 10. 在OnInitDialog()函数中通过调用按钮控件的SetWindowText()函数,设置按钮的文本,例如:m_btnAdd.SetWindowText(_T("添加")). 11. 在OnInitDialog()函数中添加一个点击按钮时的响应函数,例如:m_btnAdd.SetWindowText(_T("添加"));。 12. 在OnAddButtonClicked()函数中,编写添加按钮逻辑的代码,例如:获取列表控件中当前选中行的数据,然后将其添加到ListControl中。 13. 在消息映射表中,将按钮控件的点击事件与OnAddButtonClicked()函数进行关联。 14. 编译并运行程序,确保按钮和添加按钮的功能在ListControl上正常工作。 以上是在MFC ListControl中添加按钮的基本步骤,根据具体需求,你可能需要自定义按钮的样式、位置和功能。 ### 回答2: 在MFC中使用List Control控件来显示列表数据是常见的UI需求之一。如果要为List Control添加按钮,可以按照以下步骤进行操作: 首先,我们需要创建一个自定义的List Control控件类,继承自CListCtrl。在该类的头文件中添加按钮的声明和处理函数的声明。 然后,重写该类的OnCreate函数,以便在创建控件时添加按钮。在OnCreate函数中,创建按钮控件,并设置按钮的位置、大小等属性。 接下来,重写该类的PreSubclassWindow函数,在该函数中创建按钮的子窗口,并为按钮绑定相应的消息处理函数。 在消息处理函数中,根据需要添加相应的逻辑处理代码。例如,点击按钮后可以弹出对话框、触发其他事件等。 在使用该自定义List Control控件的地方,创建该控件的对象,并调用Create函数创建控件。然后使用InsertItem和SetItemText等函数向列表中插入数据。 最后,在对话框的OnSize函数中调整List Control的大小和位置,以便显示按钮。 通过以上步骤,就可以实现在MFC中为List Control添加按钮的功能了。 ### 回答3: 在MFC中,可以通过以下步骤来在ListControl中添加按钮: 1. 打开MFC应用程序的资源视图,找到对应的对话框,并双击打开对话框编辑器。 2. 在对话框编辑器中,找到插入List Control控件的位置,并将其添加到对话框中。 3. 右键单击List Control控件,选择属性。 4. 在属性视图中,找到扩展风格选项,并勾选LVS_OWNERDRAWFIXED选项,这将启用自绘制功能。 5. 在对话框类的头文件中,添加一个变量声明来引用List Control控件,并通过DDX_Control函数来关联控件和变量。 6. 在对话框类的源文件中,通过List Control控件的InsertItem函数来插入列表项,并使用SetItemData函数为每个列表项设置一个唯一的标识符。 7. 在对话框类的源文件中,通过网格控制的NM_CUSTOMDRAW消息来处理自绘制按钮的绘制。在OnCustomDraw函数中,可以通过绘制按钮和处理按钮点击事件来实现按钮的添加。 8. 为自绘制按钮添加事件处理函数,例如OnClickButton函数,在该函数中可以获取所点击的按钮的ItemData,并根据需要执行相应的操作。 通过以上步骤,就可以在MFC的List Control控件中成功添加按钮,并实现按钮的点击事件处理。
MFC ListControl控件可以通过自绘来实现Checkbox的绘制。下面是自绘Checkbox的步骤: 1. 创建一个自定义的CListCtrl类,并在其中添加WM_PAINT消息的响应函数。 2. 在WM_PAINT消息的响应函数中,获取每个Item的位置和状态。 3. 通过函数GetClientRect()获取ListControl的客户区域,然后通过函数GetItemRect()获取每个Item的位置信息。 4. 根据Item的位置信息,使用自定义的绘制函数绘制Checkbox。 5. 根据Item的状态,使用自定义的绘制函数绘制Checkbox的选中状态。 6. 重绘完成后,调用父类的默认处理函数。 下面是一个示例代码,演示了如何使用自绘Checkbox的方式绘制MFC ListControl控件的内容: cpp class CMyListCtrl : public CListCtrl { public: afx_msg void OnPaint() { CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap bmp; bmp.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); CBitmap* oldBmp = memDC.SelectObject(&bmp); memDC.FillSolidRect(&rect, RGB(255, 255, 255)); // 设置背景色 CListCtrl::DefWindowProc(WM_PAINT, (WPARAM)memDC.GetSafeHdc(), 0); for(int i = 0; i < GetItemCount(); i++) { // 获取每个Item的位置和状态 CRect itemRect; GetItemRect(i, &itemRect, LVIR_BOUNDS); bool bChecked = GetCheck(i); // 绘制Checkbox DrawCheckbox(&memDC, itemRect, bChecked); } dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); memDC.SelectObject(oldBmp); } void DrawCheckbox(CDC* pDC, CRect rect, bool bChecked) { // 自定义Checkbox的绘制过程,根据需要进行绘制 // 使用pDC的函数来进行绘制,例如Rectangle()、FillRect()、LineTo()等 } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) ON_WM_PAINT() END_MESSAGE_MAP() 在使用ListControl时,使用该自定义的CMyListCtrl类即可实现Checkbox的自绘。
### 回答1: MFC自绘List Control 是一种自定义绘制列表控件的技术。在MFC框架中,List Control 是一种常用的控件,用于显示行列数据。默认情况下,List Control的外观是由系统自动绘制的,但是通过自绘技术,我们可以自定义List Control的外观,使其更符合我们的需求。 自绘List Control的实现一般包括以下几个步骤: 1. 创建自定义List Control类:我们需要创建一个派生自CListCtrl的自定义类,并在此类中进行绘制操作。可以使用OnPaint或OnCustomDraw等绘制事件来自定义绘制List Control的外观。 2. 响应绘制事件:在自定义List Control类中,我们需要重写相应的绘制事件,如OnPaint或OnCustomDraw等,在这些事件中进行绘制操作。可以使用MFC提供的绘图函数或GDI+等图形库来绘制需要的图形效果。 3. 控制绘制属性:在绘制事件中,我们可以通过设置不同的绘制属性,如字体、颜色、背景等,来控制List Control的外观。可以根据需要在不同的绘制事件中设置不同的属性。 4. 自定义绘制内容:自绘List Control的一个重要特点是可以自定义绘制每个单元格的内容。通过在绘制事件中获取每个单元格的数据,并根据需要绘制不同的图标、文本等内容,以实现自定义绘制效果。 5. 控制交互操作:在自绘List Control中,我们还可以重写相应的交互操作事件,如鼠标事件、键盘事件等,实现自定义的交互操作。可以根据需要在这些事件中控制所需的交互操作,如选中行、编辑单元格等。 通过使用MFC自绘List Control技术,我们可以灵活地自定义List Control的外观和功能,满足各种不同应用场景下的需求。但是需要注意的是,自绘List Control可能需要较高的绘制性能,并且实现起来相对复杂,需要熟悉MFC框架和绘图技术。 ### 回答2: MFC(Microsoft Foundation Class)是一种应用于Windows操作系统的编程框架,它提供了一套面向对象的类库,用于开发图形用户界面(GUI)的应用程序。自绘(Custom Draw)指的是通过重写相应的绘制函数,来自定义控件的绘制样式和行为。 List Control(列表控件)是MFC中常用的控件之一,用于显示和编辑包含多列数据的列表。在使用MFC自带的List Control进行绘制时,可以通过自绘的方式实现个性化的显示效果。 首先,需要在派生的List Control类中添加一个绘制列表项的函数(通常是OnCustomDraw)。在这个函数中,可以根据需求来设置自定义的绘制方式,比如改变背景色、文本颜色、选择状态等。 其次,在绘制函数中,可以使用MFC提供的绘制函数(比如CDC::FillSolidRect、CDC::TextOut等)来实现自定义控件的绘制效果。通过计算文字和背景的大小、位置等参数,可以绘制出符合要求的控件。 最后,在添加列表项时,需要设置相应的自定义绘制标志位(如设置LCMap_CUSTOMDRAW),以告诉List Control在绘制列表项时使用自定义的绘制函数。 总结来说,实现MFC自绘List Control的步骤包括:派生一个自定义的List Control类、重写绘制函数、使用MFC的绘制函数实现自定义的绘制效果、为列表项设置自定义绘制标志位。通过这些步骤,可以实现个性化的List Control控件,并满足特定的需求。 ### 回答3: MFC自绘ListControl是指在MFC框架下,使用自定义的绘图方式来实现ListControl的绘制效果。 ListControl是MFC中常用的控件之一,用于展示数据列表。默认情况下,ListControl的绘制效果由系统提供,开发者无法直接修改其样式。但通过MFC自绘ListControl的方式,我们可以通过重写绘制函数来实现自定义的样式。 首先,我们需要通过派生CListCtrl类来创建自定义的ListControl控件。然后,重写绘制函数,如OnPaint或OnEraseBkgnd函数,来实现我们想要的绘制效果。我们可以在这些函数中使用GDI绘制函数,如CDC::Rectangle、CDC::DrawText等,对ListControl的每个单元格进行绘制。另外,我们还可以使用自定义的位图作为背景,或者绘制自定义的选中效果等。 在绘制函数中,我们可以通过遍历控件的行和列,使用CDC::DrawText等函数来绘制每个单元格的文字内容。此外,我们可以根据行号和列号来确定每个单元格的位置和样式,例如设置不同行或列的背景颜色、字体、边框等。还可以根据需要自定义排序或筛选功能来绘制不同的标识或符号。 总的来说,通过MFC自绘ListControl可以实现各种个性化的绘制效果,使得ListControl更加符合应用程序的需求。但需要注意的是,自绘ListControl的实现比较复杂,需要对MFC框架和GDI绘图函数有一定的了解才能正确使用。同时,在绘制大量数据时也可能会影响性能,因此在设计时需要综合考虑。
当然可以,以下是一个简单的 MFC ListControl 的用法示例: 首先,你需要在你的对话框类中添加一个 ListControl 控件,可以在资源编辑器中添加。然后,在你的对话框类的头文件中添加以下代码: cpp #include <afxcmn.h> // 包含 ListControl 的头文件 class CMyDialog : public CDialog { // ... private: CListCtrl m_listCtrl; // 声明 ListControl 控件 // ... }; 接下来,在你的对话框类的 OnInitDialog 函数中添加以下代码: cpp BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); // 初始化 ListControl 控件 m_listCtrl.Create(WS_VISIBLE | WS_BORDER | LVS_REPORT, CRect(10, 10, 300, 200), this, 1234); m_listCtrl.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 100); m_listCtrl.InsertColumn(1, _T("Age"), LVCFMT_LEFT, 100); m_listCtrl.InsertColumn(2, _T("Gender"), LVCFMT_LEFT, 100); // 添加数据 m_listCtrl.InsertItem(0, _T("Tom")); m_listCtrl.SetItemText(0, 1, _T("20")); m_listCtrl.SetItemText(0, 2, _T("Male")); m_listCtrl.InsertItem(1, _T("Mary")); m_listCtrl.SetItemText(1, 1, _T("25")); m_listCtrl.SetItemText(1, 2, _T("Female")); return TRUE; } 这段代码将创建一个 ListControl 控件,并添加三列数据:Name、Age 和 Gender。你可以根据自己的需要修改这些列的名称和宽度。然后,添加两行数据:Tom 和 Mary。 最后,你需要在你的对话框类的头文件中添加以下代码,以处理 ListControl 控件的通知消息: cpp class CMyDialog : public CDialog { // ... private: afx_msg void OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult); // 处理 ListControl 的通知消息 DECLARE_MESSAGE_MAP() }; 在你的对话框类的实现文件中,添加以下代码: cpp BEGIN_MESSAGE_MAP(CMyDialog, CDialog) ON_NOTIFY(LVN_ITEMCHANGED, 1234, &CMyDialog::OnLvnItemchangedList1) END_MESSAGE_MAP() void CMyDialog::OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // 获取选中的行和列 int nItem = pNMLV->iItem; int nSubItem = pNMLV->iSubItem; // 获取选中的单元格的文本 CString strText = m_listCtrl.GetItemText(nItem, nSubItem); // 显示选中的单元格的文本 AfxMessageBox(strText); *pResult = 0; } 这段代码将处理 ListControl 的通知消息,并在用户选中某个单元格时显示该单元格的文本。 这就是一个简单的 MFC ListControl 的用法示例。希望能对你有所帮助!
在MFC中,要在List Control中插入Check Button按钮,可以通过以下步骤实现: 1. 首先,在资源视图中,打开对话框的资源文件。选择List Control控件,设置其为“报表”风格。 2. 在对话框的OnInitDialog函数中,使用CListCtrl类的SubclassDlgItem函数将List Control控件关联到CListCtrl对象。 m_ListCtrl.SubclassDlgItem(IDC_LIST_CONTROL, this); 3. 调用CListCtrl对象的InsertColumn函数添加列头信息。 m_ListCtrl.InsertColumn(0, _T("列1"), LVCFMT_LEFT, 150); m_ListCtrl.InsertColumn(1, _T("列2"), LVCFMT_LEFT, 100); 4. 使用LVS_EX_CHECKBOXES样式来启用List Control中的Check Box功能。 m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle() | LVS_EX_CHECKBOXES); 5. 调用CListCtrl对象的InsertItem函数插入行,并使用SetItemText函数设置每行中列的文本内容。 int nItemIndex = m_ListCtrl.InsertItem(0, _T("行1")); m_ListCtrl.SetItemText(nItemIndex, 1, _T("列1内容")); 6. 调用CListCtrl对象的SetCheck函数来设置或清除Check Box的选中状态。 m_ListCtrl.SetCheck(nItemIndex, TRUE); 7. 如果需要处理Check Box的状态变化事件,可以使用NM_CLICK或NM_DBLCLK等消息处理函数,通过调用CListCtrl对象的GetCheck函数获取Check Box的状态。 void CMyDialog::OnClickListControl(NMHDR *pNMHDR, LRESULT *pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(2)) { // Check Box被选中 } else { // Check Box被清除 } *pResult = 0; } 通过以上步骤,就可以在MFC中的List Control中插入Check Box按钮,并对其状态进行操作。
MFC 中实现搜索框需要用到 Edit Control 和 List Control,具体做法如下: 1. 在对话框资源中添加 Edit Control 和 List Control 控件,分别设置 ID 为 IDC_SEARCH 和 IDC_LIST。 2. 在对话框类中添加成员变量,分别为 Edit Control 和 List Control 控件的指针: c++ CEdit* m_pEditSearch; CListCtrl* m_pListCtrl; 3. 在 OnInitDialog 函数中获取 Edit Control 和 List Control 控件的指针,并为 Edit Control 控件添加消息响应函数: c++ BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 获取 Edit Control 和 List Control 控件的指针 m_pEditSearch = (CEdit*)GetDlgItem(IDC_SEARCH); m_pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST); // 为 Edit Control 控件添加消息响应函数 m_pEditSearch->ModifyStyle(0, ES_SEARCH); return TRUE; } 4. 在 Edit Control 控件的消息响应函数中处理搜索逻辑: c++ void CMyDialog::OnEnChangeSearch() { CString strSearch; m_pEditSearch->GetWindowText(strSearch); m_pListCtrl->DeleteAllItems(); // 清空 List Control 控件 // 在 List Control 控件中搜索匹配的项 for (int i = 0; i < m_pListCtrl->GetItemCount(); i++) { CString strItem = m_pListCtrl->GetItemText(i, 0); if (strItem.Find(strSearch) != -1) { m_pListCtrl->SetItemState(i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_pListCtrl->EnsureVisible(i, FALSE); } } } 在 Edit Control 控件的 OnEnChange 消息响应函数中获取 Edit Control 控件中的文本,并遍历 List Control 控件中的所有项,如果找到匹配的项,则设置该项为选中状态并滚动到该项。注意,需要在 List Control 控件中添加列并添加项才能进行搜索。 以上是 MFC 中实现搜索框的基本做法,需要根据具体需求进行修改和优化。
MFC(Microsoft Foundation Classes)是微软公司在Windows操作系统下提供的一套图形化界面应用程序开发框架,可以用于快速开发Windows应用程序。下面是一个基于MFC的学生信息管理系统的C++代码框架。 首先,需要定义一个学生类,包含姓名、学号、年龄等属性: cpp class CStudent { public: CString m_strName; // 姓名 CString m_strID; // 学号 int m_nAge; // 年龄 // 其他属性 // 构造函数 CStudent() { m_nAge = 0; // 其他属性的初始化 } // 析构函数 ~CStudent() { } }; 然后,需要定义一个学生信息管理系统的主界面类,包含添加学生、删除学生、修改学生、查询学生等功能: cpp class CStudentMgmtDlg : public CDialogEx { public: // 构造函数 CStudentMgmtDlg(CWnd* pParent = nullptr); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_STUDENTMGMT_DIALOG }; #endif protected: HICON m_hIcon; // 生成的消息映射函数 virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP() // 控件变量 CListCtrl m_lstStudent; CEdit m_editName; CEdit m_editID; CEdit m_editAge; // 其他控件变量 // 学生列表 vector<CStudent> m_vecStudent; public: // 添加学生 void AddStudent(); // 删除学生 void DeleteStudent(); // 修改学生 void ModifyStudent(); // 查询学生 void QueryStudent(); // 初始化学生列表 void InitStudentList(); // 显示学生列表 void ShowStudentList(); // 其他函数 }; 接下来,需要实现主界面类的函数,具体实现可以参考下面的代码: cpp void CStudentMgmtDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_STUDENT, m_lstStudent); DDX_Control(pDX, IDC_EDIT_NAME, m_editName); DDX_Control(pDX, IDC_EDIT_ID, m_editID); DDX_Control(pDX, IDC_EDIT_AGE, m_editAge); // 其他控件的DDX操作 } BEGIN_MESSAGE_MAP(CStudentMgmtDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_ADD, &CStudentMgmtDlg::OnBnClickedButtonAdd) ON_BN_CLICKED(IDC_BUTTON_DELETE, &CStudentMgmtDlg::OnBnClickedButtonDelete) ON_BN_CLICKED(IDC_BUTTON_MODIFY, &CStudentMgmtDlg::OnBnClickedButtonModify) ON_BN_CLICKED(IDC_BUTTON_QUERY, &CStudentMgmtDlg::OnBnClickedButtonQuery) END_MESSAGE_MAP() void CStudentMgmtDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 中心图标 HICON hIcon = GetIcon(); RECT rect; GetClientRect(&rect); int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; dc.DrawIcon(x, y, hIcon); } else { CDialogEx::OnPaint(); } } HCURSOR CStudentMgmtDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CStudentMgmtDlg::AddStudent() { // 从控件获取学生信息 CString strName, strID, strAge; m_editName.GetWindowText(strName); m_editID.GetWindowText(strID); m_editAge.GetWindowText(strAge); // 创建学生对象并添加到列表中 CStudent student; student.m_strName = strName; student.m_strID = strID; student.m_nAge = _ttoi(strAge); m_vecStudent.push_back(student); // 刷新学生列表 ShowStudentList(); } void CStudentMgmtDlg::DeleteStudent() { // 获取选中的学生 int nIndex = m_lstStudent.GetSelectionMark(); if (nIndex == -1) { AfxMessageBox(_T("请选择要删除的学生")); return; } // 删除学生 m_vecStudent.erase(m_vecStudent.begin() + nIndex); // 刷新学生列表 ShowStudentList(); } void CStudentMgmtDlg::ModifyStudent() { // 获取选中的学生 int nIndex = m_lstStudent.GetSelectionMark(); if (nIndex == -1) { AfxMessageBox(_T("请选择要修改的学生")); return; } // 修改学生信息 CString strName, strID, strAge; m_editName.GetWindowText(strName); m_editID.GetWindowText(strID); m_editAge.GetWindowText(strAge); m_vecStudent[nIndex].m_strName = strName; m_vecStudent[nIndex].m_strID = strID; m_vecStudent[nIndex].m_nAge = _ttoi(strAge); // 刷新学生列表 ShowStudentList(); } void CStudentMgmtDlg::QueryStudent() { // 获取查询条件 CString strName, strID, strAge; m_editName.GetWindowText(strName); m_editID.GetWindowText(strID); m_editAge.GetWindowText(strAge); // 根据条件查询学生 vector<CStudent> vecResult; for (int i = 0; i < m_vecStudent.size(); i++) { CStudent student = m_vecStudent[i]; if (strName.IsEmpty() || student.m_strName == strName) { if (strID.IsEmpty() || student.m_strID == strID) { if (strAge.IsEmpty() || student.m_nAge == _ttoi(strAge)) { vecResult.push_back(student); } } } } // 显示查询结果 m_vecStudent = vecResult; ShowStudentList(); } void CStudentMgmtDlg::InitStudentList() { // 设置列表样式 m_lstStudent.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); m_lstStudent.InsertColumn(0, _T("姓名"), LVCFMT_CENTER, 100); m_lstStudent.InsertColumn(1, _T("学号"), LVCFMT_CENTER, 100); m_lstStudent.InsertColumn(2, _T("年龄"), LVCFMT_CENTER, 100); // 添加其他列 // 初始时显示所有学生 m_vecStudent.push_back(CStudent(_T("张三"), _T("001"), 18)); m_vecStudent.push_back(CStudent(_T("李四"), _T("002"), 20)); m_vecStudent.push_back(CStudent(_T("王五"), _T("003"), 22)); ShowStudentList(); } void CStudentMgmtDlg::ShowStudentList() { // 清空列表 m_lstStudent.DeleteAllItems(); // 添加学生到列表中 for (int i = 0; i < m_vecStudent.size(); i++) { CStudent student = m_vecStudent[i]; int nIndex = m_lstStudent.InsertItem(0, student.m_strName); m_lstStudent.SetItemText(nIndex, 1, student.m_strID); m_lstStudent.SetItemText(nIndex, 2, CString(student.m_nAge)); // 设置其他列的内容 } } 最后,在应用程序类中创建主界面类对象,启动应用程序: cpp class CStudentMgmtApp : public CWinApp { public: CStudentMgmtApp(); public: virtual BOOL InitInstance(); private: CStudentMgmtDlg m_dlgMain; }; CStudentMgmtApp theApp; CStudentMgmtApp::CStudentMgmtApp() { } BOOL CStudentMgmtApp::InitInstance() { // 初始化MFC库 AfxEnableControlContainer(); // 创建主界面对象 m_dlgMain.Create(IDD_STUDENTMGMT_DIALOG); m_dlgMain.ShowWindow(SW_SHOW); // 进入消息循环 return TRUE; } 这样,一个基于MFC的学生信息管理系统就完成了。需要注意的是,上面的代码只是一个框架,需要根据实际需求进行完善和修改。
以下是一个完整的实例代码,包括注释: // Commodity_testDlg.h : 头文件 // #pragma once #include "InputInfoDialog.h" #include "ShowGoods.h" // CCommoditytestDlg 对话框 class CCommoditytestDlg : public CDialogEx { // 构造 public: CCommoditytestDlg(CWnd* pParent = nullptr); // 标准构造函数 // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_COMMODITY_TEST_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: HICON m_hIcon; CTreeCtrl m_TreeCtrl; // 树形控件变量 // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() // 新增的函数 void InitTreeCtrl(); // 初始化树形控件 void OnNodeSelected(HTREEITEM hItem); // 树形控件节点被选中的处理函数 void InsertDataToList(CString strID, CString strName, CString strCount, CString strPrice); // 将数据插入到列表控件中 void ClearListData(); // 清空列表控件数据 // 声明子对话框变量 CInputInfoDialog m_InputInfoDlg; CShowGoods m_ShowGoodsDlg; public: afx_msg void OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult); }; // Commodity_testDlg.cpp : 实现文件 // #include "pch.h" #include "framework.h" #include "Commodity_test.h" #include "Commodity_testDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CCommoditytestDlg 对话框 CCommoditytestDlg::CCommoditytestDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_COMMODITY_TEST_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CCommoditytestDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE, m_TreeCtrl); } BEGIN_MESSAGE_MAP(CCommoditytestDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, &CCommoditytestDlg::OnTvnSelchangedTree) END_MESSAGE_MAP() // CCommoditytestDlg 消息处理程序 BOOL CCommoditytestDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将大括号拆分成两行,以便阅读 { // 将图标设置为对话框的图标 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // 初始化树形控件 InitTreeCtrl(); } // 将大括号拆分成两行,以便阅读 { // 将子对话框居中 CRect rc; GetClientRect(rc); rc.DeflateRect(10, 60, 10, 10); m_InputInfoDlg.MoveWindow(rc); // 显示主对话框 ShowWindow(SW_SHOW); // 显示子对话框 m_InputInfoDlg.ShowWindow(SW_SHOW); } return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CCommoditytestDlg::InitTreeCtrl() { // 获取根节点 HTREEITEM hRoot = m_TreeCtrl.InsertItem(_T("商品管理")); // 添加子节点 HTREEITEM hItem = m_TreeCtrl.InsertItem(_T("录入商品库存信息"), hRoot); m_TreeCtrl.InsertItem(_T("子节点1"), hItem); m_TreeCtrl.InsertItem(_T("子节点2"), hItem); hItem = m_TreeCtrl.InsertItem(_T("显示已录入商品库存信息"), hRoot); m_TreeCtrl.InsertItem(_T("子节点3"), hItem); m_TreeCtrl.InsertItem(_T("子节点4"), hItem); // 展开根节点 m_TreeCtrl.Expand(hRoot, TVE_EXPAND); } void CCommoditytestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } HCURSOR CCommoditytestDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CCommoditytestDlg::OnNodeSelected(HTREEITEM hItem) { // 获取节点的文本 CString strText = m_TreeCtrl.GetItemText(hItem); // 根据节点的文本选择对应的子对话框 if (strText == _T("录入商品库存信息")) { m_InputInfoDlg.ShowWindow(SW_SHOW); m_ShowGoodsDlg.ShowWindow(SW_HIDE); } else if (strText == _T("显示已录入商品库存信息")) { m_InputInfoDlg.ShowWindow(SW_HIDE); m_ShowGoodsDlg.ShowWindow(SW_SHOW); // 清空列表控件数据 ClearListData(); } } void CCommoditytestDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); // 获取选中的节点 HTREEITEM hItem = m_TreeCtrl.GetSelectedItem(); // 处理选中的节点 OnNodeSelected(hItem); *pResult = 0; } void CCommoditytestDlg::InsertDataToList(CString strID, CString strName, CString strCount, CString strPrice) { // 获取列表控件 CListCtrl* pListCtrl = m_ShowGoodsDlg.GetListCtrl(); // 添加行 int nItem = pListCtrl->GetItemCount(); pListCtrl->InsertItem(nItem, strID); // 添加列 pListCtrl->SetItemText(nItem, 1, strName); pListCtrl->SetItemText(nItem, 2, strCount); pListCtrl->SetItemText(nItem, 3, strPrice); } void CCommoditytestDlg::ClearListData() { // 获取列表控件 CListCtrl* pListCtrl = m_ShowGoodsDlg.GetListCtrl(); // 清空所有行 pListCtrl->DeleteAllItems(); } // InputInfoDialog.h : 头文件 // #pragma once // CInputInfoDialog 对话框 class CInputInfoDialog : public CDialogEx { DECLARE_DYNAMIC(CInputInfoDialog) public: CInputInfoDialog(CWnd* pParent = nullptr); // 标准构造函数 virtual ~CInputInfoDialog(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_INPUT_INFO_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedOk(); private: CString m_strID; CString m_strName; CString m_strCount; CString m_strPrice; }; // InputInfoDialog.cpp : 实现文件 // #include "pch.h" #include "Commodity_test.h" #include "InputInfoDialog.h" #include "afxdialogex.h" // CInputInfoDialog 对话框 IMPLEMENT_DYNAMIC(CInputInfoDialog, CDialogEx) CInputInfoDialog::CInputInfoDialog(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_INPUT_INFO_DIALOG, pParent) { } CInputInfoDialog::~CInputInfoDialog() { } void CInputInfoDialog::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_ID, m_strID); DDX_Text(pDX, IDC_NAME, m_strName); DDX_Text(pDX, IDC_COUNT, m_strCount); DDX_Text(pDX, IDC_PRICE, m_strPrice); } BEGIN_MESSAGE_MAP(CInputInfoDialog, CDialogEx) ON_BN_CLICKED(IDOK, &CInputInfoDialog::OnBnClickedOk) END_MESSAGE_MAP() // CInputInfoDialog 消息处理程序 void CInputInfoDialog::OnBnClickedOk() { // 获取编辑框的值 UpdateData(TRUE); // 进行数据校验 // ... // 将数据插入到列表控件中 ((CCommoditytestDlg*)GetParent())->InsertDataToList(m_strID, m_strName, m_strCount, m_strPrice); // 插入成功,提示“插入成功”,否则提示“插入失败” // ... CDialogEx::OnOK(); } // ShowGoods.h : 头文件 // #pragma once // CShowGoods 对话框 class CShowGoods : public CDialogEx { DECLARE_DYNAMIC(CShowGoods) public: CShowGoods(CWnd* pParent = nullptr); // 标准构造函数 virtual ~CShowGoods(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_SHOW_GOODS }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: CListCtrl m_ListCtrl; virtual BOOL OnInitDialog(); }; // ShowGoods.cpp : 实现文件 // #include "pch.h" #include "Commodity_test.h" #include "ShowGoods.h" #include "afxdialogex.h" // CShowGoods 对话框 IMPLEMENT_DYNAMIC(CShowGoods, CDialogEx) CShowGoods::CShowGoods(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_SHOW_GOODS, pParent) { } CShowGoods::~CShowGoods() { } void CShowGoods::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST, m_ListCtrl); } BEGIN_MESSAGE_MAP(CShowGoods, CDialogEx) END_MESSAGE_MAP() // CShowGoods 消息处理程序 BOOL CShowGoods::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置列表控件的样式和列标题 m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); m_ListCtrl.InsertColumn(0, _T("商品ID"), LVCFMT_LEFT, 100); m_ListCtrl.InsertColumn(1, _T("商品名称"), LVCFMT_LEFT, 100); m_ListCtrl.InsertColumn(2, _T("商品数量"), LVCFMT_LEFT, 100); m_ListCtrl.InsertColumn(3, _T("商品价格"), LVCFMT_LEFT, 100); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }
以下是一个简单的MFC对话框通讯录系统的C++代码示例: 首先,创建一个MFC对话框应用程序,然后在资源视图中添加一个对话框资源以及需要的控件(如编辑框,列表框,按钮等)。 打开对话框的头文件(例如“MyDlg.h”),添加以下代码: c++ #include <vector> #include <string> struct Contact { std::string name; std::string phone; }; class CMyDlg : public CDialog { public: CMyDlg(CWnd* pParent = nullptr); // 构造函数 enum { IDD = IDD_MY_DIALOG }; // 对话框标识符 protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() private: CEdit m_editName; CEdit m_editPhone; CListBox m_listContacts; std::vector<Contact> m_contacts; // 储存联系人信息 public: afx_msg void OnBnClickedBtnAdd(); // 添加联系人按钮的点击事件处理函数 afx_msg void OnBnClickedBtnDelete(); // 删除联系人按钮的点击事件处理函数 }; 然后,在“MyDlg.cpp”文件中,添加以下代码: c++ #include "MyDlg.h" #include "afxdialogex.h" CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/) : CDialog(IDD_MY_DIALOG, pParent) { } void CMyDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_NAME, m_editName); DDX_Control(pDX, IDC_EDIT_PHONE, m_editPhone); DDX_Control(pDX, IDC_LIST_CONTACTS, m_listContacts); } BEGIN_MESSAGE_MAP(CMyDlg, CDialog) ON_BN_CLICKED(IDC_BTN_ADD, &CMyDlg::OnBnClickedBtnAdd) ON_BN_CLICKED(IDC_BTN_DELETE, &CMyDlg::OnBnClickedBtnDelete) END_MESSAGE_MAP() void CMyDlg::OnBnClickedBtnAdd() { CString name, phone; m_editName.GetWindowText(name); m_editPhone.GetWindowText(phone); if (!name.IsEmpty() && !phone.IsEmpty()) { Contact contact; contact.name = CT2A(name); contact.phone = CT2A(phone); m_contacts.push_back(contact); m_listContacts.AddString(name); } } void CMyDlg::OnBnClickedBtnDelete() { int index = m_listContacts.GetCurSel(); if (index != LB_ERR) { m_listContacts.DeleteString(index); m_contacts.erase(m_contacts.begin() + index); } } 在这个示例中,我们创建了一个Contact结构体,用于储存每个联系人的姓名和电话号码。在对话框中,我们添加了两个编辑框(用于输入姓名和电话号码),一个列表框(用于显示联系人列表)以及两个按钮(用于添加和删除联系人)。 在添加联系人按钮的点击事件处理函数中,我们获取编辑框中输入的姓名和电话号码,如果两个值都不为空,则创建一个新的Contact对象,将其添加到联系人列表中,并将姓名添加到列表框中。 在删除联系人按钮的点击事件处理函数中,我们获取当前选中的联系人在列表框中的索引,如果存在选中的联系人,则从列表框和联系人列表中删除该联系人。 这只是一个简单的示例,您可以根据需要添加更多的功能和控件。
VC6.0虽然已经很老了,但是仍然可以使用MFC来进行开发,以下是一个简单的MFC对话框通讯录系统的C++代码示例: 首先,创建一个MFC对话框应用程序,然后在资源视图中添加一个对话框资源以及需要的控件(如编辑框,列表框,按钮等)。 打开对话框的头文件(例如“MyDlg.h”),添加以下代码: c++ #include <vector> #include <string> struct Contact { std::string name; std::string phone; }; class CMyDlg : public CDialog { public: CMyDlg(CWnd* pParent = nullptr); // 构造函数 enum { IDD = IDD_MY_DIALOG }; // 对话框标识符 protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() private: CEdit m_editName; CEdit m_editPhone; CListBox m_listContacts; std::vector<Contact> m_contacts; // 储存联系人信息 public: afx_msg void OnBnClickedBtnAdd(); // 添加联系人按钮的点击事件处理函数 afx_msg void OnBnClickedBtnDelete(); // 删除联系人按钮的点击事件处理函数 afx_msg void OnBnClickedBtnEdit(); // 编辑联系人按钮的点击事件处理函数 afx_msg void OnBnClickedBtnSearch(); // 查询联系人按钮的点击事件处理函数 }; 然后,在“MyDlg.cpp”文件中,添加以下代码: c++ #include "MyDlg.h" #include "afxdialogex.h" CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/) : CDialog(IDD_MY_DIALOG, pParent) { } void CMyDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_NAME, m_editName); DDX_Control(pDX, IDC_EDIT_PHONE, m_editPhone); DDX_Control(pDX, IDC_LIST_CONTACTS, m_listContacts); } BEGIN_MESSAGE_MAP(CMyDlg, CDialog) ON_BN_CLICKED(IDC_BTN_ADD, &CMyDlg::OnBnClickedBtnAdd) ON_BN_CLICKED(IDC_BTN_DELETE, &CMyDlg::OnBnClickedBtnDelete) ON_BN_CLICKED(IDC_BTN_EDIT, &CMyDlg::OnBnClickedBtnEdit) ON_BN_CLICKED(IDC_BTN_SEARCH, &CMyDlg::OnBnClickedBtnSearch) END_MESSAGE_MAP() void CMyDlg::OnBnClickedBtnAdd() { CString name, phone; m_editName.GetWindowText(name); m_editPhone.GetWindowText(phone); if (!name.IsEmpty() && !phone.IsEmpty()) { Contact contact; contact.name = CT2A(name); contact.phone = CT2A(phone); m_contacts.push_back(contact); m_listContacts.AddString(name); } } void CMyDlg::OnBnClickedBtnDelete() { int index = m_listContacts.GetCurSel(); if (index != LB_ERR) { m_listContacts.DeleteString(index); m_contacts.erase(m_contacts.begin() + index); } } void CMyDlg::OnBnClickedBtnEdit() { int index = m_listContacts.GetCurSel(); if (index != LB_ERR) { CString name, phone; m_editName.GetWindowText(name); m_editPhone.GetWindowText(phone); if (!name.IsEmpty() && !phone.IsEmpty()) { Contact contact; contact.name = CT2A(name); contact.phone = CT2A(phone); m_contacts[index] = contact; m_listContacts.DeleteString(index); m_listContacts.InsertString(index, name); m_listContacts.SetCurSel(index); } } } void CMyDlg::OnBnClickedBtnSearch() { CString name; m_editName.GetWindowText(name); if (!name.IsEmpty()) { for (size_t i = 0; i < m_contacts.size(); i++) { if (m_contacts[i].name == CT2A(name)) { m_listContacts.SetCurSel(i); m_editPhone.SetWindowText(m_contacts[i].phone.c_str()); return; } } MessageBox(_T("未找到该联系人"), _T("提示"), MB_OK); } } 在这个示例中,我们创建了一个Contact结构体,用于储存每个联系人的姓名和电话号码。在对话框中,我们添加了两个编辑框(用于输入姓名和电话号码),一个列表框(用于显示联系人列表)以及四个按钮(用于添加、删除、编辑和查询联系人)。 在添加联系人按钮的点击事件处理函数中,我们获取编辑框中输入的姓名和电话号码,如果两个值都不为空,则创建一个新的Contact对象,将其添加到联系人列表中,并将姓名添加到列表框中。 在删除联系人按钮的点击事件处理函数中,我们获取当前选中的联系人在列表框中的索引,如果存在选中的联系人,则从列表框和联系人列表中删除该联系人。 在编辑联系人按钮的点击事件处理函数中,我们获取当前选中的联系人在列表框中的索引,如果存在选中的联系人,并且编辑框中输入的姓名和电话号码都不为空,则更新该联系人的信息,并将其在列表框中的显示名称更新为新的姓名。 在查询联系人按钮的点击事件处理函数中,我们获取编辑框中输入的姓名,如果该姓名在联系人列表中存在,则将其在列表框中选中,并将其电话号码显示在电话号码编辑框中,否则弹出提示框。 这只是一个简单的示例,您可以根据需要添加更多的功能和控件。请注意,在VC6.0中使用Unicode字符集时,CString的构造函数参数需要使用CT2A宏进行转换。
好的,您可以使用 MFC 中的 CListCtrl 控件实现这个表格。首先,在 Visual Studio 中新建一个 MFC 应用程序,然后在对话框资源中添加一个 List Control 控件。 接着,在您的对话框类头文件中添加以下代码: cpp #include <vector> class CMyDlg : public CDialogEx { public: CMyDlg(CWnd* pParent = nullptr); // 标准构造函数 virtual ~CMyDlg(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MY_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() private: CListCtrl m_listCtrl; std::vector<CString> m_data; // 保存要显示的数据 }; 然后在您的对话框类实现文件中添加以下代码: cpp BOOL CMyDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 初始化 List Control 控件 m_listCtrl.Create(WS_VISIBLE | WS_TABSTOP | WS_CHILD | LVS_REPORT | LVS_SHOWSELALWAYS, CRect(10, 10, 400, 300), this, IDC_LIST_CTRL); m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES); // 添加表头 m_listCtrl.InsertColumn(0, _T("Checkbox"), LVCFMT_LEFT, 100); m_listCtrl.InsertColumn(1, _T("Data"), LVCFMT_LEFT, 200); // 添加行数据 m_data.push_back(_T("Data 1")); m_data.push_back(_T("Data 2")); m_data.push_back(_T("Data 3")); m_data.push_back(_T("Data 4")); m_data.push_back(_T("Data 5")); for (int i = 0; i < m_data.size(); i++) { int row = m_listCtrl.InsertItem(i, _T("")); m_listCtrl.SetItemText(row, 1, m_data[i]); } return TRUE; } void CMyDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_CTRL, m_listCtrl); } void CMyDlg::OnOK() { // 获取选中的行 for (int i = 0; i < m_data.size(); i++) { if (m_listCtrl.GetCheck(i)) { CString data = m_data[i]; // TODO: 处理选中的数据 } } CDialogEx::OnOK(); } 这样,您就可以在表格的第一列添加复选框,并且动态生成每一行的数据了。在对话框的 OnOK 函数中,您可以获取选中的行数据,并进行相应的处理。

最新推荐

0690、断线检测式报警电路.rar

0689、短路检测式报警电路.rar

全国34个省份2000-2021高技术产业投资-施工项目数.xlsx

数据年度2000-2021 数据范围:全国34个省份,含港澳台 数据年度:2000-2021,22个年度的数据 excel数据文件包原始数据(由于多年度指标不同存在缺失值)、线性插值、ARIMA填补三个版本,提供您参考使用。 其中,ARIMA回归填补无缺失值。 填补说明: 线性插值。利用数据的线性趋势,对各年份中间的缺失部分进行填充,得到线性插值版数据,这也是学者最常用的插值方式。 ARIMA回归填补。基于ARIMA模型,利用同一地区的时间序列数据,对缺失值进行预测填补。

ssm数据结构课程网络学习平台的+vue毕业论文.doc

ssm数据结构课程网络学习平台的+vue毕业论文.doc

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

Objective-C中的协议与代理设计模式介绍

# 1. 理解Objective-C中的协议 协议是Objective-C中一种很重要的特性,它类似于其他编程语言中的接口,用来定义对象之间的通信规则和行为约定。在Objective-C中,协议可以帮助实现对象之间的松耦合和重用性。让我们深入了解Objective-C中的协议。 ## 1.1 什么是Objective-C中的协议? 在Objective-C中,协议是一组方法的声明,定义了一个对象可以遵循的接口。协议本身并不实现任何方法,而是规定遵循该协议的类需要实现协议中定义的方法。通过协议,可以在不同的类之间定义一组公共的行为和方法。 ## 1.2 协议的声明和使用方法 在Ob

编写求n!的函数f(int n),在主函数中输入两个整数m、n,然后调用函数求: C=m!/n!(m -n)!

好的,我可以编写这个函数。以下是代码示例: ```c++ #include <iostream> using namespace std; int f(int n) { if (n <= 1) { return 1; } else { return n * f(n - 1); } } int main() { int m, n; cout << "请输入两个整数m和n,以空格分隔:" << endl; cin >> m >> n; int C = f(m) / (f(n) * f(m - n));

视频中运动目标跟踪算法的研究.doc

视频中运动目标跟踪算法的研究.doc

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依

Objective-C中的推送通知与APNs实现

# 1. 推送通知简介 推送通知是移动应用开发中常用的一种技术,它可以向用户发送消息、提醒或通知,即使用户并未在使用应用时也能及时获取重要信息。在Objective-C中,实现推送通知需要使用苹果提供的苹果推送通知服务(APNs)。本章将介绍推送通知的基础知识,包括推送通知的概念、作用和原理。接下来我们将深入了解。 ### 1.1 什么是推送通知 推送通知是通过网络将消息发送到设备的一种技术。应用程序可以向设备发送推送通知,无论用户当前是否在使用该应用,都可以及时获取到消息或通知。用户收到推送通知后,可以通过通知中的内容了解到消息的来源和内容,以便及时处理。 ### 1.2 推送通知的

php中,跳转语句有break和contimue

其实,`break`和`continue`并不是跳转语句,它们是用于控制循环语句的关键字。 `break`用于中断循环,跳出当前循环结构(如`for`、`while`、`do-while`),执行循环结构后面的语句。如果`break`语句后面跟着一个数字n,则表示跳出第n层循环。例如: ``` for ($i = 0; $i < 10; $i++) { for ($j = 0; $j < 10; $j++) { if ($j == 5) { break 2; // 跳出两层循环 } } } ``` `continue