Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.249 c
2-1175517371
annn
2007-04-02 16:36
2007.04.22
Процедуры и функции


2-1175561133
SerJaNT
2007-04-03 04:45
2007.04.22
Присвоить событию свою процедуру


1-1172341037
Kolan
2007-02-24 21:17
2007.04.22
Code template в BDS 2006


4-1164645015
Альберт
2006-11-27 19:30
2007.04.22
получение хэндла окна из TShellExecuteInfo


6-1153507929
bobbi
2006-07-21 22:52
2007.04.22
Почему не работает след. код (отправка почты)