C ++ разрабатывает GUI-классы? - PullRequest
1 голос
/ 12 декабря 2008

Я должен сказать, что я довольно неопытен, когда дело доходит до C ++, не будьте слишком резкими со мной.

Недавно наткнулся на чудеса API win32 и решил потренироваться в его использовании (на данном этапе я бы не хотел использовать MFC / wxWidgets / etc, только для образовательных целей).

Ну, мой настоящий вопрос: Как правильно кодировать свои графические элементы win32 в классы. Я имею в виду, конечно, что вы можете создать класс, который сохраняет отдельные дескрипторы окна, позволяет легче модифицировать свойства окна, имеет более упрощенную версию CreateWindow (). Но, насколько я понимаю, вам понадобится сообщение и несколько функций обратного вызова для созданных вами окон. Как это работает при объединении их с классами?

Может ли кто-нибудь указать мне правильное направление здесь? Я не против прочтения (большого количества) примера кода, пока он комментируется.

PS: У меня также возникают проблемы с поиском хорошей (читай: простой) документации по использованию «файлов ресурсов» для оформления окон. Бонусы за это! :)

Ответы [ 9 ]

4 голосов
/ 12 декабря 2008

Я программирую на C ++ для жизни. Мне нравится C ++.

Тем не менее, ваша жизнь будет намного проще, если вы сделаете свой графический интерфейс Windows в чем-то. Win32 очень низкоуровневый, и вы будете создавать тонны вещей, которые вы получите бесплатно с помощью библиотек .Net. Win32 уже не чудо. : -)

Если вы хотите изучать C ++, выберите для него что-то кроме GUI.

2 голосов
/ 12 декабря 2008

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

Так MFC это делает, по крайней мере. Я не уверен, доступен ли исходный код MFC для загрузки, но если у вас есть доступ к установочным дискам Visual C ++ (любой версии), вы сможете установить исходный код на свой компьютер для проверки.

1 голос
/ 12 декабря 2008

Я бы посоветовал прочитать Windows ++ Пола Диласкии. Он проведет вас через весь процесс создания библиотеки классов в C ++ поверх Windows API. Он написан для 16-битной Windows, но все концепции, представленные в книге, все еще применимы. Кроме того, вы можете получить его действительно дешево, так как он «устарел».

И убедитесь, что вы узнаете о взломщиках сообщений (#include <windowsx.h>), они не дадут вам вырвать слишком много волос. ; -)

1 голос
/ 12 декабря 2008

Самой большой проблемой, с которой я столкнулся, когда использовал Win32 API (с тех пор перешел на Linux и кроссплатформенные решения), были обратные вызовы. Особенно winproc, AKA сообщение насос. Я нашел это , что должно быть хорошим намеком. Я сделал то, что предлагает эта страница, когда свернул свою собственную обертку.

1 голос
/ 12 декабря 2008

Посмотрите на MFC или ATL / WFC. Если вы хотите заново изобрести колесо, лучшим справочным источником для этого является само колесо, тем более что исходный код легкодоступен.

0 голосов
/ 12 декабря 2008

Много лет назад я разработал набор классов для инкапсуляции API (различные причины, по которым мы не могли использовать MFC). Я многому научился из исходного кода MFC.

Большой ключ в том, что в каждом окне есть элемент данных UserInfo - вы можете использовать его по своему усмотрению. Для этого вам понадобится указатель класса this .

Теперь другая хитрость заключается в том, что функция обратного вызова обработчика сообщений не может быть нормальной функцией-членом класса, поскольку Windows использует вызовы C, а не C ++. Так что ваши обратные вызовы должны быть статическими. Однако, так как вы сохранили указатель этого класса, это просто вопрос получения пользовательской информации класса, приведения его к указателю this вашего класса и последующего вызова любых (нестатических) функций класса, которые вам нужны.

Если вы спланируете это правильно, наследование будет работать хорошо, включая все наследование, которое демонстрируют сами окна (т. Е. Редактирование - это Управление, это Окно).

0 голосов
/ 12 декабря 2008

Лучший способ узнать это - пойти и прочитать оригинальную книгу Чарльза Петцольда. Он хорошо показывает, как настроить базовый цикл сообщений и как создавать операторы для маршрутизации различных событий обработчикам. Реальная проблема здесь заключается в том, что, изобретая все заново, вы будете тратить часы и часы на написание и отладку кода событий Windows вместо написания собственного приложения.

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

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

0 голосов
/ 12 декабря 2008

На сайте Reliable Software есть довольно хорошее руководство по API C ++ для Windows.

0 голосов
/ 12 декабря 2008

Единственная причина, по которой я бы порекомендовал не изобретать велосипед, это то, что вы не являетесь экспертом в C ++ и Win32 API. Попытка выучить два не связанных между собой предмета не будет продуктивной. Если вы хотите стать лучше в C ++, напишите библиотеку для предмета, о котором вы много знаете. Если вы хотите изучить Win32 API, запрограммируйте его, чтобы понять, как он работает, прежде чем создавать (или использовать) оболочку для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...