Заставка

Программирование на старых и современных языках, а так-же дизайн

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



VS6.0, MFC, Сетка

Сообщений 1 страница 3 из 3

1

Иногда нужно отобразить данные ввиде сетки, а в Windows нет нативной сетки, проблема решается засчёт ListView ну или CListCtrl:
Итак погнали...
1. Создадим проект MFC AppWizard и назавём MFCGrid:
https://i.ibb.co/1zy6YRk/VS60-MFC-LISTVIEW-01-02-00-16-07-2021-min.jpg

2. Выберим Dialog Based:
https://i.ibb.co/gZRj60K/VS60-MFC-LISTVIEW-02-02-01-16-07-2021-min.jpg

3. Оставим 3D Controls, а заголовок окна пусть будет Grid Demo:
https://i.ibb.co/R91pZP4/VS60-MFC-LISTVIEW-03-02-01-16-07-2021-min.jpg

4. Назовём элементы управления как показано:
https://i.ibb.co/f1CPLZG/VS60-MFC-LISTVIEW-04-02-07-16-07-2021-min.jpg

5. Добавим переменные:
https://i.ibb.co/28WCgtm/VS60-MFC-LISTVIEW-05-02-15-16-07-2021-min.jpg

6. Добавим события:
https://i.ibb.co/3T3KqVq/VS60-MFC-LISTVIEW-06-02-16-16-07-2021-min.jpg

7. Настроем компонент CListCtrl, View должно быть Report:
https://i.ibb.co/NSy7zTX/VS60-MFC-LISTVIEW-07-02-24-16-07-2021-min.jpg

Добавим в 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 я займусь позже, вуаля вот и результат:
https://i.ibb.co/85NvWyt/VS60-MFC-LISTVIEW-08-02-55-16-07-2021-min.jpg

0

2

Вот доделаем удаление т.е. метод void CMFCGridDlg::OnBtnRemove():

Код:
void CMFCGridDlg::OnBtnRemove() 
{
  // TODO: Add your control notification handler code here
   POSITION pos;
   while(pos = m_People.GetFirstSelectedItemPosition()) {
      int nIndex = m_People.GetNextSelectedItem(pos);
      m_People.DeleteItem(nIndex);
   }
}

0

3

Улучшим наш код...
1. Кликним на сетку правой кнопкой, и нажмём на Events...:
https://i.ibb.co/SKgFWyc/VS60-MFC-GRID-16-55-20-07-2021-min.jpg

2. Вылезет диалоговое окно, выберем NM_CLICK и IDC_LST_PEOPLE:
https://i.ibb.co/C9CqPdX/VS60-MFC-GRID-16-59-20-07-2011-min.jpg

3. Нажмите на Add Handler, вылезет диалоговое окно Add Member Function:
https://i.ibb.co/8N72knP/VS60-MFC-GRID-17-06-20-07-2021-min.jpg

4. Вставим код:

Код:
void CMFCGridDlg::OnClickLstPeople(NMHDR* pNMHDR, LRESULT* pResult) 
{
  // TODO: Add your control notification handler code here	
  *pResult = 0;
  POSITION pos;
  pos = m_People.GetFirstSelectedItemPosition();
  int nIndex = m_People.GetNextSelectedItem(pos);
  AfxMessageBox(m_People.GetItemText(nIndex, 0) + " " + m_People.GetItemText(nIndex, 1) + " " + m_People.GetItemText(nIndex, 2));
}

Результат:
https://i.ibb.co/9gtjcGN/VS60-MFC-GRID-RESULT-17-42-20-07-2021-min-1.jpg

0