C ++ разрабатывает GUI-классы?

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

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

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

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

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

11.12.2008 22:51:57
9 ОТВЕТОВ
РЕШЕНИЕ

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

1
11.12.2008 23:20:36

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

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

2
11.12.2008 22:57:43

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

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

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

4
11.12.2008 22:57:58

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

1
11.12.2008 23:05:13

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

0
11.12.2008 23:12:19

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

0
11.12.2008 23:26:21

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

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

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

0
11.12.2008 23:37:21

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

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

1
12.12.2008 00:47:47
Выглядит интересно тоже! Я мог бы рассмотреть возможность покупки.
Daniel 12.12.2008 01:06:43

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

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

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

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

0
12.12.2008 16:47:41