Maks150988

Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Привет. Интересует получение строки с пункта меню. Код такой: Код: program example; {$R example.res} uses Windows, Messages; const DIALOG = 101; MENU = 101; LIST = 77; var hDlg : Integer; MainMenu : HMENU; CurPT : TPoint; BufStr : array [0..255] of Char; function DlgProc(hWnd : HWND; uMsg, wParam, lParam : Integer) : Integer; stdcall; begin Result := 0; case uMsg of WM_INITDIALOG : hDlg := hWnd; WM_COMMAND : begin case wParam of LIST : begin GetMenuString(MainMenu, LIST, BufStr, SizeOf(BufStr), MF_BYCOMMAND); MessageBox(hDlg, BufStr, '', MB_OK); end; end; end; WM_RBUTTONDOWN : begin MainMenu := CreatePopupMenu; AppendMenu(MainMenu, MF_ENABLED or MF_STRING, LIST, PChar('String1')); AppendMenu(MainMenu, MF_SEPARATOR, 0, nil); AppendMenu(MainMenu, MF_ENABLED or MF_STRING, LIST, PChar('String2')); AppendMenu(MainMenu, MF_SEPARATOR, 0, nil); AppendMenu(MainMenu, MF_ENABLED or MF_STRING, LIST, PChar('String3')); SetForegroundWindow(hDlg); GetCursorPos(CurPT); TrackPopupMenu(MainMenu, TPM_LEFTALIGN or TPM_LEFTBUTTON, CurPT.x, CurPT.y, 0, hDlg, nil); PostMessage(hDlg, WM_NULL, 0, 0); DestroyMenu(MainMenu); end; WM_DESTROY, WM_CLOSE : PostQuitMessage(0); end; end; begin DialogBox(hInstance, PChar(DIALOG), 0, @DlgProc); end. | Когда меню на самом диалоге, то все прекрасно работает. Когда создаю динамически при нажатии на правую кнопку мыши, то строка пустая. Но ведь если убрать DestroyMenu(MainMenu); то каждый раз будет создаваться меню и использоваться лишняя память. И еще на какой пункт бы не нажал, всегда в буфер копируется только строчка текста из первого пункта меню. Может надо MF_BYPOSITION использовать? Или какой-нибудь другой изврат... |