nikedeforest
|
|
« : 16-03-2005 15:51 » |
|
Вопрос такой. Как сделать так чтобы, Пользователь мог печатать в ListControl. Я думаю так: Пишу обработчик события OnKeyDown для диалога, в нем я запоминаю код нажатой клавиши. Затем пишу обработчик KeyDownList -это для ListControl и там я использую код клавиши которую сохранил в OnKeyDown. Но вопрос в том как вывести этот код на ЛистКонтрол, а точнее даже не код клавиши, а символ соответсвующий этому коду?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
xelos
Гость
|
|
« Ответ #1 : 16-03-2005 16:08 » |
|
а ComboBox чем не подходит?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #2 : 16-03-2005 16:14 » |
|
Я его не рассматривал. Я в этих всех Боксах, Контролах не шарю. Я до этого всегда Edit да Button использовал и хватало, а теперь не хватает. C ComboBox проблем не будет? Щас посотрю.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
nikedeforest
|
|
« Ответ #3 : 16-03-2005 16:33 » |
|
ComboBox совсем не подходит, мне нужен элемент управления где можно печатать и много. Также в случае перебора текста, чтобы скроллеры появлялись. Стоит отметить, что главное окно должно быть именно диалоговое.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
xelos
Гость
|
|
« Ответ #4 : 16-03-2005 16:41 » |
|
Rich Edit Control в таком случае?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #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
Опытный
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
|
|
« Ответ #9 : 17-03-2005 16:43 » |
|
или я чего то не понимаю :\?
НЕ в тебе дело. Я же писал, я не очень разбираюсь во всех этих элементах окна, я не знаю всех их свойств и пр. Я никогда не задавался этим вопросом (возможно зря) и особо не извращался над элементами окна. Советуйте как лучше, удобней, проще, а я воспользуюсь советом
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
nikedeforest
|
|
« Ответ #10 : 17-03-2005 17:11 » |
|
не забудь проинициализировать его - в момент создания, нужно вызвать функцию инициализации (в MFC, вроде, AfxRichEditInit2()). Иначе диалог не отобразится.
В смысле не отобразится? Вроде как появляется. Или ты имеешь ввиду я с ним работать не смогу?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
xelos
Гость
|
|
« Ответ #11 : 17-03-2005 17:59 » |
|
если появляется, значит все ок
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #12 : 19-03-2005 22:25 » |
|
Писал с помощью MFC, все было номально (Rich Edit отображался). Стал писать на АПИ и RichEdit перестал отображаться. Тыкался, мыкался, а потом вспомнил твои слова. Нашел я как точно пишется эта функция - AfxInitRichEdit(void), но когда я ее пишу компилятор выдает "undeclared identifier". Может подключить что надо или это не АПИ-шная функция? Но я так понял без нее мне никуда, т.к. Rich Edit совсем не хочет появляться.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
nikedeforest
|
|
« Ответ #13 : 20-03-2005 13:32 » |
|
На МСДН лазил, но нашел только про AfxInitRichEdit(), такое ощущение что там все про МФЦ, но ничего про АПИ, хотя из меня плохой поисковик (или ищейка). Но результата нет, а он очень нужен. Как застваить RichEdit отобразиться?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
nikedeforest
|
|
« Ответ #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В свое время тоже долго мучался
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #17 : 18-04-2005 15:49 » |
|
Александр Цикин, DBGrid controL это компонент что-ли какой-то? Название явно указывает на связь с БД это ничего? Всё что начинается с Afx - MFC.
Джон, да я уже понял, спасибо.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
fernir
Гость
|
|
« Ответ #18 : 18-04-2005 16:52 » |
|
Кстати есть классный Grid: MFCGridCtrl на сайте www.codeproject.comЧто касается ListCtrl, я тоже сталкивался с подобной проблемой - пришлось написать собственный класс который позволяет вводить данные в любую ячейку (по умолчанию можно вводить только в первый столбец). Если нужно могу выслать исходники ...
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #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
|
|
« Ответ #21 : 19-04-2005 17:02 » |
|
так что придется не много по флудить ....
Ни фига не флуд. Все нормально. Пища для ума прибыла, спасибо .
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Billy
Гость
|
|
« Ответ #22 : 12-07-2007 07:10 » |
|
Есть вопрос по теме! Как в ListControle по дабл-клику получить либо индекс строки, а лучше инфу из строки по каторой щелканули. Перелапатил весь инет, ничего подобного найти несмог - помогите решить вопросег.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
|