TCITEMHEADER - как это работает?
От: Northsoft  
Дата: 09.01.11 11:39
Оценка:
Если через WinAPI создавать набор вкладок (TabCtrl), то с использованием сообщений TCM_INSERTITEM и подобными разрешается использовать не только структуру TC_ITEM, но и любую структуру, у которой первым полем является структура типа TCITEMHEADER, а хвост у неё может быть сколь угодно длинным. Внимание, вопрос: как операционная система (GDI) определяет размер этого "хвоста"? Может, я слепой и не увидел поле, куда нужно вписать sizeof(моя_структура)?
tcitemheader tc_item tabctrl tab control tcm_insertitem winapi
Re: TCITEMHEADER - как это работает?
От: Pavel Dvorkin Россия  
Дата: 09.01.11 12:30
Оценка:
Здравствуйте, Northsoft, Вы писали:

N>Если через WinAPI создавать набор вкладок (TabCtrl), то с использованием сообщений TCM_INSERTITEM и подобными разрешается использовать не только структуру TC_ITEM, но и любую структуру, у которой первым полем является структура типа TCITEMHEADER, а хвост у неё может быть сколь угодно длинным. Внимание, вопрос: как операционная система (GDI) определяет размер этого "хвоста"? Может, я слепой и не увидел поле, куда нужно вписать sizeof(моя_структура)?


TCITEM Structure

lParam
Application-defined data associated with the tab control item. If more or less than 4 bytes of application-defined data exist per tab, an application must define a structure and use it instead of the TCITEM structure. The first member of the application-defined structure must be a TCITEMHEADER structure.

Так что GDI не будет определять размер этого поля и вообще им интересоваться. Это Application-defined data, вот ты ими сам и занимайся.
With best regards
Pavel Dvorkin
Re: TCITEMHEADER - как это работает?
От: Jolly Roger  
Дата: 09.01.11 12:49
Оценка:
Здравствуйте, Northsoft, Вы писали:

N>Если через WinAPI создавать набор вкладок (TabCtrl), то с использованием сообщений TCM_INSERTITEM и подобными разрешается использовать не только структуру TC_ITEM, но и любую структуру, у которой первым полем является структура типа TCITEMHEADER, а хвост у неё может быть сколь угодно длинным. Внимание, вопрос: как операционная система (GDI) определяет размер этого "хвоста"? Может, я слепой и не увидел поле, куда нужно вписать sizeof(моя_структура)?


ОСи этого не нужно. Вы ведь передаёте указатель, и ОС достаточно знать, что по этому адресу сначала лежит TCITEM, а что там за ней, ОС уже не интересно, она обращается только к первым sizeof(TCITEM) байтам. В принципе, это стандартный спочоб "расширить" структуру в подобных случаях.
"Нормальные герои всегда идут в обход!"
способ
Re[2]: TCITEMHEADER - как это работает?
От: Northsoft  
Дата: 09.01.11 23:58
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>TCITEM Structure
PD>lParam
PD>Application-defined data associated with the tab control item. If more or less than 4 bytes of application-defined data exist per tab, an application must define a structure and use it instead of the TCITEM structure. The first member of the application-defined structure must be a TCITEMHEADER structure.
PD>Так что GDI не будет определять размер этого поля и вообще им интересоваться. Это Application-defined data, вот ты ими сам и занимайся.

То есть и запоминать эти данные операционка не будет? Как тогда производится хранение и предоставление доступа к этим Application-defined данным?
Re[2]: TCITEMHEADER - как это работает?
От: Northsoft  
Дата: 10.01.11 00:02
Оценка:
Здравствуйте, Jolly Roger, Вы писали:
JR>ОСи этого не нужно. Вы ведь передаёте указатель, и ОС достаточно знать, что по этому адресу сначала лежит TCITEM, а что там за ней, ОС уже не интересно, она обращается только к первым sizeof(TCITEM) байтам. В принципе, это стандартный спочоб "расширить" структуру в подобных случаях.

Как я понял, ОС обязана по TCM_GETITEM вернуть структуру, которая была передана в TCM_SETITEM/TCM_INSERTITEM, причём не в размере sizeof(TCITEMHEADER), а полностью. И мне интересно, как она это делает.
Re: Ответ с MSDN Social
От: Northsoft  
Дата: 10.01.11 02:37
Оценка:
Уважаемые коллеги,
http://msdn.microsoft.com/en-us/library/bb760633%28v=vs.85%29.aspx (размер пользовательской структуры указывается явно при помощи сообщения TCM_SETITEMXEXTRA).
Вопрос исчерпан, тема закрыта.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.