C win32 tab control - PullRequest
       3

C win32 tab control

8 голосов
/ 18 мая 2011

Хорошо, так что сначала я кодирую на C, используя win32 api, без mfc, .net, без wxwidgets. Я создал окно с классом WC_TABCONTROL и добавил к нему вкладки, все работает нормально, за исключением ... Мне нужно иметь содержимое в каждой вкладке, у меня появилось впечатление от msdn, что мне нужно создать диалог для каждой страницы и затем загрузите диалоговое окно, когда пользователь выберет вкладку. Единственная проблема с этим - мое главное окно не является диалогом, поэтому создание диалогового окна для вкладки идеально не слишком хорошо работает.

Так что мне интересно, есть ли лучший способ сделать это? Я думал о том, чтобы просто скрыть и показать разные элементы управления на вкладке, но это не очень хорошая идея.

То, что я хотел бы, это когда мое приложение запустится, оно изменит размер окна и элемента управления вкладками до минимального размера, необходимого для размещения всех вкладок (3-4 вкладки), и окно не будет изменяемого размера, которое Я думаю, что немного упрощает вещи. Я сделал это, следуя примеру на msdn (загрузка каждого диалогового окна в память, циклическое выполнение каждого из них и установка RECT на минимально необходимый размер, а затем изменение размера всего), проблема в том, что размер указан в единицах измерения диалогового окна, и я не могу преобразовать его в пиксели, потому что у меня пока нет HWND в диалоговом окне.

В основном Мой вопрос заключается в том, каков наилучший способ управления элементами управления в окне с помощью элемента управления с вкладками. Поэтому, если у меня есть элемент управления вкладкой, и пользователь переключается с tab1 на tab2, я хочу, чтобы пользователю отображались различные элементы управления.

1 Ответ

3 голосов
/ 19 мая 2011

Основная идея MSDN состоит в том, чтобы иметь элементы управления для каждой вкладки в их собственном HWND.Преимущество этого состоит в том, что вы можете скрыть / показать все элементы управления в HWND, скрывая / показывая этот родительский HWND.Это означает, что переход от одной вкладки к другой - это всего лишь случай скрытия одного контейнера HWND и показ другого, что проще и элегантнее, чем необходимость скрывать / показывать группы элементов управления.(Он также сохраняет код обработчика диалога для каждой панели отдельно, как правило, это то, что вам нужно.) Однако оба подхода разрешены: часто более удобно создавать диалоги, но вам это не требуется.

Эти контейнеры HWND не обязательно должны быть диалогами, но использование диалога означает, что окна будут заполнять содержимое из файла .rc и автоматически обрабатывать вкладки клавиатуры.Если вы создадите свой собственный HWND, вам придется сделать это самостоятельно.Вы можете использовать гибридный подход: начать с диалогового окна, но добавить свои собственные элементы управления в обработчик WM_INITDIALOG, если вам нужно, и даже обработать WM_SIZE для создания пользовательского макета, чтобы элементы управления лучше подходили.

Если выперейдите по маршруту create-your-own-HWND, найдите IsDialogMessage () для простого способа добавить поддержку вкладок клавиатуры в свой собственный HWND;а также проверьте стиль WS_EX_CONTROLPARENT, чтобы работали вкладки между самими вкладками и элементами управления в контейнере.

Re: "проблема в том, что размер указан в единицах измерения диалогового окна, и я не могу преобразовать его в пиксели, потому чтоУ меня пока нет HWND в диалоговом окне. "- вы можете использовать CreateDialog, чтобы создать диалоговое окно как невидимое - пропустите WS_VISIBLE из файла .rc - тогда вы можете измерить / изменить его размер, прежде чем показывать его.

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