Visaual studio и диалоговые окна

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Skwoogey
Сообщения: 63
Зарегистрирован: 11 янв 2016, 02:25

16 фев 2017, 00:37

Я пытался что-то диалоговое сделать с переменным успехом. У меня есть несколько вопросов.

1) в callback функции окна, как я понял, при UINT переменной == WM_COMMAND, низкое слово wparam всегда название которое мы дали элементу. Есть ли таблица, в которой можно узнать об остальных параметрах элемента, и в какой из переменных они присылаются?
2) Я пытался создать группу элементов и вроде как все, что надо сделал (последовательность табуляции и первый элемент с группой) но мастер добавления переменной не открывается. Что я делаю не так? Или как это сделать ручками? Или может есть еще другой способ?
3) Есть ли что-нибудь в STL удобнее и понятнее для диалоговых окон чем синтаксис винды с его корявыми переменными? Или может есть туториал нормальный для относительных чайников.
4) Как менять строки у элементов, например у радио кнопки?
5) Есть ли в VS инструменты для выравнивания элементов окна (кроме выравнивания по левой/верхней границе), или надо лезть в файл и манипулировать цифорки?

не вижу смысла здесь кидать код, так как вопросы общие.

Буду рад любой помощи.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

16 фев 2017, 01:36

Видно, что очень плохо ориентируешься в области, из-за чего порой не понятно даже, о чём спрашиваешь. Попробую ответить на то, что понял.

1) WM_COMMAND приходит в том случае, если элемент управления посылает команду оконной процедуре диалогового окна. Младшее слово wParam содержит идентификатор контрола, который сгенерировал сообщение, причём под контролом чаще всего подразумевается просто кнопка либо пункт меню. Любые свойства контрола ты можешь получить через его HWND, который можно получить с помощью вызова GetDlgItem.

2) Что подразумевается под мастером добавления переменной? Ты ожидаешь увидеть что-то наподобие MFC-шного мастера, который был в 6-ой студии и который связывал контрол с переменной соответствующего типа, а так же генерировал код класса для диалога? Насколько я знаю, MFC уже давно не поддерживается студией, так что можешь даже не пытаться добиться увидеть этот мастер. Такое ощущение что ты 15 лет в спячке был :)

3) Не путай тёплое с мягким. STL - это библиотека стандартных классов независимых от платформы, а WinAPI - это платформозависимый интерфейс. Естественно, они знать друг о друге не знают и знать не должны. В природе есть некоторые объектно-ориентированные библиотеки, оборачивающие WinAPI, например возможна связка библиотек ATL+WTL для вполне удобной работы. Либо ещё один вариант - это QT. Эта GUI библиотека вообще кросплатформенная (на каждой платформе использует своё API для прорисовки примитивов интерфейса).

4) Текст любого контрола можно поменять с помощью SetWindowText (если у тебя есть его HWND), либо с помощью SetDlgItemText (если у тебя есть только ресурсный идентификатор).

5) Специальных инструментов нет. Да, наиболее точно и без нервных срывов, действительно можно отредактировать открыв ресурсный файл, и поправив координаты.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Skwoogey
Сообщения: 63
Зарегистрирован: 11 янв 2016, 02:25

16 фев 2017, 03:29

Это первый раз, когда я пытался что-то сделать диалоговое и до этого нормально я не работал с WinAPI, поэтому я действительно очень плохо ориентируюсь в области.

У меня ощущение, что несколько способов все это организовать. Вот я нашел такой метод.

объединить в группу я пытался по этой статье. В ней говорится о мастере добавления переменных, который у меня не появляется.

Есть ли какой-то сокральный смысл у виндосовских аналогичных переменных, ведь по сути LSPWSTR то же самое, что и строка char. И зачем?

еще такой вопрос в STL есть класс потоков. В винде потоки настраиваются через WinAPI (через линусковые команды он у меня не хотел работать), так ведь? и получается, что STL заменил непонятный виндовый си или как это работает?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

16 фев 2017, 08:57

Всё верно. Это статья по MFC. Всё-таки, видимо, пытаются ещё поддерживать. Чтобы появился пункт меню Add Variable, нужно было создать проект MFC, а не просто Win32 API Aplication. В этом проблема.

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

По потокам. Само понятие поток - кроссплатформенное. Поэтому классы для работы с потоками есть в STL, но на каждой платформе они реализованы через своё API операционной системы. Однако понятие пользовательского интерфейса не является кроссплатформенным (потому как есть операционные системы вооще без GUI), так что оно не может быть частью языка.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 913
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

27 фев 2017, 13:47

MFC в Visual Studio 2015 поддерживается опционально, т.е. в виде дополнительного расширения, которое при необходимости легко устанавливается в основной пакет Visual C++.
Skwoogey
Сообщения: 63
Зарегистрирован: 11 янв 2016, 02:25

27 фев 2017, 21:32

Я сделал что-то работающее. Это что-то наподобие анкеты. Хотелось бы услышать насколько у меня кривой код и как надо по феншую. Буду весьма признателен.

Еще пара вопросов

Я хотел добавить пароль, но оставлять его лежать в текстовом файле так себе идея. Можно ли спрятать его в файл программы (Пароль можно менять)? Методы кодировки мне не нужны. Нужна защита от рядового юзера.

Я не нашел как делать диалоги дочерными другим диалогам. Не подскажите как?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

28 фев 2017, 01:28

Если пароль может меняться и должен сохраняться между запусками программы, то вкомпилировать его в exe не получится. Нужно хранить отдельно от бинарника. Это может быть либо бинарный файл, куда можно записать заXORеный пароль, либо реестр Windows. Есть и более экзотические варианты, например локальная база данных (скажем SQLite). Частенько в такие базы сохраняют настройки программы, которые должны сохраняться между запусками.

Дочерний диалог сделать очень просто. Достаточно указать дискриптор родительского окна в качестве третьего параметра функции DialogBox.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Skwoogey
Сообщения: 63
Зарегистрирован: 11 янв 2016, 02:25

28 фев 2017, 01:56

А при наследовании классов DialaogEx и CWinApp? В них понятие хандлера окна немного пропадает. Или вы не работали с MFC? Если нет, то можно узнать почему? ИМО они понятнее, чем все делать "вручную"
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

28 фев 2017, 02:31

Работал я с MFC. Это просто устаревшая библиотека. Microsoft официально заявили, что они её больше не поддерживают.

Если используешь MFC, то передай в конструктор CDialog вторым параметром указатель на родительское окно.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Skwoogey
Сообщения: 63
Зарегистрирован: 11 янв 2016, 02:25

28 фев 2017, 03:02

А что есть современная библиотека? какие альтернативы есть вообще? Не уж то чистый WinAPI самый оптимальный выбор?
Ответить