15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

 

Возможность перетаскивания элементов в List Control


Автор: Jean Claude Dauphin.

Возможности

Это расширенный элемент управления позволяет перетаскивать элементы между списками при помощи OLE. Программист может разрешать/запрещать локальное перетаскивание элементов (т.е. в одном и том же списке, автоматический скролинг и удаление перенесённых элементов из исходного списка.

Использование элемента

  1. Инициализируем библиотеку OLE в функции InitInstance Вашего приложения:
    BOOL CDdDemoApp::InitInstance()
    {
     AfxEnableControlContainer();
    #ifdef _AFXDLL
     // Call this when using MFC in a shared DLL
     Enable3dControls(); 
    #else
     // Call this when linking to MFC statically
     Enable3dControlsStatic(); 
    #endif
    
     //-------------------------
     // Initialize OLE libraries
     //-------------------------
     if (!AfxOleInit())
      return FALSE;
  2. Вставляем #include "DDListCtrl.h" в файл описывающий главный диалог приложения и содержащий Списки.
  3. В функции OnInitDialog диалога, инициализируем и создаём собственную инициалицию списков по следующему шаблону:
    BOOL CDdDemoDlg::OnInitDialog()
    {
     CDialog::OnInitDialog();
    
     //.................................
    
     //---------------------------->
     // 1 - Subclass the list controls
     //----------------------------
     m_listVars.SubclassDlgItem(IDC_LIST_VAR, this);
     m_listRows.SubclassDlgItem(IDC_LIST_ROWS, this);
     m_listCols.SubclassDlgItem(IDC_LIST_COLS, this);
     m_listData.SubclassDlgItem(IDC_LIST_DATA, this);
     m_listPages.SubclassDlgItem(IDC_LIST_PAGES, this);
      
     //--------------------------------------------------------------
     // 2 - Инициализируем списки
     //--------------------------------------------------------------
     CString s(TCHAR('M'),29);
     int len = m_listVars.GetStringWidth(s)+15;
     LV_COLUMN lvC;
     lvC.mask = LVCF_FMT | LVCF_WIDTH;
     lvC.fmt  = LVCFMT_LEFT;  // колонка выравнена влево
     lvC.cx   = len;          // Ширина колонки в пикселях
     if (m_listVars.InsertColumn(0,&lvC) == -1)
      return FALSE;
    
     m_listVars.DeleteAllItems();
    
     m_listVars.SetLocalDD(FALSE);   // Запрещаем локальный Drag&Drop
     m_listVars.SetScrolling(FALSE); // и авто скроллирование
    
     // Create a column for the row variables list view control.
     if (m_listRows.InsertColumn(0,&lvC) == -1)
      return FALSE;
    
     m_listRows.DeleteAllItems();
    
     // Create a column for the column variables list view control.
     if (m_listCols.InsertColumn(0,&lvC) == -1)
      return FALSE;
    
     m_listCols.DeleteAllItems();
    
     // Create a column for the data variables list view control.
     if (m_listData.InsertColumn(0,&lvC) == -1)
      return FALSE;
    
     m_listData.DeleteAllItems();
    
     // Create a column for the page variables view control.
     if (m_listPages.InsertColumn(0,&lvC) == -1)
      return FALSE;
      
     m_listPages.DeleteAllItems();
    
     //------------------------------------------
     // 3 - Устанавливаем содержимое списка
     //------------------------------------------
     CWordArray aVars;
     int size = m_pSelectInfo->m_asNames.GetSize();
     aVars.SetSize(size);
     // Initially the list of available variables contains all variables
     for (int i=0; i<size; i++)
      aVars[i] = i;
    
     // Заполняем список переменных
     m_pData->FillListCtrl(m_listVars, aVars);
     m_pData->FillListCtrl(m_listRows, m_pSelectInfo->m_aRowsVar); 
     m_pData->FillListCtrl(m_listCols, m_pSelectInfo->m_aColsVar);  
     m_pData->FillListCtrl(m_listData, m_pSelectInfo->m_aDataVar); 
     m_pData->FillListCtrl(m_listPages, m_pSelectInfo->m_aPagesVar); 
    
     //-----------------------------------------------
     // 4 - Инициализируем списки для перетаскивания (Drag&Drop)
     //-----------------------------------------------
     m_listVars.Initialize();
     m_listRows.Initialize();
     m_listCols.Initialize();
     m_listData.Initialize();
     m_listPages.Initialize();
     
     return TRUE;  
    }

Downloads

Скачать исходник - 9 Kb
Скачать демонстрашку - 32 Kb