Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: программирование ListControl'a  (Прочитано 26704 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 16-03-2005 15:51 » 

Вопрос такой. Как сделать так чтобы, Пользователь мог печатать в ListControl. Я думаю так: Пишу обработчик события OnKeyDown для диалога, в нем я запоминаю код нажатой клавиши. Затем пишу обработчик KeyDownList -это для ListControl и там я использую код клавиши которую сохранил в OnKeyDown. Но вопрос в том как вывести этот код на ЛистКонтрол, а точнее даже не код клавиши, а символ соответсвующий этому коду?
Записан

ещё один вопрос ...
xelos
Гость
« Ответ #1 : 16-03-2005 16:08 » 

а ComboBox чем не подходит?
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 16-03-2005 16:14 » new

Я его не рассматривал. Я в этих всех Боксах, Контролах не шарю. Я до этого всегда Edit да Button использовал и хватало, а теперь не хватает.
C ComboBox проблем не будет? Щас посотрю.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 16-03-2005 16:33 » 

ComboBox совсем не подходит, мне нужен элемент управления где можно печатать и много. Также в случае перебора текста, чтобы скроллеры появлялись. Стоит отметить, что главное окно должно быть именно диалоговое.
Записан

ещё один вопрос ...
xelos
Гость
« Ответ #4 : 16-03-2005 16:41 » 

Rich Edit Control в таком случае?
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 16-03-2005 17:40 » 

Уже вожусь с ним.
Записан

ещё один вопрос ...
xelos
Гость
« Ответ #6 : 16-03-2005 18:21 » 

не забудь проинициализировать его - в момент создания, нужно вызвать функцию инициализации (в MFC, вроде, AfxRichEditInit2()). Иначе диалог не отобразится.
Записан
XandoX
Гость
« Ответ #7 : 16-03-2005 22:00 » 

а почему просто CEdit multyline неиспользовать? с ним проще работать ИМХО
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #8 : 17-03-2005 03:02 » 

Вопрос такой. Как сделать так чтобы, Пользователь мог печатать в ListControl. Я думаю так: Пишу обработчик события OnKeyDown для диалога, в нем я запоминаю код нажатой клавиши. Затем пишу обработчик KeyDownList -это для ListControl и там я использую код клавиши которую сохранил в OnKeyDown. Но вопрос в том как вывести этот код на ЛистКонтрол, а точнее даже не код клавиши, а символ соответсвующий этому коду?
Если речь идет о ListCtrl почему бы не поставить стиль LVS_EDITLABELS или я чего то не понимаю :\?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 17-03-2005 16:43 » 

Цитата
или я чего то не понимаю :\?
НЕ в тебе дело. Я же писал, я не очень разбираюсь во всех этих элементах окна, я не знаю всех их свойств и пр. Я никогда не задавался этим вопросом (возможно зря) и особо не извращался над элементами окна. Советуйте как лучше, удобней, проще, а я воспользуюсь советом Ага
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 17-03-2005 17:11 » 

Цитата
не забудь проинициализировать его - в момент создания, нужно вызвать функцию инициализации (в MFC, вроде, AfxRichEditInit2()). Иначе диалог не отобразится.
В смысле не отобразится? Вроде как появляется. Или ты имеешь ввиду я с ним работать не смогу?
Записан

ещё один вопрос ...
xelos
Гость
« Ответ #11 : 17-03-2005 17:59 » 

если появляется, значит все ок
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 19-03-2005 22:25 » 

Писал с помощью MFC, все было номально (Rich Edit отображался). Стал писать на АПИ и RichEdit перестал отображаться. Тыкался, мыкался, а потом вспомнил твои слова. Нашел я как точно пишется эта функция - AfxInitRichEdit(void), но когда я ее пишу компилятор выдает "undeclared identifier". Может подключить что надо или это не АПИ-шная функция? Но я так понял без нее мне никуда, т.к. Rich Edit совсем не хочет появляться.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 20-03-2005 13:32 » 

На МСДН лазил, но нашел только про AfxInitRichEdit(), такое ощущение что там все про МФЦ, но ничего про АПИ, хотя из меня плохой поисковик (или ищейка). Но результата нет, а он очень нужен. Как застваить RichEdit отобразиться?
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 20-03-2005 17:46 » 

Все разобрался. Если интересно, то на АПИ не инициализировать надо, а просто подключить RICHED32.dll и вроде все, наступает счастье Улыбаюсь.
Записан

ещё один вопрос ...
Александр Цикин
Гость
« Ответ #15 : 17-04-2005 08:54 » 

Сам класс CListControl подразумевает, что ты будешь работать со списком значений.
Если нужно только одно - то для этого есть CEdit.
Там надо только перезагрузить нажатие кнопки OK в диалоге.

Но если нужно работать со списком, рекомендую:
есть еще в галерее DBGrid control.
Он позволяет делать все, что выше было сказано.
Особливо, если тебе надо работать с таблицами.
И никаких особых обработчиков писать не надо - они там уже все есть  Улыбаюсь
Информация на http://www.firststeps.ru/mfc/steps/r.php?362

В свое время тоже долго мучался  Здесь была моя ладья...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 17-04-2005 14:18 » 

nikedeforest, доп инфа. Всё что начинается с Afx - MFC. Предок назфывался Application Framework X - отсюда приставка Afx.
Ищи в MSDN в разделе Paltform SDK - там все API ф-ции.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 18-04-2005 15:49 » 

Александр Цикин,  DBGrid controL это компонент что-ли какой-то? Название явно указывает на связь с БД это ничего?
 
Цитата
Всё что начинается с Afx - MFC.
Джон, да я уже понял, спасибо.
Записан

ещё один вопрос ...
fernir
Гость
« Ответ #18 : 18-04-2005 16:52 » 

Кстати есть классный Grid: MFCGridCtrl на сайте www.codeproject.com
Что касается ListCtrl, я тоже сталкивался с подобной проблемой - пришлось написать собственный класс который позволяет вводить данные в любую ячейку (по умолчанию можно вводить только в первый столбец). Если нужно могу выслать исходники ...
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 18-04-2005 17:07 » 

Если несложно, то выложи, сейчас пока не нужно, но посмотреть, чтобы в будущем применить, это очень даже неплохо Улыбаюсь.
ЗЫ: Ты исходники можешь выложить прямо в этой теме, для этого нужно кликнуть ссылку "ответить", затем
на загруженной стиранице "Additional options", в поле введешь адрес по которому находится архив с исходниками.
Это на случай если ты не знал Ага.
Записан

ещё один вопрос ...
fernir
Гость
« Ответ #20 : 19-04-2005 16:37 » 


К сожалению ссылки нет, так что придется не много по флудить ....
Кстати, использование класса простое - создается объект
GListCtrl some;
some. SetControl(IDC_LIST, this);
в принципе все, вынимать данные можно как из стандартного CListCtrl
/////////////////////////////////////////////////////////////////////////////////
class GEdit : public CEdit
{
public:
GEdit();
public:
CFont* m_pFont;
bool bFlag;
bool IsRedraw(){return bFlag;};
//{{AFX_VIRTUAL(GEdit)
//}}AFX_VIRTUAL
public:
virtual ~GEdit();
protected:
//{{AFX_MSG(GEdit)
afx_msg void OnKillfocus();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
class GListCtrl : public CListCtrl
{
public:
bool g_ro;
int g_i, g_si;
GListCtrl();
void SetControl(UINT ID, CWnd* parent);
void SetReadOnly(){g_ro = true;};
void SetReadWrite(){g_ro = false;};
bool IsReadOnly(){return g_ro;};
void SetColumnNames(CString* array, int count);
void SetTextXY(int x, int y, CString str);
public:
GEdit* g_edit;
public:
//{{AFX_VIRTUAL(GListCtrl)
//}}AFX_VIRTUAL
public:
virtual ~GListCtrl();
protected:
//{{AFX_MSG(GListCtrl)
afx_msg void OnDblclk(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
#include "stdafx.h"
#include "GListCtrl.h"
#define _ID_EDIT_ 2389
GListCtrl::GListCtrl()
{
g_edit = new GEdit;
}
GListCtrl::~GListCtrl()
{
if(g_edit->m_pFont)
g_edit->m_pFont->DeleteObject();
delete g_edit;
}
void GListCtrl::SetControl(UINT ID, CWnd* parent)
{
if(!SubclassDlgItem(ID, parent))
{
AfxMessageBox("Error");
}
DWORD dwFlag = GetWindowLong(m_hWnd, GWL_STYLE);
SetWindowLong(m_hWnd, GWL_STYLE, dwFlag|LVS_REPORT|WS_HSCROLL);
SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
RECT rc;
rc.left = 0;
rc.right = 0;
rc.top = 0;
rc.bottom = 0;
g_edit->Create(WS_CHILD|ES_AUTOHSCROLL|ES_LEFT|WS_BORDER, rc, parent, _ID_EDIT_);
VERIFY(g_edit->m_pFont->CreateFont(
   14, 0,   0,                         // nEscapement
   0,                         // nOrientation
   FW_NORMAL,                 // nWeight
   FALSE,                     // bItalic
   FALSE,                     // bUnderline
   0,                         // cStrikeOut
   ANSI_CHARSET,              // nCharSet
   OUT_DEFAULT_PRECIS,        // nOutPrecision
   CLIP_DEFAULT_PRECIS,       // nClipPrecision
   DEFAULT_QUALITY,           // nQuality
   DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
   "Arial"));
g_edit->SetFont(g_edit->m_pFont);
}
void GListCtrl::SetColumnNames(CString* array, int count)
{
if(this->GetItemCount())
this->DeleteAllItems();
while(this->GetHeaderCtrl()->GetItemCount())
this->DeleteColumn(0);
CDC* pDC = GetDC();
CSize width(0,0);
for(int i = 0; i<count; i++)
{
width = pDC->GetOutputTextExtent(array[i]);
this->InsertColumn(GetHeaderCtrl()->GetItemCount(), array[i],
LVCFMT_LEFT, width.cx+10);
}
}
void GListCtrl::SetTextXY(int x, int y, CString str)
{
SetItemText(y,x, str);
}
BEGIN_MESSAGE_MAP(GListCtrl, CListCtrl)
//{{AFX_MSG_MAP(GListCtrl)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
ON_WM_ERASEBKGND()
ON_WM_HSCROLL()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
GEdit::GEdit()
{
m_pFont = new CFont;
bFlag = false;
}
GEdit::~GEdit()
{
delete m_pFont;
}
BEGIN_MESSAGE_MAP(GEdit, CEdit)
//{{AFX_MSG_MAP(GEdit)
ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void GEdit::OnKillfocus()
{
ShowWindow(SW_HIDE);
bFlag = true;
}
void GListCtrl::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE lpItem;
lpItem = (LPNMITEMACTIVATE)pNMHDR;
LVHITTESTINFO info;
info.pt = lpItem->ptAction;
SubItemHitTest(&info);
if(info.iItem == -1)
{
return;
}
g_i = info.iItem;
g_si = info.iSubItem;
int posx = GetScrollPos(SB_HORZ);
int posy = GetScrollPos(SB_VERT);
RECT rc1, rc2, rc;
int x, y;
GetWindowRect(&rc);
GetParent()->ScreenToClient(&rc);
GetItemRect(0, &rc2, LVIR_LABEL);
x = rc.left;
int i;
for(i = 0; i<info.iSubItem; i++)
{
GetHeaderCtrl()->GetItemRect(i, &rc1);
x+=rc1.right-rc1.left;
}
x-=posx;
GetHeaderCtrl()->GetItemRect(0, &rc1);
y = rc.top+ rc1.bottom-rc1.top+info.iItem*(rc2.bottom-rc2.top);
y-=posy;
GetHeaderCtrl()->GetItemRect(i, &rc1);
g_edit->SetWindowPos(&wndTop, x,y, rc1.right-rc1.left, 18, SWP_SHOWWINDOW);
g_edit->SetWindowText(GetItemText(info.iItem, info.iSubItem));
RedrawWindow();
g_edit->SetFocus();
*pResult = 0;
}
BOOL GListCtrl::OnEraseBkgnd(CDC* pDC)
{
if(!g_edit->IsWindowVisible() && g_edit->IsRedraw())
{
CString str;
g_edit->GetWindowText(str);
SetTextXY(g_si, g_i, str);
RedrawWindow();
}
return CListCtrl::OnEraseBkgnd(pDC);
}
void GListCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
RedrawWindow();
CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
}
« Последнее редактирование: 17-04-2006 20:39 от Алексей1153 » Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 19-04-2005 17:02 » 

Цитата
так что придется не много по флудить ....
Ни фига не флуд. Все нормально. Пища для ума прибыла, спасибо Улыбаюсь.
Записан

ещё один вопрос ...
Billy
Гость
« Ответ #22 : 12-07-2007 07:10 » 

Есть вопрос по теме! Как в ListControle по дабл-клику получить либо индекс строки, а лучше инфу из строки по каторой щелканули. Перелапатил весь инет, ничего подобного найти несмог А черт его знает... - помогите решить вопросег.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #23 : 12-07-2007 22:04 » 

Да уж видать плохо искал... на codeguru codeproject смотрел? Там по нему всё от и до есть. Тем более такая ерундовина. А в MSDN заглядывал?

Самое главное - тебе нужно получить item - номер. Зная номер получаем доступ хоть к тексту GetItemText  хоть к данным GetItemData.

item передаётся в поле iItem параметра pNMHDR

Код:
void CMyDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

CString st = m_lst.GetItemText(pNMLV->iItem,0);

AfxMessageBox(st);

*pResult = 0;
}

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines