Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Windows программа с GUI |
Автор: Schlodii 9.5.2013, 13:45 |
Здравствуйте, уже несколько недель читаю форумы и сайты по C++, просматривал книги на английском языке, но всё не то. Вопрос в следующем. Я пишу программу на Visual Basic.NET, что-то типа энциклопедии - графический интерфейс + всякие окошки + много текста в них. Хочется переписать программу на чистом Win32 API. О сложностях осведомлён, ограничений по времени нет (хоть год, хоть два). Проблема в том, что на всех сайтах описывают либо консольные приложения (мне это не нужно), либо решение математических задач (тоже не нужно), либо особенности языка С++ (читаю, внимаю). Нигде не пишут о том, какие файлы .cpp и хидеры нужны для простейших графических программ и в какой последовательности их создавать. Пробовал копировать исходный код из книг Румянцева, Щупака, Финогенова... Они пишут исходный код как бы для одного файла .cpp Затем в общих словах упоминают подключение хидеров. Где-нибудь можно почитать пошаговое руководство, какие конкретно .cpp и .h файлы нужны для простейшей программы с графическим интерфейсом? Например в таком виде. 1. создаём файл ххх.h, вписываем туда то-то и то-то (или копируем из SDK). 2. создаём файл .cpp, -//- 3. и далее по тексту. Т.е. нужно описание того, как зависят хидеры от .cpp. Пусть это будет самая примитивная программа, но хочется понять именно логику работы. Как ни странно, но сам язык С++ мне кажется более простым, чем понимание логики работы с хидерами и .cpp. Хотел создать новую тему, но потом решил, что такой простой вопрос стыдно задавать в отдельной теме. Английский хорошо знаю, поэтому буду благодарен за любые подсказки на любом языке - где прочитать эти основы. |
Автор: bsa 11.5.2013, 14:52 |
Язык С++ очень сложный. И сложность его в кажущейся простоте... Твой выбор winapi32 я, да и много кто, положительно оценить не сможем. Это совершенно неблагодарная работа, которая не стоит затраченного времени. Если хочешь писать на С++, то изучи язык на консольных программах. Так как если ты сразу же кинешься писать гуй, то через какое-то время загонишь себя в такую задницу, что переписать заново будет проще, чем найти ошибку. После изучения языка, ты можешь брать какую-нибудь удобную библиотеку для создания гуя (например Qt) и писать свою прогу. |
Автор: Schlodii 12.5.2013, 01:05 | ||||
bsa, изучение консольных приложений всегда сопровождается математическими примерами и задачами, алгоритмами. Если человек хочет писать серьёзные программы на С++, то ему нужны фундаментальные знания. Мне же нужны только азы. На сайте MSDN я нашёл пример простейшего GUI на С++. Вполне рабочий. От него уже можно идти дальше. Я понимаю, что вопрос новичка о GUI на C++ вызывает закономерный скепсис у продвинутых программистов. Но у меня есть одно пояснение, которое многое объяснит. Программа, которую я пишу (на данный момент на vb.net, о чём упоминал в первом сообщении), представляет из себя энциклопедию вроде ... Википедии, только с абсолютно другой систематизацией материалов и другими фактами (чтобы любой человек мог буквально за минуту узнать информацию, которую в сети почти невозможно или очень трудно найти, хотя, конечно, есть и общеизвестные факты). В энциклопедии есть раздел программирование, на данный момент там содержится информация только о языке программирования Visual Basic.NET. То, чем я занимаюсь, можно назвать документированием известной информации, но она раскидана по разным сайтам и книгам, я же потихоньку собираю в одном месте. К профессии программиста я не имею ни малейшего отношения (пишу диссертацию по историографии, короче, историк), vb.net начал изучать только с января этого года. В этом есть как минусы (понятные), так и плюсы. Сначала читаю все доступные книги, сравниваю исходный код, набираю, изменяю, разбираюсь в логике работы и только потом вношу в свою энциклопедию информацию в максимально подробном и доступном виде (т.е. документирую). В случае с С++ ситуация выглядит похуже. Исходные коды из книг на моей Visual Studio 2010 компилируются с ошибками. После многочисленных неудачных попыток решил отталкиваться от рабочих примеров. Основу (простейший GUI) взял с MSDN, использование хидеров и .c (.cpp) посмотрел в исходниках Реактоса (удалял строки, менял, уточнял по reference назначение конкретных хидеров). Для профессионалов моё объяснение наверняка выглядит смешным, но благодаря этому получил хоть какое-то представление об азах построения GUI. Следующий шаг - документирование каждой строчки и аргументов (есть в MSDN). Мне важно не столько объяснить вроде бы банальный код
но и записать пояснения того, почему на сайте Майкрософта есть эти строчки
а во многих учебниках нет. Если я смогу задокументировать все необходимые вещи, то почему бы не рискнуть с GUI? |
Автор: borisbn 12.5.2013, 08:42 |
Schlodii, есть подозрение, что когда Вы закончите писать GUI-программу на Си++ на WinAPI, не будет ни первого, ни второго, ни третьего. GUI, наверное, всё-таки, останется, но изменится до неузнаваимости (3D, голография и т.п.) А по теме: Вы и так нашли единственный нормальный и полный ресурс по GUI на WinAPI - MSDN. P.S. Безумству храбрых поём мы песню ![]() |
Автор: alexSl 12.5.2013, 10:24 |
http://www.winprog.org/tutorial/ |
Автор: bsa 12.5.2013, 13:05 |
Schlodii, писать программу на winapi тоже самое, что строить небоскреб из кирпичей. Для создания программ с гуи используют другие средства, которые позволяют сократить время на рутиную работу. Например, Qt, Windows forms и пр. |
Автор: bsa 12.5.2013, 16:45 | ||
В 99.99% гуишный код не критичен к производительности. Ты не заметишь разницы между откликом в 20 и 10 мс, хотя отличаются они в 2 раза. А вот есть 0.01% кода, который критичен. Можно все писать низкоуровневыми средствами и потратить 1 год на гуи, и месяц на бизнеслогику, а можно такую же программу написать за пару месяцев и получить от этого еще и удовольствие. Так как очень часто потратив много времени на гуй, желание писать самое интересное - бизнес логику, пропадает И рекомендую все-таки прислушиваться к нашему (профессиональных программистов) мнению. Мы когда-то были молодыми и тоже пытались писать программы и на винапи, и на ассемблере... Поэтому и советуем не совершать наших ошибок. |
Автор: Schlodii 12.5.2013, 17:24 | ||||
bsa, т.е. приложения (не только сам GUI), написанные на С++ с использованием Qt, обладают теми же преимуществами, что и программы, написанные на чистом С++ - компактные, быстрые? Что насчёт просмотра исходного кода программ - Qt выглядит получше NET или такая же дырявая? Если я хочу, чтобы моя программа шла и на других компьютерах - под XP и 7 - нужно ли устанавливать отдельно библиотеки? Не хочется вместе с простой программой поставлять несколько десятков мегабайт dll. Я раньше смотрел Qt, но меня смутила отличная от С++ терминология (например, слоты). Если я начну изучать Qt, то придётся одновременно одним глазком сравнивать с С++? Или достаточно одного Qt?
Спасибо за совет! Хотя не скрою, что обидно спускаться на грешную землю. ![]() |
Автор: kamre 12.5.2013, 18:20 | ||||||||
А на чистом C++ не бывает программ GUI, всегда используются библиотеки (winapi/MFC/VCL/Qt/Gtk/Wx/...). По компактности врядли что-то может сравниться с winapi, по скорости уже больше зависит от того, как приложение написать. Но при использовании Qt и скромного набора модулей (core/widgets/opengl без всяких там icu/webkit) после сжатия упаковщиками вполне можно уложиться в 5-10мб. Добавлено через 10 минут и 46 секунд
Qt - обычная библиотека с кодогенератором для C++, программы с ее использованием собираются обычным C++ компилятором. Поэтому получить исходный код из собранного бинарника нельзя.
В windows почти всегда приложения таскают необходимые библиотеки вместе с собой в инсталяторе. Простую программу можно будет упаковать до 5-10мб.
Сигналы/слоты - обычные функции C++, часть кода для их работы получается при запуске кодогенератора moc. Изучать нужно С++, и разбираться в том как все устроено в Qt. Не получится хорошо знать только Qt, не разбираясь в C++. |
Автор: Schlodii 12.5.2013, 18:31 | ||
10 мегабайт многовато будет. А если ограничиться только окошками + меню + текст? И больше ничего - ни картинок, ни аудио, ни математических вычислений. Даже на Visual Basic.NET размер исчисляется сотнями килобайт, а тут С++ и мегабайты... Странно как-то. |
Автор: kolesnle 12.5.2013, 19:04 | ||
Размер самого экзешника - да.... А .NET? Забыли? Кстати, на большом кол-ве компов Qt прописан в переменных окружения, поэтому иногда таскать Qt не надо с собой |
Автор: bsa 12.5.2013, 23:18 |
Schlodii, программа написанная с использованием qt может быть очень маленькой по объему. Но для ее работы нужны будут библиотеки, а вот они уже большие. Причем, чем навороченней программа, тем больше библиотек таскать придется. С другой стороны, где ты видел программы на несколько килобай последнее время? У тебя только иконки сожрут столько. |
Автор: Schlodii 13.5.2013, 01:20 | ||||||||||
Отлично.
Библиотеки таскают, но некоторые программы весьма компактны. Sony Vegas - очень яркий пример компактной (для своего функционала) программы. HelpScribble - ужасная по удобству, но очень маленькая по размеру (может быть и GUI написан через API). Видимо, есть разработчики, которым не лень оптимизировать свои продукты.
И при этом основы С++ вряд ли сильно помогут в GUI-строительстве с помощью Qt. 99,999% учебников по С++ вообще никак графический интерфейс не затрагивают. Не забыл. В Windows 7 изначально установлена .NET, поэтому пользователи эти нюансы никогда не заметят. Разве что при загрузке .NET'овских программ винчестер сильно шуршит.
Разве одних библиотек в составе программы будет недостаточно?
Не мой случай. Мне окошки, текст и меню и... всё.
Известный программист Нир Софер (http://nirsoft.net/about_nirsoft_freeware.html) написал свыше 100 бесплатных программ. И все используют Win32 API. И обновляет их или каждый день, или через день, или через два. Максимальный размер - около 200 килобайт. Минимальный - 6 килобайт. |
Автор: borisbn 13.5.2013, 06:15 |
Господа, вы что, эти dll-ки на себе таскаете? Или у вас Win7 на микроконтроллере с 640 КБ установлен? Да какая к чёрту разница, сколько будет весить дистрибутив? > Кстати, на большом кол-ве компов Qt прописан в переменных окружения, поэтому иногда таскать Qt не надо с собой Хммммм... С каких это пор? Или ты про линукс? |
Автор: bsa 13.5.2013, 08:02 |
На winapi пишут или простейшие программы, или если за это платят, или если нет личной жизни. Чтобы это понять посмотри, как на winapi открыть файл (CreateFile) и как это сделать стандартными средствами (fopen или open). Сможешь в голове держать список параметров и их значений? |
Автор: kolesnle 13.5.2013, 08:12 |
В линуксе то само-собой.. Но часто и на винде прописаны... Может я какой-то не правильный? Хотя конечно таскать надо, это я погорячился |
Автор: kamre 13.5.2013, 08:17 |
А как же всемогущее IDE в виде MSVC, которое подсказывает параметры и открывает на соседнем мониторе справку из MSDN в случае необходимости? Добавлено через 2 минуты и 27 секунд Только если какая-то программа притащит с собой неизвестно какую версию и пропишет в %path% путь до них. Например, так любит TortoiseHG делать. А потом запускаешь свою программу и оно показывает окошко про отсутствующие функции в QtGui.dll, хотя из QtCreator все запускалось хорошо. |
Автор: bsa 13.5.2013, 08:33 | ||
Winapi имеет ужасный дизайн. И пользоваться ей без крайней необходимости не следует. Размер итоговой программы очень редко, когда является главным критерием. А вот время разработки и простота поддержки - очень часто. |
Автор: kamre 13.5.2013, 09:09 | ||||
Писать под winapi без студии?
Согласен на счет дизайна. У меня и WTL не получилось осилить, а от MFC одни неприятные воспоминания.
Тогда вообще к черту C++ и бегом под .NET писать ![]() |
Автор: bsa 13.5.2013, 09:27 | ||
|
Автор: kuzulis 13.5.2013, 22:07 |
Вставлю пять копеек ![]() Если уж хочется компактности и быстроты WinAPI - то WTL во все поля! Она довольно простая, все на шаблонах и т.п., поэтому не придется таскать с собой кучу dll-лок, да и размер GUI приложения будет - килобайты. Но вся проблема в том, что при использовании WTL, и тем более чистого WinAPI придется нехило заморочится с чтением MSDN на каждый чих (будь то раскраска текста или работу с I/O). Нужно будет разобраться со всеми нюансами работы каждого WinAPI-шного метода и т.п., реализовывать кажый обработчик и т.п. Геморрой еще тот! Тем более, не все так просто: WinAPI для ОС от XP до 8-ки очень нехило отличается. Например, некоторые методы в 8-ке (начиная с висты) являются deprecated и не используются, или же имеются только в ОС, начиная с Vista. Поэтому придется нехило натыкать дефайнов в код и код со временем превратится в лапшу. Также можно отгрести проблем с локализацией, с сегфолтами при использовании строк TCHAR (если быть невнимательным). WTL и WinAPI требуют от разработчика нехилого внимания и концентрации, и уж тем более я бы не рекомедовал новичкам это. Хотя, опытные программисты получат очень много плюшек при использовании этих низкоуровневых вещей. ЗЫ: Я сам недавно фиксил баги в WTL проекте. Сначала плевался - но потом освоился и даже подсел на WTL. ![]() Но все-равно, с удовольствием переписал бы с нуля этот проект на Qt за неделю (если бы была моя воля) - было бы качественнее и надежнее. Но проблема - в размерах dll-лок от Qt и в менеджменте. ![]() Как то так... |
Автор: Schlodii 15.5.2013, 21:24 |
Спасибо всем за подсказки и советы! На данный момент я склоняюсь к тому, чтобы всё-таки попробовать Win32 API, но ограничиться лишь простейшим окошком с меню, а остальная часть программы так и останется на Visual Basic.NET. Придётся делать два экзешника или же в коде делать вставки из API. Делать всю программу на API в моей ситуации, конечно, бессмысленно (банально не смогу), вынужден согласиться с доводами в этой теме. Что касается Qt, то пока отложу её изучение. Относительно большой размер выходных файлов и необходимость плотно изучать С++, чтобы воспользоваться всеми плюшками Qt, несколько охладили мой пыл. Может быть имеет смысл писать разные части программ на Visual Basic.NET, API и Qt? Не сейчас, а тогда, когда знаний чуть прибавится. |
Автор: bsa 15.5.2013, 23:25 |
на winapi имеет смысл писать только критичные по производительности или платформозависимые (низкоуровневые) операции. Qt - идеальная среда для создания кроссплатформенных приложений. А вот Visual Basic.NET для тебя лучший выбор, так как ты знаешь его, и он позволяет создать то, что необходимо. |