#c #winapi #api #tabs
#c #winapi #API #вкладки
Вопрос:
Хорошо, итак, сначала я пишу на C, используя win32 api, без mfc, без .net, без wxwidgets. Я создал окно с классом WC_TABCONTROL и добавил в него вкладки, все работает нормально, за исключением… Мне нужно иметь содержимое на каждой вкладке, у меня создалось впечатление из msdn, что мне нужно создать диалоговое окно для каждой страницы, а затем загрузить диалоговое окно, когда пользователь выбирает вкладку. Единственная проблема с этим заключается в том, что мое главное окно не является диалоговым окном, поэтому создание диалогового окна для вкладки идеально подходит, работает не слишком хорошо.
Итак, мне интересно, есть ли лучший способ сделать это? Я думал о том, чтобы просто скрывать и показывать разные элементы управления на каждой вкладке, но это не кажется хорошей идеей.
Чего бы я хотел, так это того, что при запуске моего приложения оно изменит размер окна и элемента управления вкладками до минимального размера, необходимого для размещения всех вкладок (3-4 вкладки), и размер окна не будет изменяться, что, я думаю, немного упрощает ситуацию. Я сделал это, следуя примеру на msdn (загружая каждое диалоговое окно в память, просматривая каждое из них и устанавливая RECT на минимальный необходимый размер, а затем изменяя все размеры), проблема в том, что размер указан в единицах диалогового окна, и я не могу преобразовать его в пиксели, потому что у меня еще нет HWND для диалогового окна.
В принципе мой вопрос заключается в том, каков наилучший способ управления элементами управления в окне с помощью элемента управления tab. Итак, если у меня есть элемент управления tab и пользователь переходит с tab1 на tab2, я хочу, чтобы пользователю отображались другие элементы управления.
Комментарии:
1. Проголосовал за моего собрата «без mfc, без .net, без wxwidgets». 🙁
2. Причина, по которой я не использую mfc, .net или wxwidgets, одна: учебные цели, а win32 api меня завораживает. И мне всегда нравилось делать вещи немного более низкого уровня.
Ответ №1:
Основная идея, к которой стремится MSDN, заключается в том, чтобы элементы управления для каждой вкладки находились в их собственном HWND. Преимущество этого заключается в том, что вы можете скрыть / показать все элементы управления в HWND, скрыв / показав этот родительский HWND. Это означает, что переход с одной вкладки на другую — это просто случай скрытия одного контейнера HWND и отображения другого, что проще и элегантнее, чем необходимость скрывать / показывать группы элементов управления. (Он также сохраняет код обработчика диалогового окна для каждой панели отдельным, что обычно и требуется.) Однако разрешены оба подхода: часто удобнее создать диалоговое окно, но от вас это не требуется.
Эти контейнеры не обязательно должны быть диалоговыми, но использование диалогового окна означает, что Windows заполнит содержимое из файла .rc для вас и автоматически выполнит ввод вкладок с клавиатуры. Если вы создадите свой собственный HWND, вам придется сделать это самостоятельно. Вы могли бы использовать гибридный подход: начать с диалогового окна, но при необходимости добавить свои собственные элементы управления в обработчик WM_INITDIALOG и даже обработать WM_SIZE для создания пользовательского макета, чтобы элементы управления лучше подходили.
Если вы выберете маршрут создания собственного HWND, найдите IsDialogMessage() для простого способа добавить поддержку вкладок с клавиатуры в свой собственный HWND; а также ознакомьтесь со стилем WS_EX_CONTROLPARENT, чтобы работало переключение между самими вкладками и элементами управления в контейнере HWND.
Re: «проблема в том, что размер указан в единицах диалогового окна, и я не могу преобразовать его в пиксели, потому что у меня еще нет HWND для диалогового окна». — возможно, вы сможете использовать CreateDialog для создания диалогового окна невидимым — опустите WS_VISIBLE из файла .rc — тогда вы сможете измерить / изменить размер соответствующим образом, прежде чем показывать его.
Комментарии:
1. Я думал об использовании CreateDialog для создания каждого диалогового окна и проверки размера, единственная проблема в том, что требуется создать около 4 диалоговых окон только для запуска приложения, и я предпочитаю создавать их по мере необходимости, поэтому, если есть какой-либо способ, которым я могу проверить размер каждого из них, фактически не создавая их? Это решило бы мои проблемы 🙂
2. Создание диалоговых окон может быть относительно дешевым — во всяком случае, относительно восприятия времени конечным пользователем. (Если вы заполняете их информацией из медленных источников, то, конечно, задержите заполнение.) Мой 2c: сначала попробуйте простой способ и посмотрите, достаточно ли он быстр. Если это достаточно быстро, значит, все готово, переходите к следующей задаче. Потратьте время на добавление дополнительной сложности для измерения без создания, только если вы уверены, что это необходимо для внесения необходимых изменений. (Общее правило разработчиков: не оптимизируйте преждевременно: время разработки — ценный ресурс, используйте его там, где это имеет наибольшее значение.)