![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MYITEM перевести с С++ на Delphi [D7, WinXP]
Dmitry_177 © (2007-02-22 15:28:00)Как перевести структуру MYITEM с С++ на Delphi?
typedef struct tagMYITEM
{
HFONT hfont;
int cchItemText;
char szItemText[1];
} MYITEM;
Я перевел так:
PMYITEM = ^MYITEM;
MYITEM = packed record
hfont: HFONT;
cchItemText: integer;
szItemText: char;
end;
Но мне кажется это не правильно...
clickmaker (2007-02-26 12:14:00) [1]
> Dmitry_177 (23.02.07 17:29) [11]
AppendMenu(hMenu, MF_OWNERDRAW, id, <указатель на данные в куче или элемент глобального списка/массива>);
если данные - строка, то она не должна быть локальной переменной
s := StrNew()
AppendMenu(hMenu, MF_OWNERDRAW, id, s);
а после удаления меню удаляешь и строки
Dmitry_177 (2007-02-23 17:29:00) [2]Т.е. я как понял в моем случае нужно создавать меню функцией InsertMenuItem(MFT_OWNERDRAW ), и в структуре MENUITEMINFO в параметре dwItemData записывать то что мне нужно.. А с функцией AppendMenu(MF_OWNERDRAW) придется потом тогда еще модифицировать меню какой-нибудь ModifyMenu или еще какой-нибудь чтобы дописать данные в itemData.. Я так понимаю? Какой тогда из этих вариантов лучше? Я думаю что лучше с InsertMenuItem(MFT_OWNERDRAW )
Dmitry_177 (2007-02-22 21:47:00) [3]
> если в AppendMenu(MF_OWNERDRAW ), то в itemData должен быть
> указатель на данные, которые доступны к моменту вызова WM_MEASURE/DRAWITEM.
А что за данные? Как их считать? Мне вобщем нужно в WM_MEASUREITEM узнать ширину текста чтобы назначить ширину пункта меню, только лишь и всего..
clickmaker (2007-02-22 18:35:00) [4]если в AppendMenu(MF_OWNERDRAW ), то в itemData должен быть указатель на данные, которые доступны к моменту вызова WM_MEASURE/DRAWITEM. Т.е. данные в куче, не локальные переменные.
И освобождать их надо уже после того, как меню станет не нужно
Dmitry_177 (2007-02-22 18:31:00) [5]AppendMenu, но в itemData я ничего не записываю.. Я даже и не знал что надо туда что-то записывать.. Я тогда получше код посмотрю на том сайте с созданием и если что отпишу тогда..
clickmaker (2007-02-22 18:26:00) [6]
> [6] Dmitry_177 (22.02.07 18:18)
погодь... если это меню, то itemData - это пользовательские данные. Если ты сам туда ничего не положил, то там ничего и не будет.
Как ты это меню создаешь?
Dmitry_177 (2007-02-22 18:18:00) [7]Что-то не работает... Пробовал и так szItemText: array [0..0] of Char;и так szItemText: PChar;
Может и нету там.. Просто мне нужно в WM_MEASUREITEM узнать как-то текст пункта меню, чтобы узнать его ширину..
Пример нашел вот здесь: http://vsokovikov.narod.ru/Msdn_api/Global_SDK/Overview/UI/Menu/example_owner.htm
clickmaker (2007-02-22 18:10:00) [8]var
item: PMyItem;
item := PMyItem(PMEASUREITEMSTRUCT(lParam).itemData);
if (item <> nil) then begin
GetTextExtentPoint32(DC, item.szItemText, item.cchItemText, mSize);
end else
может там нету ничего?
Dmitry_177 (2007-02-22 17:53:00) [9]Блин, не работает..
Мне нужно это в WM_MEASUREITEM обрабатывать, в структуре MEASUREITEMSTRUCT в параметре itemData какраз и содержится указатель на структуру MYITEM. Вычитал я это из интернета, но там на С++:
LRESULT CALLBACK MainWindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_MEASUREITEM:
OnMeasureItem(hwnd, (LPMEASUREITEMSTRUCT) lParam);
return TRUE;
...
VOID WINAPI OnMeasureItem(HWND hwnd, LPMEASUREITEMSTRUCT lpmis)
{
MYITEM *pMyItem = (MYITEM *) lpmis->itemData;
HDC hdc = GetDC(hwnd);
HFONT hfntOld = SelectObject(hdc, pMyItem->hfont);
SIZE size;
GetTextExtentPoint32(hdc, pMyItem->szItemText,
pMyItem->cchItemText, &size);
lpmis->itemWidth = size.cx;
lpmis->itemHeight = size.cy;
SelectObject(hdc, hfntOld);
ReleaseDC(hwnd, hdc);
}
Вот я делаю в Delphi:
WM_MEASUREITEM: begin
DC := GetDC(Window);
GetTextExtentPoint32(DC, PMYITEM(PMEASUREITEMSTRUCT(lParam)^.itemData)^.szItemText, PMYITEM(PMEASUREITEMSTRUCT(lParam)^.itemData)^.cchItemText, mSize);
PMEASUREITEMSTRUCT(lParam)^.itemWidth := mSize.cx;
PMEASUREITEMSTRUCT(lParam)^.itemHeight := 21;
ReleaseDC(Window, DC);
Result := 1;
end;
Шрифт у меня обычный, не меняю его при прорисовке меню так что вот это: HFONT hfntOld = SelectObject(hdc, pMyItem->hfont);я думаю мне не нужно делать..
При запуске программы у меня выскакивает вот это: Runtime error 216 at 77F2BFE9
Dmitry_177 (2007-02-22 17:38:00) [10]Всегда хотел спросить, а можно ли в Delphi называть переменные как ее тип? Т.е. так: hfont: HFONT;? На сколько я знаю С++ чувствителен к регистру букв, а Delphi нет..
clickmaker (2007-02-22 17:10:00) [11]скорей всего, там предполагается переменной длины строка. А длина - cchItemText.
Тогда просто szItemText: PChar;
MBo (2007-02-22 15:54:00) [12]szItemText: array [0..0] of char;