|
Visual C++. Основа основ., Требуется помощь новичку |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 21)
|
Apr 17 2007, 12:00
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 15-12-06
Пользователь №: 23 532

|
Цитата(InvisibleFed @ Apr 16 2007, 13:18)  2. Как получить доступ к конкретному объекту. Например кинул я на форму Button (класс CButton или наследник), вижу его ID типа IDC_Button1 (всего-навсего число). У класса CButton есть определенные поля, методы, свойства и пр. Как к ним достучаться? Или здесь как-то все по иному? Я например не моу пока даже поместить текст в Edit (CEdit) (Кроме как методом тыка - SetDlgItemText(...) - это ваще чё?) Если речь идет про Dialog-и . в VC6 : заходишь в View/Class Wizard... / Member Variables, там для твоего IDC_Button1 (IDC_Edit1) жмешь AddVariable дальше думаю все понятно. в VC 2005 намного проще: для нужного Button-а(Edit-а) жмеш правой кнопкой и AddVariable ... Про остальные VC не знаю
|
|
|
|
|
Apr 17 2007, 12:53
|
Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469

|
Цитата(PsM @ Apr 17 2007, 20:00)  Если речь идет про Dialog-и . в VC6 : заходишь в View/Class Wizard... / Member Variables, там для твоего IDC_Button1 (IDC_Edit1) жмешь AddVariable дальше думаю все понятно.
в VC 2005 намного проще: для нужного Button-а(Edit-а) жмеш правой кнопкой и AddVariable ...
Про остальные VC не знаю Спасибо. Я до этого уже допер. Вот только не понятно 2 момента: 1. Доступных свойств и методов там очень мало. Не верю что это все - MS че-то шифруется. 2. Это че такая политика для каждого объекта лазить создавать переменную? Как нормальные люди пишут?
|
|
|
|
|
Apr 18 2007, 05:28
|
Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469

|
Цитата В борланде усё просто, если нужна надпись на заборе то пишем(в зависимости от объекта) Имя_объекта->caption(или text или ещё чего, в справке смотреть надо) = "qwerty". И всё. smile.gif Это я и сам знаю. А вот вижак...
|
|
|
|
|
Apr 18 2007, 09:50
|

Частый гость
 
Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613

|
Цитата(InvisibleFed @ Apr 18 2007, 06:28)  Это я и сам знаю. А вот вижак... Я сам с вижулом работал мало и использовал Visual Studio .NET версию не помню. Там в объектах вообще ни у одного не было свойства Caption, вместо него у ВСЕХ было свойство Text, если я правильно все помню. А так внешне не сильно отличается от Borlandа Особенно если взять Developer Studio, так там вообще все слизано с MS Visual Studio, так что ты нарой где-нибудь BDS, посмотри ее, может - поможет...
--------------------
!!! All you need is LOVE !!!
|
|
|
|
|
Apr 18 2007, 10:11
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 15-12-06
Пользователь №: 23 532

|
Цитата(InvisibleFed @ Apr 17 2007, 13:53)  2. Это че такая политика для каждого объекта лазить создавать переменную? Как нормальные люди пишут? Диалог создаеться из ресурса, и для нормального функционирования стандартных системных контролов поддержка кодом в виде экземпляра класса (иметься ввиду C++ классы, а не оконные) не нужна. Зачем к примеру для кнопки заводить переменную (расходовать дополнительные ресурсы) если нам нужно только получить от нее сообщение BN_CLICKED ?
|
|
|
|
|
Apr 18 2007, 11:32
|
Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469

|
Цитата Зачем к примеру для кнопки заводить переменную (расходовать дополнительные ресурсы) если нам нужно только получить от нее сообщение BN_CLICKED А вот здесь поподробнее. События то ладно, я на кнопку кликну он мне сам функцию создаст. А вот как например в программе в Edit чего-нить запихать?
|
|
|
|
|
Apr 18 2007, 12:11
|

Частый гость
 
Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613

|
Цитата(InvisibleFed @ Apr 18 2007, 12:32)  А вот здесь поподробнее. События то ладно, я на кнопку кликну он мне сам функцию создаст. А вот как например в программе в Edit чего-нить запихать? Я не знаю, какая версия, но в Edit строка текста заносилась по-моему так же, как и в Buildere Edit1->Text = "qwerty"; Я может чего туплю, но можно попробовать вместо "->" использовать ".", но вряд ли. Я точно помню у Edita было свойство Text. Или Caption не помню. Главное оно у всех надписей одно и то же. Вообще, посмотри свойства объектов в инспекторе объектов. Он почти такой же, как и в Борланде, может, называется как-то по-другому, но он там есть.
--------------------
!!! All you need is LOVE !!!
|
|
|
|
|
Apr 18 2007, 18:33
|
Участник

Группа: Новичок
Сообщений: 34
Регистрация: 8-08-06
Из: Жуковский
Пользователь №: 19 404

|
Мои пять копеек: если гуй можно реализовать не только на MFC, то имеет смысл посмотреть в сторону Windows.Forms или QT. Последнее привлекает кроссплатформенностью и собственным прекомпилятором, добавляющим несколько удобных интерфейсов вроде сигналов, а первое - скоростью разработки, гибкостью и удобством. А MFC - это, имхо, ужос, летящий на крыльях ночи. Убивать надо за такую модель. Еще, кстати, можно свой набор классов написать. Если компонентов будет не очень много, то это, скорее всего, окажется быстрее разбирательств с MFC.
|
|
|
|
|
Apr 19 2007, 00:53
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(Илья Игоревич @ Apr 18 2007, 19:33)  Мои пять копеек: если гуй можно реализовать не только на MFC, то имеет смысл посмотреть в сторону Windows.Forms или QT. Последнее привлекает кроссплатформенностью и собственным прекомпилятором, добавляющим несколько удобных интерфейсов вроде сигналов, а первое - скоростью разработки, гибкостью и удобством. А MFC - это, имхо, ужос, летящий на крыльях ночи. Убивать надо за такую модель. Еще, кстати, можно свой набор классов написать. Если компонентов будет не очень много, то это, скорее всего, окажется быстрее разбирательств с MFC. К сожалению, уже стало общим местом поругивать Microsoft за "дыры" в "окнах", за громоздкость GUI, за MFC и Visual Studio в придачу. Как правило, такое брюзжание слышно от программистов, привыкших в своё время писать под DOS, но так и не разобравшихся до конца с эстетикой объектно-ориентированного программирования, нашедшей воплощение, в частности, в C++. Да, можно, конечно, попытаться создать свою иерархию классов. Сколько времени у вас уйдёт на то, чтобы создать, к примеру, диалог сохранения файла с иерархией папок на Вашем компьютере ? Не рухнет ли Ваш ГУИ, если пользователь, скажем, поменяет разрешение экрана или растянет окно ? Пишу программное обеспечение под Windows, как пресловутый GUI, так и драйвера уровня ядра. И чем больше познаю операционную систему - тем большее удовольствие я получаю. Такой пакет, как MFC (а есть ещё и STL, ATL и т д) позволяет забыть о реализации рутинных задач, перетекающих из проекта в проект - а сосредоточиться на главном , на ТВОРЧЕСТВЕ, то есть... Все стандартные задачи, и графического интерфейса в том числе - уже решены и реализованы. И что немаловажно - хорошо задокументированы. Читайте MSDN - откроете много интересного Был вопрос - основа основ в Visual C++ . Не смейтесь - основа основ здесь C++ - объекты, классы, конструкторы/деструкторы, виртуальные функции. Весь Windows построен на философии объектов. Каждый объект принадлежит своему классу, с каждым объектом можно работать только строго определённым набором функций (методов). И неуместно спрашивать, почему же не выводится текст в окно CEdit, пока Вы кожей не чувствуете наследование классов, иерархию объектов вашей программы, отличие виртуальной функции от обычной, отличие объекта и указателя на него (это к вопросу Edit1.Text или Edit1->Text) и т. д. и т. п. И не надо ничего учить наизусть - ставим и читаем MSDN - там - как в Греции - есть всё. Теперь автору. Цитата(InvisibleFed @ Apr 16 2007, 13:18)  1. Основная идеология с практической точки зрения В ресурсах рисуете всё, что Вам нужно для GUI. Далее идёте в "Class wizard" - и там создаёте все классы, какие Вам нужны, функции обработки сообщений и действий пользователя и ... собственно всё. ГУИ начинает работать сразу после компиляции. Далее наполняете функции Вашим содержанием по требуемым задачам. Цитата(InvisibleFed @ Apr 16 2007, 13:18)  2. Как получить доступ к конкретному объекту. Например кинул я на форму Button (класс CButton или наследник), вижу его ID типа IDC_Button1 (всего-навсего число). У класса CButton есть определенные поля, методы, свойства и пр. Как к ним достучаться? Или здесь как-то все по иному? Я например не моу пока даже поместить текст в Edit (CEdit) (Кроме как методом тыка - SetDlgItemText(...) - это ваще чё?) В основном, эти идентификаторы нужны для внутренних нужд системы (они пересылаются между окнами в параметрах сообщений). При идеологически правильном подходе в MFC они вам, скорее всего, не понадобятся, во всяком случае для простых стандартных интерфейсов. Ваш пример. 1) Если Вы создали кнопку IDC_Button1 в ресурсах - заходите в "Класс визард" и определите для этой кнопки функцию, которую вызовет система, если кнопка будет нажата (OnButton1Clicked) - и визард сам в нужном месте услужливо создаст функцию в классе (метод) и покажет, куда вставить свой код для обработки. 2) Если всё же захотелось "достучаться" до объекта по идентификатору, например, установить другой текст кнопки на летy... Код ......................... CButton* pMyButton1 = GetDlgItem(IDC_Button1); pMyButton1->SetWindowText("My New Button"); .........................
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Apr 19 2007, 03:16
|
Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469

|
Уважаемый Demeny. Я честно очень благодарен Вам за ответ. Вторая половина - то самое. Но. Я же написал, что я прогал долго под билдер. Я отлично знаю идеологию объектной-ориентированности не на словах, а на деле. Цитата Не смейтесь - основа основ здесь C++ - объекты, классы, конструкторы/деструкторы, виртуальные функции. Так я и хотел это себе видеть. Так я это видел в билдере. Цитата Цитата Если всё же захотелось "достучаться" до объекта по идентификатору, например, установить другой текст кнопки на летy... Код CButton* pMyButton1 = GetDlgItem(IDC_Button1); pMyButton1->SetWindowText("My New Button"); Это противоречие Вашим собственным словам и моя проблема на первом этапе пользования вижака. Чтобы достучаться до объекта, который уже создан, я должен зачем-то вызывать какую-то непонятную функцию по идентификатору! С ОО это не имеет ничего общего и с пониманием ОО тоже. Во вторых, Вы обращали внимание, что среди членов того или иного класса в основном одни только функции (SetWindowText, AddString, и пр.)? Как таковых свойств или полей-переменных нет почти. Я лично не верю, что их нет на самом деле. Почему бы не сделать, например Код pMyButton1->Text = "My New Button"; ? Это конечно может придирки, но мое мнение, что закрытие этих членов, доступ к ним только через функции - долбанутая политика MS по части безопасного кода. От кого их скрывать? От разработчика? А то что их якобы как бы вовсе нет (все реализуется через функции) - я не верю - в таком случае, чтобы сделать банальную перерисовку надо на ежа сесть. Цитата И не надо ничего учить наизусть - ставим и читаем MSDN - там - как в Греции - есть всё. Не все. Почитайте, например, в нем о том как назначить группу RadioButton-у (CRadioButton, если не запамятовал). Я смеялся и плакал. Я вот тут попробовал на С# чего написать... Вот это то что надо! Все прозрачно и понятно. Мое мнение, что MS наконец-то реализовали то, что в борланде не формально было сделано еще тыщу лет назад. Это модная "компоненто-ориентированность" (наследие ОО). И теперь они это как нечто новое преподносят. ХЗ. А за вторую часть сообщения спасибо. Если желаете, есть место для дискуссии - в ней того гляди родиться истина.
|
|
|
|
|
Apr 20 2007, 21:31
|

Местный
  
Группа: Свой
Сообщений: 275
Регистрация: 29-06-05
Пользователь №: 6 400

|
InvisibleFed, 1. В стандарте C++ нет понятия свойств и событий - это приблуда билдера. 2. MFC по большей части это просто надстройка над API винды. Архитектурные косяки в ней есть, но не сильно мешают. 3. Все, что можно сделать под виндой, можно сделать в VC++, причем достаточно эффективно. 4. То, что вы увидели в редакторе ресурсов - это стандартные виндовские объекты, поддерживаемые на уровне системы, если нужны другие - разрабатывайте свои классы используя в качестве базовых MFC-шные или используйте ActiveX. 5. Если нужен совсем навороченный интерфейс в стиле VS2005 - есть WTL и открытые GUI библиотеки под нее. 6. Ну и наконец, можно перейти на .NET и WindowsForms
--------------------
|
|
|
|
|
Apr 21 2007, 03:39
|
Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469

|
Цитата 1. В стандарте C++ нет понятия свойств и событий - это приблуда билдера. В стандарте может и нет, не знаю. Но всем понятно о чем реч ведь так? Речь шла о ПОЛЯХ-ЧЛЕНАХ КЛАССА (по научному еще более я не знаю как). И это не приблуда билдера / не только билдера - вижак ничем не отличается, просто реализовано криво, мое мнение. Цитата 3. Все, что можно сделать под виндой, можно сделать в VC++, причем достаточно эффективно. Да... эффективнее чем обычный АПИ, согласен.  Цитата Если нужен совсем навороченный интерфейс в стиле VS2005 - есть WTL и открытые GUI библиотеки под нее. А чегo такое WTL? Спасибо.
|
|
|
|
|
Apr 22 2007, 15:05
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 22-02-07
Пользователь №: 25 599

|
Цитата А чегo такое WTL? _http://www.codeproject.com/wtl/#Beginners _http://www.rsdn.ru/ -- раздел WTL ну, и _http://sourceforge.net/projects/wtl -- собственно, библиотека. Вещь хорошая для написания небольших программок со стандартным интерфейсом. Минус -- нет упорядоченной и строгой документации. Плюс -- исходники под рукой.
Сообщение отредактировал LMT - Apr 22 2007, 15:28
|
|
|
|
|
Apr 23 2007, 10:08
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(InvisibleFed @ Apr 19 2007, 04:16)  Код CButton* pMyButton1 = GetDlgItem(IDC_Button1); pMyButton1->SetWindowText("My New Button"); Это противоречие Вашим собственным словам и моя проблема на первом этапе пользования вижака. Чтобы достучаться до объекта, который уже создан, я должен зачем-то вызывать какую-то непонятную функцию по идентификатору! С ОО это не имеет ничего общего и с пониманием ОО тоже. Никакого противоречия ! Функция GetDlgItem(...) - это тоже метод класса Вашего диалога, из которого Вы её вызываете! Перепишем для ясности Код CButton* pMyButton1 = this->GetDlgItem(IDC_Button1); pMyButton1->SetWindowText("My New Button"); И ещё. Я же писал, что идентификаторами можно и не пользоваться. Заведите себе в классе Вашего диалога кнопку Код CButton MyButton; и общайтесь с ней без всяких идентификаторов Код MyButton.SetWindowText("My first button"); Это вопрос стиля программирования. Мне, например, удобнее заводить идентификаторы для объектов, и если им раздать осмысленные имена - программа становится удобочитаемой... Цитата(InvisibleFed @ Apr 19 2007, 04:16)  Во вторых, Вы обращали внимание, что среди членов того или иного класса в основном одни только функции (SetWindowText, AddString, и пр.)? Как таковых свойств или полей-переменных нет почти. Я лично не верю, что их нет на самом деле. Почему бы не сделать, например Код pMyButton1->Text = "My New Button"; ? Это конечно может придирки, но мое мнение, что закрытие этих членов, доступ к ним только через функции - долбанутая политика MS по части безопасного кода. От кого их скрывать? От разработчика? А то что их якобы как бы вовсе нет (все реализуется через функции) - я не верю - в таком случае, чтобы сделать банальную перерисовку надо на ежа сесть. Вот. Это и есть образ мышления программиста, привыкшего к статическому программированию ! Так было, когда программисты хранили данные в структурах и обращались к ним по имени полей. И опять летят камни в адрес Microsoft ... На самом деле MS тут ни при чём. Вы затронули один из краеугольных камней ООП, именуемый инкапсуляцией - это не только объединение кода и данных внутри объекта, как думают многие начинающие программеры. Это ещё и разделение интерфейса и реализации объекта (public, protected, private), а также сокрытие реализации, но не от разработчика, а от ошибок. Рассмотрим Ваш пример внимательнее. Код pMyButton1->Text = "My New Button"; Это аварийный код по определению. Объясню почему. 1. Что за поле Text ? Если это указатель на строку, то его содержание будет утеряно, как только будет разрушена константа "My New Button" - и это произойдёт по выходу из локальной функции. Будет ошибка доступа к памяти. 2. Если это объект класса CString, то не надо заниматься самообманом - за оператором присваивания = стоит работа тех же методов класса CString, которые скопируют Вашу константу к себе в "недра". 3. А как Вы узнали при присваивании, что хватит памяти для Вашей строки ? 4. А Вы уверены, что поле Text есть внутри ? В том то и дело, что прямой доступ к данным внутри объекта всегда чреват разрушением объекта из-за несоответствия данных размерам памяти. И вообще, динамическое программирование подразумевает, что память под данные (возможно, гигантского объёма) выделяется и освобождается динамически, и никогда "снаружи" класса неизвестно, сколько памяти и для чего уже выделено внутри объекта. Об этом "знает" только сам объект и поэтому он сам рулит менеджментом внутри, а снаружи только интерфейс из функций. Так что это не "бага" - это "фича", это надо прочувствовать, прелесть того, что ты не обязан помнить, какой длины массив у тебя, и ты всегда можешь безопасно добавить в него ещё один элемент !!! Цитата(InvisibleFed @ Apr 19 2007, 04:16)  Почитайте, например, в нем о том как назначить группу RadioButton-у (CRadioButton, если не запамятовал). Я смеялся и плакал. Я всегда это делал путём установки галочки прямо в редакторе ресурсов.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Apr 23 2007, 11:09
|

Местный
  
Группа: Свой
Сообщений: 275
Регистрация: 29-06-05
Пользователь №: 6 400

|
Demeny, здесь Код pMyButton1->Text = "My New Button"; судя по всему подразумевалось "свойство", а не просто переменная-член, так что с точки зрения ООП тут все путем - это просто "сокращенная" форма записи вызова метода Код pMyButton1->SetText("My New Button"); , активно используемая сугубо борландовским компилятором, как расширение в C++. IMHO польза от такого расширения минимальна, зато вред (в плане переносимости) очевиден.
--------------------
|
|
|
|
|
Apr 23 2007, 11:54
|
Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469

|
Цитата Функция GetDlgItem(...) - это тоже метод класса Вашего диалога, из которого Вы её вызываете! Спасибо, разъяснили. Цитата Вот. Это и есть образ мышления программиста, привыкшего к статическому программированию ! Так было, когда программисты хранили данные в структурах и обращались к ним по имени полей. И опять летят камни в адрес Microsoft ... На самом деле MS тут ни при чём. Вы затронули один из краеугольных камней ООП, именуемый инкапсуляцией - это не только объединение кода и данных внутри объекта, как думают многие начинающие программеры. Это ещё и разделение интерфейса и реализации объекта (public, protected, private), а также сокрытие реализации, но не от разработчика, а от ошибок. Рассмотрим Ваш пример внимательнее.
pMyButton1->Text = "My New Button";
Это аварийный код по определению. Объясню почему. 1. Что за поле Text ? Если это указатель на строку, то его содержание будет утеряно, как только будет разрушена константа "My New Button" - и это произойдёт по выходу из локальной функции. Будет ошибка доступа к памяти. 2. Если это объект класса CString, то не надо заниматься самообманом - за оператором присваивания = стоит работа тех же методов класса CString, которые скопируют Вашу константу к себе в "недра". 3. А как Вы узнали при присваивании, что хватит памяти для Вашей строки ? 4. А Вы уверены, что поле Text есть внутри ?
В том то и дело, что прямой доступ к данным внутри объекта всегда чреват разрушением объекта из-за несоответствия данных размерам памяти. И вообще, динамическое программирование подразумевает, что память под данные (возможно, гигантского объёма) выделяется и освобождается динамически, и никогда "снаружи" класса неизвестно, сколько памяти и для чего уже выделено внутри объекта. Об этом "знает" только сам объект и поэтому он сам рулит менеджментом внутри, а снаружи только интерфейс из функций. Так что это не "бага" - это "фича", это надо прочувствовать, прелесть того, что ты не обязан помнить, какой длины массив у тебя, и ты всегда можешь безопасно добавить в него ещё один элемент !!! Спасибо за обстоятельное пояснение. Цитата ...а также сокрытие реализации, но не от разработчика, а от ошибок. Понимаю: разработчик - причина ошибок. Со строковым полем это я конечно загнул - последствия борланда, но с переменными типа int, например, ситуация не лучше. А что касается безопасного кода, это конечно словоблудие, философия, но кто ответит за баг в мое программе, возникающий по причине того, что MS чего-то там намутили? Любая кажущаяся простота упирается как правило в расслабленность программиста. Тем не менее, фичу прочувствовал!  Вот только ирония в мозгах возникает (это не про Вас) - многие из тех кто програмят на MFC они еще про динамические структуры дальше указателя на переменную чего-нибудь помнят\знают? Цитата здесь pMyButton1->Text = "My New Button"; судя по всему подразумевалось "свойство", а не просто переменная-член, так что с точки зрения ООП тут все путем - это просто "сокращенная" форма записи вызова метода pMyButton1->SetText("My New Button"); , активно используемая сугубо борландовским компилятором, как расширение в C++. Согласен, так оно и есть. Цитата IMHO польза от такого расширения минимальна, зато вред (в плане переносимости) очевиден. IMHO в случае написания под конкретный GUI в конкретной среде разработки не о какой переносимости речи вообще не может идти.
|
|
|
|
|
Apr 23 2007, 16:33
|

Местный
  
Группа: Свой
Сообщений: 275
Регистрация: 29-06-05
Пользователь №: 6 400

|
Цитата IMHO в случае написания под конкретный GUI в конкретной среде разработки не о какой переносимости речи вообще не может идти. Тогда зачем связываться с VC++? Чем билдер не устроил? Цитата Многие из тех кто програмят на MFC они еще про динамические структуры дальше указателя на переменную чего-нибудь помнят\знают? Что вы понимаете под "динамической структурой"?
--------------------
|
|
|
|
|
May 25 2007, 10:09
|

Местный
  
Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188

|
Цитата(Demeny @ Apr 19 2007, 03:53)  И что немаловажно - хорошо задокументированы. Читайте MSDN - откроете много интересного... Сам VC вестчь полезная, не спорю. Можно писать очень элегантные проги, многие поймут о чем говорю. На их система справки - кал. По объему - библия программирования для винды, по по удобству работу - кал и еще раз кал. Мне однажды даже пришлось установить Билдер, чтобы работать с их хелпером, который является во многих местах очень удобной копией, причем рабоей копией. А в MSDN я находил дыры - элементарные ссылки, на несуществующие страницы (msdn апрель 2001 года), причем по законам Мерфи эти несуществующие страницы были самыми нужными, а VC6.0 была лицензионной софтиной . Стыдно! А еще добавьте объем их chm-файлов, можно и поудобнее было выбрать. А если попробуете спорить, то вот вам туз из рукава - пункт контекстного меню "Закрыть". Сама Microsoft сделала почти стандартом, что этот пункт последний в меню (кликните правой кнопкой на програмке в панели задачь), а у этих гребаных chm-ов - там хелп (about). И только ни говорите мне, что никто на автопилоте не выбирал этот пункт вместо желанного "Закрыть"
|
|
|
|
|
May 25 2007, 10:57
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Можно работать так же как и в Билдере. Тока менее удобно получается (писанины больше, ошибок может быть больше, проверок надо больше). MFC. Допустим, есть ListBox, Button и Edit. По клику на Button берем то что в Edit и добавляем в ListBox (при этом ListBox скроллим вниз доконца). Обработчик нажатия на кнопку генерится в VS, и код может выглядеть так: Код CString s; GetDlgItemText(IDC_EDIT1, s); ((CListBox *) GetDlgItem(IDC_LIST1))->AddString(s); ((CListBox *) GetDlgItem(IDC_LIST1))->SetCurSel(((CListBox *) GetDlgItem(IDC_LIST1))->GetCount() - 1); При этом не заводятся переменные, и не нужен этот нанавистный UpdateData(). Собстно, пишу почти все так (без добавленяи каких-либо переменных для рбаоты через DDX). Все отлично работает и ИМХО удобнее, но длинно.... Хелп замечательно сделан. Тока пользоваться надо уметь
Сообщение отредактировал SysRq - May 25 2007, 11:16
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|