Иногда нужно отобразить данные ввиде сетки, а в Windows нет нативной сетки, проблема решается засчёт ListView ну или CListCtrl:
Итак погнали...
1. Создадим проект MFC AppWizard и назавём MFCGrid:
2. Выберим Dialog Based:
3. Оставим 3D Controls, а заголовок окна пусть будет Grid Demo:
4. Назовём элементы управления как показано:
5. Добавим переменные:
6. Добавим события:
7. Настроем компонент CListCtrl, View должно быть Report:
Добавим в MFCGridDlg.h переменную int counter:
class CMFCGridDlg : public CDialog { private: int counter; };
Добавить код в MFCGridDlg.cpp:
BOOL CMFCGridDlg::OnInitDialog() { // TODO: Add extra initialization here m_People.InsertColumn(1, "ID", LVCFMT_LEFT, 100, -1); // Добавляем колонку ID m_People.InsertColumn(2, "Firstname", LVCFMT_LEFT, 100, 1); // Добавляем колонку Firstname m_People.InsertColumn(2, "Lastname", LVCFMT_LEFT, 100, 1); // Добавляем колонку Lastname this->counter = 0; } void CMFCGridDlg::OnBtnAdd() { // TODO: Add your control notification handler code here CString firstname; // Хранится имя CString lastname; // Хранится фамилия CString id; // Хранится Id // Проверяет если имя и фамилия содержит меньше символов, то отображает alert с сообщением if(m_Firstname.GetWindowTextLength() < 3 || m_Lastname.GetWindowTextLength() < 3) { AfxMessageBox("Firstname or Lastname must greater then 2 characters", MB_OK | MB_ICONEXCLAMATION); return; } m_Firstname.GetWindowText(firstname); // Считывет текст из поле Firstname и помещает в переменную firstname m_Lastname.GetWindowText(lastname); // Считывет текст из поле Lastname и помещает в переменную lastname this->counter++; // Увеличиваем счётчик id.Format("%d", this->counter); // Форматируем, и вставляем в строку int item = m_People.InsertItem(this->counter, id); // Добавляем новую строку в сетку m_People.SetItemText(item, 1, firstname); // Добавляем в соседне поле имя m_People.SetItemText(item, 2, lastname); // Добавляем в соседне поле фамилию m_Firstname.SetWindowText(""); // Очищаем поле m_Lastname.SetWindowText(""); // Очищаем поле } void CMFCGridDlg::OnBtnRemove() { // TODO: Add your control notification handler code here m_People.DeleteItem(0); // Это сделаю позже }
С OnBtnRemove я займусь позже, вуаля вот и результат: