· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Owner draw items

Посл.отвђт Сообщен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