Работа с контролом SysTabControl32 на Ассемблере
Работа с контролом SysTabControl32 на Ассемблере
Вкладки - очень удобное решение, когда в ограниченное пространство диалогового окна надо поместить большое количество элементов. Достаточно сгруппировать их по смыслу или функциям и предоставить пользователю возможность переключаться между группами. Делается это при помощи стандартного контрола SysTabControl32.
Основу для вкладок сделать очень просто. Создаете контейнер, то есть сам элемент SysTabControl32, он или описывается в ресурсах, или создается динамически. Получаете его хэндл, заполняете структуру TC_ITEM, после чего поочередно добавляете нужное количество вкладок, отправляя контейнеру сообщения TCM_INSERTITEM.
Code (Assembler) : Убрать нумерацию
- ; Получить хэндл контейнера вкладок
- invoke GetDlgItem,[hwnddlg],TAB_MAIN
- mov [hTab],eax
- ; Инициализация структуры вкладок
- mov [TabCtrlItem.mask],TCIF_TEXT
- mov [TabCtrlItem.lpReserved1],0
- mov [TabCtrlItem.lpReserved2],0
- mov [TabCtrlItem.iImage],-1
- mov [TabCtrlItem.lParam],0
- ; Максимальный размер текста
- mov [TabCtrlItem.cchTextMax],64
- ; Добавить первую вкладку
- mov [TabCtrlItem.pszText],stitle1
- invoke SendMessage,[hTab],TCM_INSERTITEM,0,TabCtrlItem
- ; Добавить вторую вкладку
- mov [TabCtrlItem.pszText],stitle2
- invoke SendMessage,[hTab],TCM_INSERTITEM,1,TabCtrlItem
- ; Добавить третью вкладку
- mov [TabCtrlItem.pszText],stitle3
- invoke SendMessage,[hTab],TCM_INSERTITEM,2,TabCtrlItem
Code (Assembler) : Убрать нумерацию
- ; Добавить диалоги и обработчики на каждую вкладку
- invoke CreateDialogParam,[hInstance],ID_SHEET1,[hTab],DialogOneProc,0
- mov [hTabDlg+0*4],eax
- invoke CreateDialogParam,[hInstance],ID_SHEET2,[hTab],DialogTwoProc,0
- mov [hTabDlg+1*4],eax
- invoke CreateDialogParam,[hInstance],ID_SHEET3,[hTab],DialogThreeProc,0
- mov [hTabDlg+2*4],eax
- ; Показать первую вкладку, остальные скрыть
- invoke ShowWindow,[hTabDlg+0*4],SW_SHOWDEFAULT
- invoke ShowWindow,[hTabDlg+1*4],SW_HIDE
- invoke ShowWindow,[hTabDlg+2*4],SW_HIDE
- ; Текущая вкладка - первая
- mov [SelTab],0
- ; Установить текущую вкладку
- invoke SendMessage,[hTab],TCM_SETCURSEL,[SelTab],0
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_NOTIFY
- je .tabproc
- ...
- ...
- .tabproc:
- ; Обработчик переключения вкладок
- cmp [wparam],TAB_MAIN
- jne .processed
- ; Пришло уведомление о переключении вкладки?
- mov eax,[lparam]
- cmp [eax+NMHDR.code],TCN_SELCHANGE
- jne .processed
- ; Спрятать текущую вкладку
- mov eax,[SelTab]
- invoke ShowWindow,[hTabDlg+eax*4],SW_HIDE
- ; Получить выбранную вкладку
- invoke SendMessage,[hTab],TCM_GETCURSEL,0,0
- ; Текущая вкладка = новая вкладка
- mov [SelTab],eax
- ; Показать новую вкладку
- invoke ShowWindow,[hTabDlg+eax*4],SW_SHOWDEFAULT
Code (Assembler) : Убрать нумерацию
- ; Инициализация структуры вкладок
- mov [TabCtrlItem.mask],TCIF_TEXT + TCIF_IMAGE
- mov [TabCtrlItem.lpReserved1],0
- mov [TabCtrlItem.lpReserved2],0
- mov [TabCtrlItem.lParam],0
- ; Максимальный размер текста
- mov [TabCtrlItem.cchTextMax],64
- ; Создать список изображений
- invoke ImageList_Create,16,16,ILC_COLOR32 + ILC_MASK,3,0
- mov [hImageList],eax
- ; Заполнить список иконками
- stdcall LoadIconFromMemory,icon_1,16
- invoke ImageList_AddIcon,[hImageList],eax
- stdcall LoadIconFromMemory,icon_2,16
- invoke ImageList_AddIcon,[hImageList],eax
- stdcall LoadIconFromMemory,icon_3,16
- invoke ImageList_AddIcon,[hImageList],eax
- ; Связать список картинок с контролом
- invoke SendMessage,[hTab],TCM_SETIMAGELIST,0,[hImageList]
- ; Добавить первую вкладку
- mov [TabCtrlItem.pszText],stitle1
- mov [TabCtrlItem.iImage],0
- invoke SendMessage,[hTab],TCM_INSERTITEM,0,TabCtrlItem
- ; Добавить вторую вкладку
- mov [TabCtrlItem.pszText],stitle2
- mov [TabCtrlItem.iImage],1
- invoke SendMessage,[hTab],TCM_INSERTITEM,1,TabCtrlItem
- ; Добавить третью вкладку
- mov [TabCtrlItem.pszText],stitle3
- mov [TabCtrlItem.iImage],2
- invoke SendMessage,[hTab],TCM_INSERTITEM,2,TabCtrlItem
Code (Assembler) : Убрать нумерацию
- ; Установить размер вкладок
- invoke SendMessage,[hTab],TCM_SETITEMSIZE,0,(30 shl 16 + 90)
И еще немного стилизации, а точнее, динамики. Для того, чтобы в любой момент поменять заголовок и/или иконку вкладки, надо воспользоваться сообщением TCM_SETITEM. Его можно использовать, например, устанавливая на активную вкладку цветную иконку, а при уходе с вкладки заменяя ее на иконку в градациях серого. Или добавлять звездочку к названию изменившейся вкладки, как это делают некоторые текстовые редакторы. Или еще как-нибудь, в зависимости от решаемой задачи.
Code (Assembler) : Убрать нумерацию
- ; Указатель на строку нового заголовка
- mov [TabCtrlItem.pszText],stitle3x
- ; Индекс новой иконки из ImageList
- mov [TabCtrlItem.iImage],3
- ; Установить новую иконку и заголовок третьей вкладке
- invoke SendMessage,[hTab],TCM_SETITEM,2,TabCtrlItem
Просмотров: 1689 | Комментариев: 7
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Nemo
(20.08.2021 в 10:03):
Видимо это баг Winapi DialogBoxParam / CreateDialogParam. При создании диалога функциями DialogBoxIndirectParam / CreateDialogIndirectParam и установки стиля WS_EX_CONTROLPARENT SysTabControl32 и вкладкам, tabstop работает без хуков
ManHunter
(16.08.2021 в 13:03):
Я в своей программе Hotkey Helper делал через хуки.
Nemo
(16.08.2021 в 12:32):
При установке стилей WS_EX_CONTROLPARENT сhild window и SysTabControl32 VK_TAB работает только с control'ами основного окна и первым control child window.
Есть ли способ, кроме хуков, восстановить taborder вкладок ?
(диалоги MFC работают корректно)
Есть ли способ, кроме хуков, восстановить taborder вкладок ?
(диалоги MFC работают корректно)
ManHunter
(01.11.2020 в 18:34):
Как говорила одна из моих школьных учительниц, "если нет вопросов, значит или все понятно, или не понятно ничего".
GRAFik
(01.11.2020 в 16:40):
ManHunter, огромное спасибо за интересную тему, которую, по-моему, в сети не так-то просто и найти, а на FASM'е так точно больше нигде не найдешь. Я помню, у Фроловых код на Си находил, да и то, то ли не весь или там какие-то ошибки(опечатки) были, не помню уже, но что-то я долго с ним разбирался. Может на тот момент у меня опыта поменьше было? ))
P.S. Заметил некую тенденцию: чем интересней тема/пост - тем меньше комментариев и благодарностей. Может это поварская тематика многих серьезных людей отпугивает и они боятся нарваться на очередной рецепт борща от ManHunter'а? ))
P.S. Заметил некую тенденцию: чем интересней тема/пост - тем меньше комментариев и благодарностей. Может это поварская тематика многих серьезных людей отпугивает и они боятся нарваться на очередной рецепт борща от ManHunter'а? ))
dark
(01.11.2020 в 11:03):
красиво смотриться лайк
Добавить комментарий
Заполните форму для добавления комментария
Сказки дядюшки Римуса о х64--> Создание закладок
https://wasm.in/threads/skazki...#post-383774
Управляющие сообщения, Нотификационные сообщения, Стили элементов Tab Control, Иконки на Tab Control
https://wasm.in/threads/skazki...#post-383775
masm 64-бита