Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.04 c
6-1161869306
Axis_of_Evil
2006-10-26 17:28
2007.04.22
TWSocket. как получить уведомление о невозможности соединения?


3-1170747668
RomanH
2007-02-06 10:41
2007.04.22
SQL-запрос


2-1175423128
I-New
2007-04-01 14:25
2007.04.22
Помогите написать плиз


15-1174826660
Romas81
2007-03-25 16:44
2007.04.22
диалог ввод пароля НЕ InputBox и InputQuery


1-1172567109
Тфьу
2007-02-27 12:05
2007.04.22
Создание библиотек bpl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский