Форум: "Основная";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
ВнизMYITEM перевести с С++ на Delphi Найти похожие ветки
← →
Dmitry_177 (2007-02-22 15:28) [0]Как перевести структуру 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;
Но мне кажется это не правильно...
← →
MBo © (2007-02-22 15:54) [1]szItemText: array [0..0] of char;
← →
clickmaker © (2007-02-22 17:10) [2]скорей всего, там предполагается переменной длины строка. А длина - cchItemText.
Тогда просто szItemText: PChar;
← →
Dmitry_177 (2007-02-22 17:38) [3]Всегда хотел спросить, а можно ли в Delphi называть переменные как ее тип? Т.е. так: hfont: HFONT;? На сколько я знаю С++ чувствителен к регистру букв, а Delphi нет..
← →
Dmitry_177 (2007-02-22 17:53) [4]Блин, не работает..
Мне нужно это в 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
← →
clickmaker © (2007-02-22 18:10) [5]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 18:18) [6]Что-то не работает... Пробовал и так 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:26) [7]
> [6] Dmitry_177 (22.02.07 18:18)
погодь... если это меню, то itemData - это пользовательские данные. Если ты сам туда ничего не положил, то там ничего и не будет.
Как ты это меню создаешь?
← →
Dmitry_177 (2007-02-22 18:31) [8]AppendMenu, но в itemData я ничего не записываю.. Я даже и не знал что надо туда что-то записывать.. Я тогда получше код посмотрю на том сайте с созданием и если что отпишу тогда..
← →
clickmaker © (2007-02-22 18:35) [9]если в AppendMenu(MF_OWNERDRAW ), то в itemData должен быть указатель на данные, которые доступны к моменту вызова WM_MEASURE/DRAWITEM. Т.е. данные в куче, не локальные переменные.
И освобождать их надо уже после того, как меню станет не нужно
← →
Dmitry_177 (2007-02-22 21:47) [10]
> если в AppendMenu(MF_OWNERDRAW ), то в itemData должен быть
> указатель на данные, которые доступны к моменту вызова WM_MEASURE/DRAWITEM.
А что за данные? Как их считать? Мне вобщем нужно в WM_MEASUREITEM узнать ширину текста чтобы назначить ширину пункта меню, только лишь и всего..
← →
Dmitry_177 (2007-02-23 17:29) [11]Т.е. я как понял в моем случае нужно создавать меню функцией InsertMenuItem(MFT_OWNERDRAW ), и в структуре MENUITEMINFO в параметре dwItemData записывать то что мне нужно.. А с функцией AppendMenu(MF_OWNERDRAW) придется потом тогда еще модифицировать меню какой-нибудь ModifyMenu или еще какой-нибудь чтобы дописать данные в itemData.. Я так понимаю? Какой тогда из этих вариантов лучше? Я думаю что лучше с InsertMenuItem(MFT_OWNERDRAW )
← →
clickmaker © (2007-02-26 12:14) [12]
> Dmitry_177 (23.02.07 17:29) [11]
AppendMenu(hMenu, MF_OWNERDRAW, id, <указатель на данные в куче или элемент глобального списка/массива>);
если данные - строка, то она не должна быть локальной переменной
s := StrNew()
AppendMenu(hMenu, MF_OWNERDRAW, id, s);
а после удаления меню удаляешь и строки
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c