Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Edit Box или List Box?


Автор: murzzzzz 30.5.2005, 18:19
а если мне надо, чтобы в окне в процессе программы постепенно появлялся текст(список результатов выполнения вычислений), который, конечно же, пользователь не может изменять, то мне для этого нужно взять Edit Box или List Box? и какую функцию надо использовать, чтобы выводился этот текст? (с помощью CString,например:
Код

CString rez;
rez.Format("..."); //здесь будут записаны результаты расчета, 
                             //ну, я это все в цикл оформлю конечно же,
                             //ведь мне не меньше 50 строк надо таких

или в VC более рационально инфу выводить как-то по-другому) кстати, давно хотела спросить, понимает ли в VC cout и cin, если да, то в какие классы надо включить?

Автор: kometa_triatlon 30.5.2005, 21:17
murzzzzz
Что использовать - все равно. Можешь сделать едитбокс, поставить свойство read only и выводить текст - пользователь сменить не может. Для вывода используй функцию SetWindowText(LPCSTR text).
Хотя лучше вариант такой: в нужном месте размещаешь статический текст, удаляешь из него собственно текст. Потом так:
Код

SetDlgItemText(IDC_TEXT, str); 

IDC_TEXT - идентификатор статического текста.

Если нужен все-таки список, тогда лучше листбокс. У него есть функция AddString()
Код

CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LISTBOX);
pListBox->AddString(rez);

Автор: murzzzzz 31.5.2005, 22:45
Уважаемый kometa_triatlon, я сделала, вроде, так как Вы и сказали:
Код

    CString rez;    
    rez.Format("qwerty");
    СListBox* pListBox = (CListBox*)GetDlgItem(IDC_LISTBOX);    
    pListBox->AddString(rez);

и после компиляции мне сообщается, что IDC_LISTBOX' : undeclared identifier.
Если честно, я вообще не сильно поняла смысл строчки
Код

СListBox* pListBox = (CListBox*)GetDlgItem(IDC_LISTBOX);    

поэтому я вообще попробовала по-своему, по-ламерски)):
Код

    CString rez;    
    rez.Format("qwerty");
    CListBox p;
    p.Create(IDC_LISTBOX);
    p.AddString(rez);

первоначальный вариант был с пустой функцией p.Create() smile , но, конечно же не проколало, потому что она не может быть без параметров. подскажите пожалуйста, может вместо IDC_LISTBOX можно указать какой-либо другой параметр, или прописать его где-то в "Add Member"... или я вообще что-то не то пытаюсь написать... блин, как же противно ничего не знать!!!!! smile надеюсь, с Вашей помощью хоть чему-то научусь!

Автор: murzzzzz 31.5.2005, 23:29
кстати, я поняла смысл строки:
Код

СListBox* pListBox = (CListBox*)GetDlgItem(IDC_LISTBOX);

ну, в смысле в литературе нашла описание)). только в этой самой литературе чуть-чуть подругому, в нашем случае выглядело бы так:
Код

СListBox* pListBox = GetDlgItem (...);

а вместо троеточия должны быть не один, а 2 аргумента: 1-дескриптор диалогового окна(если бы еще знать, что это такое...smile) и 2-идентификатор ресурса, то бишь, как я понимаю, наш IDC_LISTBOX.
чем больше начинаю соображать, тем больше начинаю путаться во всем этом...и все-таки, как же надо правильно делать этот список??

Автор: bel_nikita 31.5.2005, 23:50
http://forum.vingrad.ru/index.php?showtopic=49419

Автор: kometa_triatlon 1.6.2005, 00:44
Цитата
и после компиляции мне сообщается, что IDC_LISTBOX' : undeclared identifier.

IDC_LISTBOX - идентификатор listBox'a с которым ты работаешь. Так что если у тебя его нет, то ничего не выйдет. Так что размещай на форме ЛистБокс, задавай ему идентификатор IDC_LISTBOX и тогда все получится.

Функция Create используется для динамического создания объектов, это другой случай.

Цитата

Если честно, я вообще не сильно поняла смысл строчки

код C++
1:
СListBox* pListBox = (CListBox*)GetDlgItem(IDC_LISTBOX);   



Функция GetDlgItem возвращает указатель на контрол, идентификатор которого ты указываешь.

Код

СListBox* pListBox = (CListBox*)GetDlgItem(IDC_LISTBOX);

Код

СListBox* pListBox = GetDlgItem (...);

Как видишь, разница в том что нет (CListBox*). Зачем оно нужно? Чтобы привести твой указатель к нужному нам типу, потому что GetDlgItem возвращает указатель типа CWnd*. И если у класса CWnd нет функции AddString (а ее там нет), то ты не сможешь ее вызвать.



Цитата
а вместо троеточия должны быть не один, а 2 аргумента: 1-дескриптор диалогового окна(если бы еще знать, что это такое...) и 2-идентификатор ресурса, то бишь, как я понимаю, наш IDC_LISTBOX.

Дело в том, что функция GetDlgItem существует в двух вариантах. Первый возвращает указатель на объект. Это то, что я тебе показал. Второй вариант принимает указатель в качестве аргумента и присваивает ему нужное значение. Разница небольшая, кому как нравится.
То есть можно так:
Код

CWnd *pWnd;
pWnd=GetDlgItem(ID_...);

А можно так:
Код

HWND *phWnd;
GetDlgItem(ID_..., phWnd);

Добавлено @ 00:52
И не обязательно обращаться ко мне на Вы ;)
Неужели я кажусь таким большим и страшным? smile

Автор: Coocky 1.6.2005, 13:21


Цитата
вместо троеточия должны быть не один, а 2 аргумента: 1-дескриптор диалогового окна(если бы еще знать, что это такое...) и 2-идентификатор ресурса, то бишь, как я понимаю, наш IDC_LISTBOX.

Что за бред? В МФС все просто!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Перегруженые функции
CWnd* GetDlgItem( int nID ) const;
void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;

Автор: Любитель 5.6.2005, 20:58
Цитата
IDC_LISTBOX' : undeclared identifier

1. Либо у тебя другой идентифкатор (что наиболее вероятно) - в property поставь
2. Либо строчки #include "resourse.h" нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)