Перейти к содержанию
    

Visual C++. Основа основ.

Начинал программировать под Delphi. Потом перебрался на Builder. Имею небольшой опыт программирования под X Window. Под Windows все в основном писал на Builder-e. Там где нужно было чего-то особенное, но не связанное с GUI, писал на Visual C++ и оформлял в виде dll. Но вот возникло требование (слава богу временное) - GUI на MFC. У меня шок... Открываю учебники и вижу помимо всяких там иерархий классов (это все понятно вроде) набор шаманских действий. Вопросы по существу:

 

1. Основная идеология с практической точки зрения (Пример для Builder-a: Создаете форму, кидаете на нее компоненты, назначаете свойства в инспекторе, описываете Events. Все названия свойств четко соответствуют именам членов класса)

2. Как получить доступ к конкретному объекту. Например кинул я на форму Button (класс CButton или наследник), вижу его ID типа IDC_Button1 (всего-навсего число). У класса CButton есть определенные поля, методы, свойства и пр. Как к ним достучаться? Или здесь как-то все по иному? Я например не моу пока даже поместить текст в Edit (CEdit) (Кроме как методом тыка - SetDlgItemText(...) - это ваще чё?)

 

Пока все. Прошу помоч.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 не знаю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если речь идет про Dialog-и .

в VC6 : заходишь в View/Class Wizard... / Member Variables, там для твоего IDC_Button1 (IDC_Edit1) жмешь AddVariable дальше думаю все понятно.

 

в VC 2005 намного проще: для нужного Button-а(Edit-а) жмеш правой кнопкой и AddVariable ...

 

Про остальные VC не знаю

 

Спасибо. Я до этого уже допер. Вот только не понятно 2 момента:

 

1. Доступных свойств и методов там очень мало. Не верю что это все - MS че-то шифруется.

2. Это че такая политика для каждого объекта лазить создавать переменную? Как нормальные люди пишут?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В борланде усё просто, если нужна надпись на заборе то пишем(в зависимости от объекта) Имя_объекта->caption(или text или ещё чего, в справке смотреть надо) = "qwerty". И всё. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В борланде усё просто, если нужна надпись на заборе то пишем(в зависимости от объекта) Имя_объекта->caption(или text или ещё чего, в справке смотреть надо) = "qwerty". И всё. smile.gif

 

Это я и сам знаю. А вот вижак...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это я и сам знаю. А вот вижак...

Я сам с вижулом работал мало и использовал Visual Studio .NET версию не помню. Там в объектах вообще ни у одного не было свойства Caption, вместо него у ВСЕХ было свойство Text, если я правильно все помню. А так внешне не сильно отличается от Borlandа Особенно если взять Developer Studio, так там вообще все слизано с MS Visual Studio, так что ты нарой где-нибудь BDS, посмотри ее, может - поможет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. Это че такая политика для каждого объекта лазить создавать переменную? Как нормальные люди пишут?

 

Диалог создаеться из ресурса, и для нормального функционирования стандартных системных контролов поддержка кодом в виде экземпляра класса (иметься ввиду C++ классы, а не оконные) не нужна.

Зачем к примеру для кнопки заводить переменную (расходовать дополнительные ресурсы) если нам нужно только получить от нее сообщение BN_CLICKED ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем к примеру для кнопки заводить переменную (расходовать дополнительные ресурсы) если нам нужно только получить от нее сообщение BN_CLICKED

 

А вот здесь поподробнее. События то ладно, я на кнопку кликну он мне сам функцию создаст. А вот как например в программе в Edit чего-нить запихать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот здесь поподробнее. События то ладно, я на кнопку кликну он мне сам функцию создаст. А вот как например в программе в Edit чего-нить запихать?

 

Я не знаю, какая версия, но в Edit строка текста заносилась по-моему так же, как и в Buildere

 

Edit1->Text = "qwerty";

 

Я может чего туплю, но можно попробовать вместо "->" использовать ".", но вряд ли. Я точно помню у Edita было свойство Text. Или Caption не помню. Главное оно у всех надписей одно и то же. Вообще, посмотри свойства объектов в инспекторе объектов. Он почти такой же, как и в Борланде, может, называется как-то по-другому, но он там есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мои пять копеек:

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

Еще, кстати, можно свой набор классов написать. Если компонентов будет не очень много, то это, скорее всего, окажется быстрее разбирательств с MFC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мои пять копеек:

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

Еще, кстати, можно свой набор классов написать. Если компонентов будет не очень много, то это, скорее всего, окажется быстрее разбирательств с MFC.

К сожалению, уже стало общим местом поругивать Microsoft за "дыры" в "окнах", за громоздкость GUI, за MFC и Visual Studio в придачу. Как правило, такое брюзжание слышно от программистов, привыкших в своё время писать под DOS, но так и не разобравшихся до конца с эстетикой объектно-ориентированного программирования, нашедшей воплощение, в частности, в C++.

 

Да, можно, конечно, попытаться создать свою иерархию классов. Сколько времени у вас уйдёт на то, чтобы создать, к примеру, диалог сохранения файла с иерархией папок на Вашем компьютере ? Не рухнет ли Ваш ГУИ, если пользователь, скажем, поменяет разрешение экрана или растянет окно ?

 

Пишу программное обеспечение под Windows, как пресловутый GUI, так и драйвера уровня ядра. И чем больше познаю операционную систему - тем большее удовольствие я получаю. Такой пакет, как MFC (а есть ещё и STL, ATL и т д) позволяет забыть о реализации рутинных задач, перетекающих из проекта в проект - а сосредоточиться на главном , на ТВОРЧЕСТВЕ, то есть... Все стандартные задачи, и графического интерфейса в том числе - уже решены и реализованы. И что немаловажно - хорошо задокументированы. Читайте MSDN - откроете много интересного :cheers:

 

Был вопрос - основа основ в Visual C++ . Не смейтесь - основа основ здесь C++ - объекты, классы, конструкторы/деструкторы, виртуальные функции. Весь Windows построен на философии объектов. Каждый объект принадлежит своему классу, с каждым объектом можно работать только строго определённым набором функций (методов). И неуместно спрашивать, почему же не выводится текст в окно CEdit, пока Вы кожей не чувствуете наследование классов, иерархию объектов вашей программы, отличие виртуальной функции от обычной, отличие объекта и указателя на него (это к вопросу Edit1.Text или Edit1->Text) и т. д. и т. п.

 

И не надо ничего учить наизусть - ставим и читаем MSDN - там - как в Греции - есть всё.

 

Теперь автору.

1. Основная идеология с практической точки зрения

В ресурсах рисуете всё, что Вам нужно для GUI. Далее идёте в "Class wizard" - и там создаёте все классы, какие Вам нужны, функции обработки сообщений и действий пользователя и ... собственно всё. ГУИ начинает работать сразу после компиляции. Далее наполняете функции Вашим содержанием по требуемым задачам.

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");
.........................

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемый 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 наконец-то реализовали то, что в борланде не формально было сделано еще тыщу лет назад. Это модная "компоненто-ориентированность" (наследие ОО). И теперь они это как нечто новое преподносят. ХЗ.

 

А за вторую часть сообщения спасибо. Если желаете, есть место для дискуссии - в ней того гляди родиться истина. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

InvisibleFed,

1. В стандарте C++ нет понятия свойств и событий - это приблуда билдера.

2. MFC по большей части это просто надстройка над API винды. Архитектурные косяки в ней есть, но не сильно мешают.

3. Все, что можно сделать под виндой, можно сделать в VC++, причем достаточно эффективно.

4. То, что вы увидели в редакторе ресурсов - это стандартные виндовские объекты, поддерживаемые на уровне системы, если нужны другие - разрабатывайте свои классы используя в качестве базовых MFC-шные или используйте ActiveX.

5. Если нужен совсем навороченный интерфейс в стиле VS2005 - есть WTL и открытые GUI библиотеки под нее.

6. Ну и наконец, можно перейти на .NET и WindowsForms

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. В стандарте C++ нет понятия свойств и событий - это приблуда билдера.

 

В стандарте может и нет, не знаю. Но всем понятно о чем реч ведь так? Речь шла о ПОЛЯХ-ЧЛЕНАХ КЛАССА (по научному еще более я не знаю как). И это не приблуда билдера / не только билдера - вижак ничем не отличается, просто реализовано криво, мое мнение.

 

3. Все, что можно сделать под виндой, можно сделать в VC++, причем достаточно эффективно.

 

Да... эффективнее чем обычный АПИ, согласен. :)

 

Если нужен совсем навороченный интерфейс в стиле VS2005 - есть WTL и открытые GUI библиотеки под нее.

 

А чегo такое WTL?

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чегo такое WTL?

 

_http://www.codeproject.com/wtl/#Beginners

 

_http://www.rsdn.ru/

-- раздел WTL

ну, и

_http://sourceforge.net/projects/wtl

-- собственно, библиотека.

 

Вещь хорошая для написания небольших программок со стандартным интерфейсом. Минус -- нет упорядоченной и строгой документации. Плюс -- исходники под рукой.

Изменено пользователем LMT

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...