|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 15, 2003 16:31:54 Рисовал сабжевое меню, все вроде было нормально. Т.е. пока тестировал, некоторые значения ставил с потолка. Но вот надо ставить конкретные числа и тут возникло недоумение: - как узнать хандл меню, которое запрашивает размеры, т.е. через WM_MEASUREITEM. Там есть только ИД элемента, а если у меня несколько меню? Мне что искать во всех? Некрасиво это. Что М$ в падлу было добавить еще и хандл менюшки, все равно CtlID те используется... Помогите плиз с этой траблой, а то придется глупостями заниматься. :( |
|
|
Дата: Ноя 16, 2003 03:47:16 typedef struct tagMEASUREITEMSTRUCT { // mis UINT CtlType; // type of control UINT CtlID; // combo box, list box, or button identifier UINT itemID; // menu item, variable-height list box, or combo box identifier UINT itemWidth; // width of menu item, in pixels UINT itemHeight; // height of single item in list box menu, in pixels DWORD itemData; // application-defined 32-bit value } MEASUREITEMSTRUCT; itemID Specifies the identifier for a menu item or the position of a list box or combo box item. itemData Specifies the application-defined 32-bit value associated with the menu item Разве этих данных тебе не хватит, чтобы однозначно определить пункт меню? |
|
|
Дата: Ноя 16, 2003 10:25:33 Что бы определить пункт меню из одного меню хватит. А вот если у меня несколько менюшек. И в некоторых есть пункты которые надо рисовать, а в некоторых нет. Ведь для каждого пункта размеры свои, вычисляются они в зависимости от длины текста. А как же мне узнать длину текста? А точнее и сам текст. |
|
|
Дата: Ноя 16, 2003 14:44:23 Длина текста в пикселях GetTextextentPoint32, учитываеться шрифт выбранный для текущего окна. |
|
|
Дата: Ноя 16, 2003 15:36:18 Понял. Я уже смирился с мыслью делать все ручками. Просто у меня до сих пор менюшки в ресурсах были, теперь придется их ручками делать и считать длину элементов ... ну х. с ним, раз по другому ни как ... |
|
|
Дата: Ноя 16, 2003 18:31:45 lazari Разве так трудно присвоить всем owned-drawn итемам уникальные itemID? Ну и что, что менюшек несколько? |
|
|
Дата: Ноя 16, 2003 19:59:54 lazari как насчет разных ID? меню №1: ID+1000 меню №2: ID+2000 ... |
|
|
Дата: Ноя 16, 2003 21:10:41 Да, так и зделаю. Дело в том что я сначала хотел рисовать сам меню, которые были определял в ресурсах, т.е. не было известно длина изображаемого текста соответствующего пункта меню. Я думал вычислять ее во время вызова WM_MEASUREITEM, но не знал как узнать сразу, т.е. без дополнительных выкрутасов, хандл меню, затем считать инфо о пункте и вычислить его длину. Теперь же придется вычислять длину пунктов меню где-нибудь раньше, думаю что в обработке WM_CREATE. Вот так вот. Но все равно спасибо всем кто откликнулся. |
|
|
Дата: Ноя 17, 2003 11:16:14 Теперь же придется вычислять длину пунктов меню где-нибудь раньше, думаю что в обработке WM_CREATE Глупости, все это в обработчике WM_MEASUREITEM считается и довольно элементарно. |
|
|
Дата: Ноя 17, 2003 11:32:20 masquer Ну так может, подкинешь кусок кода, раз это так елементарно, или скажешь как вычислить длину текста в пикселях не зная хандла меню? |
|
|
Дата: Ноя 17, 2003 11:36:49 вычислить длину текста в пикселях не зная хандла меню Мдя, открой, пожалуйста MSDN и прочитай про WM_MEASUREITEM, особенно про то, что приходит в lParam - куча вопросов сама собой отпадет. |
|
|
Дата: Ноя 17, 2003 13:39:23 Слушай, хорошь за нос водить, я уже с десяток раз перечитал все что касается WM_MEASUREITEM и так и не нашел того что ищу, может ты не понял, но я ищу ХАНДЛ меню, которое СЕЙЧАС запрашивает размеры, вот и все. Там таким и не пахнет. WM_MEASUREITEM Notification: wParam Contains the value of the CtlID member of the MEASUREITEMSTRUCT structure pointed to by the lpMeasureItem parameter. This value identifies the control that sent the WM_MEASUREITEM message. If the value is zero, the message was sent by a menu. If the value is nonzero, the message was sent by a combo box or by a list box. If the value is nonzero, and the value of the itemID member of the MEASUREITEMSTRUCT pointed to by lpMeasureItem is (UINT) –1, the message was sent by a combo edit field. lpMeasureItem Pointer to a MEASUREITEMSTRUCT structure that contains the dimensions of the owner-drawn control or menu item. typedef struct MEASUREITEMSTRUCT { UINT CtlType; UINT CtlID; UINT itemID; UINT itemWidth; UINT itemHeight; ULONG_PTR itemData; } MEASUREITEMSTRUCT; CtlID Specifies the identifier of the combo box or list box. This member is not used for a menu. itemID Specifies the identifier for a menu item or the position of a list box or combo box item. This value is specified for a list box only if it has the LBS_OWNERDRAWVARIABLE style; this value is specified for a combo box only if it has the CBS_OWNERDRAWVARIABLE style. Ну и как же из этой скудной инфы найти то что я ищу? Может все-таки ткнешь носом, что бы мы больше не тратили вреия друг друга? |
|
|
Дата: Ноя 17, 2003 13:59:36 может ты не понял, но я ищу ХАНДЛ меню Хендл меню для расчета длины меню тебе не нужен. Ты получаешь WM_MEASUREITEM для каждого элемента меню, расчитываешь его размеры основываясь, например, на itemData, и загоняешь эти размеры в itemWidth и itemHeight. Ес-но, measureitem к тебе прийдет только в случае выставления для элемента меню owneddraw стиль. Система потом выбирает наибольшую ширину для меню. Собсно, это все rtfm. А хендл ты в WM_INITMENUPOPUP получаешь. И потом, тут уже несколько человек выложили свои версии меню с картинками, можно и на них посмотреть, если что непонятно... |
|
|
Дата: Ноя 17, 2003 15:35:25 Вот про WM_INITMENUPOPUP я ничего не знал. За это спасибо, буду пробовать. А вот на счет исходников, что здесь выложены, так я не видел ни одного простого, вычисляющего длину просто и быстро. У большинства это константы, а у тех что нет, то это уже сложная система менюшек. Это конечно, хорошая вещь, но для меня пока что рановато этим заниматься. Мне нужно попроще. Посмотрим что теперь получится. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083 |