Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Меню на Win Api с изображениеями. Не полностью отображается текст 
:(
    Опции темы
navodri
Дата 20.5.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



У меня менюшка с изображениями, написанная на Win32API, не хочет полностью отображать текст:

user posted image

Вот код:

Код

program menu;

uses
 Windows, Messages;

{$R dialog.res}

type
 TMenuItem = record
  text: String;
  icon: hIcon;
 end;

var
 MenuItems: array [1..3] of TMenuItem;

function DlgProc(hWin: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): bool; stdcall;
var
 hMainMenu, hSubMenu : hMenu;
 lpdis : ^TDrawItemStruct;
 item : ^TMenuItem;
begin
 Result := False;
  case uMsg of
   WM_INITDIALOG:
    begin
        MenuItems[1].icon := LoadImage(hInstance, MAKEINTRESOURCE(101), IMAGE_ICON, 16, 16, LR_DEFAULTSIZE or LR_LOADTRANSPARENT or LR_LOADMAP3DCOLORS);
        MenuItems[2].icon := LoadImage(hInstance, MAKEINTRESOURCE(102), IMAGE_ICON, 16, 16, LR_DEFAULTSIZE or LR_LOADTRANSPARENT or LR_LOADMAP3DCOLORS);
        MenuItems[3].icon := LoadImage(hInstance, MAKEINTRESOURCE(103), IMAGE_ICON, 16, 16, LR_DEFAULTSIZE or LR_LOADTRANSPARENT or LR_LOADMAP3DCOLORS);
        MenuItems[1].text := PChar('Новый файл');
        MenuItems[2].text := PChar('Сохранить проект');
        MenuItems[3].text := PChar('Выход');
        hMainMenu := CreateMenu;
        hSubMenu := CreatePopupMenu;
        AppendMenu(hMainMenu, MF_STRING or MF_POPUP, hSubMenu, PChar('Меню'));
        AppendMenu(hSubMenu, MF_OWNERDRAW, 101, @MenuItems[1]);
        AppendMenu(hSubMenu, MF_OWNERDRAW, 102, @MenuItems[2]);
        AppendMenu(hSubMenu, MF_SEPARATOR, 0, nil);
        AppendMenu(hSubMenu, MF_OWNERDRAW, 103, @MenuItems[3]);
        hSubMenu := CreatePopupMenu;
        AppendMenu(hMainMenu, MF_STRING or MF_POPUP, hSubMenu, PChar('Правка'));
        AppendMenu(hSubMenu, MF_OWNERDRAW, 101, @MenuItems[1]);
        AppendMenu(hSubMenu, MF_OWNERDRAW, 102, @MenuItems[2]);
        SetMenu(hWin, hMainMenu);
    end;

    WM_DRAWITEM:
      begin
        case PDRAWITEMSTRUCT(lp).CtlType of
          ODT_MENU :
            begin
              lpdis := Pointer(Lp);
              item := Pointer(lpdis.ItemData);
              if (lpdis.itemState and ODS_SELECTED = ODS_SELECTED) then
              begin
                FillRect(lpdis.hDC, lpdis.rcItem, GetSysColorBrush(COLOR_HIGHLIGHT));
                SetBkMode(lpdis.hDC, TRANSPARENT);
                SetBkColor(lpdis.hDC, GetSysColor(COLOR_HIGHLIGHT));
                SetTextColor(lpdis.hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
                DrawIconEx(lpdis.hDC, lpdis.rcItem.Left + 3, (lpdis.rcItem.Top + lpdis.rcItem.Bottom - 16) div 2, item.icon, 0, 0, 0, 0, DI_NORMAL);
              end
              else
              begin
                FillRect(lpdis.hDC, lpdis.rcItem, GetSysColorBrush(COLOR_MENU));
                SetTextColor(lpdis.hDC, GetSysColor(COLOR_MENUTEXT));
              end;
              if (lpdis.itemState and ODS_GRAYED) <> 0 then
                begin
                  SetBkMode(lpdis.hDC, TRANSPARENT);
                  SetTextColor(lpdis.hDC, GetSysColor(COLOR_GRAYTEXT));
                end;
              DrawIconEx(lpdis.hDC, lpdis.rcItem.Left + 3, (lpdis.rcItem.Top + lpdis.rcItem.Bottom - 16) div 2, item.icon, 0, 0, 0, 0, DI_NORMAL);
              lpdis.rcItem.left := lpdis.rcItem.left + 25;
              SetBkMode(lpdis.hDC, TRANSPARENT);
              DrawText(lpdis.hDC, @item.text[1], - 1, lpdis.rcItem, DT_SINGLELINE or DT_LEFT or DT_VCENTER);
            end;
        end;
      end;

   WM_COMMAND:
    begin //Обработка пунктов меню
     case LoWord(wp) of
      200: MessageBox(hWin, 'Сообщение 1', 'Сообщение...', MB_OK);
      201: MessageBox(hWin, 'Сообщение 2', 'Сообщение...', MB_OK);
      202: EndDialog(hWin, 0);
       1: EndDialog(hWin, 0);
    end;
  end;
   WM_DESTROY, WM_CLOSE: PostQuitMessage(0);
 end;
end;

begin
 DialogBox(hInstance, 'MAIN_WINDOW', 0, @DlgProc);


end.


А вот исходник: http://depositfiles.com/files/nzmq10h5k

Где я допустил ошибку?
Пример кода приветcтвуется.

Это сообщение отредактировал(а) navodri - 20.5.2010, 13:14
PM MAIL WWW   Вверх
Maks1509
Дата 20.5.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.8.2007
Где: г. Тольятти

Репутация: 3
Всего: 5



Да это скорее всего я допустил ошибку, это мой код, причем самый ранний. По идее высота и ширина пунктов расчитывается в сообщении WM_MEASUREITEM, здесь же только обрабатывается только WM_DRAWITEM. Пример по ссылке твоей не качается, видать что-то с файлообменником.
Держи новые варианты на апи, немного не доделаны, но работоспособны. smile

Это сообщение отредактировал(а) Maks1509 - 20.5.2010, 15:51

Присоединённый файл ( Кол-во скачиваний: 29 )
Присоединённый файл  menu_draw_api.rar 62,66 Kb
PM MAIL ICQ   Вверх
navodri
Дата 20.5.2010, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



Супер! Спасибо!
PM MAIL WWW   Вверх
navodri
Дата 20.5.2010, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



Разобрался с отрисовками. Примеры просто обалдеть! Еще раз спасибо!

Но у меня возник вопрос по теме:  а как показать в определенном пункте меню горячие клавишы (или сочетание клавиш), когда пользователь меняет их сам? Например, программа считывает из реестра сочетание клавиш и отображает в определенном пункте меню?
PM MAIL WWW   Вверх
Maks1509
Дата 20.5.2010, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.8.2007
Где: г. Тольятти

Репутация: 3
Всего: 5



Ну тут уже сам считываешь сочетание клавиш как тебе удобно из реестра и меняешь текст в пунктах меню - SetMenuItemInfo с нужными флагами или всякие InsertMenuItem/AppendMenu/InsertMenu/ModifyMenu. Предварительно считываешь текст с пунктов меню если к примеру, ищешь символ табуляции #9 в тексте чтобы отделить положение самого текста меню от текста сочетания клавиш, ну и выполняешь действия со стркоами как тебе удобно. smile
PM MAIL ICQ   Вверх
navodri
Дата 21.5.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



С реестром - всё понятно. Тут с меню сложнее. Мне трудно в этом разобратся. Я пропбоавал через ModifyMenu, но думаю, что тут одной строчкой не обойтись, надо считывать пункт меню, а потом всё вместе отрисовывать... 

Код

ModifyMenu(GetSubMenu(hAppMenu, 0), 1, MF_BYCOMMAND or MF_STRING, 1, PChar(' Как прочитать текст меню? ' + #9 + 'Здесь сочетание клавиш. Это мне понятно.'));


Для меня это темный лес. Можешь представить пример?
PM MAIL WWW   Вверх
bems
Дата 21.5.2010, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88




M
bems
Один топик — один вопрос!

Пожалуйста, ознакомьтесь с правилами форума.




Тема закрыта. Создайте по одной теме для каждого интересующего вас вопроса.


Это сообщение отредактировал(а) bems - 21.5.2010, 18:20


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1739 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.