На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Менюхи , Писать всем!
    в своих программах я использую меню: TMainMenu и TPopupMenu.

    но даже в ХР их внешний вид не меняется!

    как этому помочь? может нужны специальные компоненты-меню или еще что-то?
    и ще: когда программа на трэе можно вызвать меню после дэактивации, меню не исчезает. что делать???
      Там, по-моему, есть какой-то стандартный компонент, он помогает адаптироваться... XPманифест, начиная с Delphi7... точнее не скажу, сам краем уха где-то слышал... вполне возможно, что это не тот звон, что тебе нужен...
        я забыл дописать что это уже с Манифестом
          Skynet, если нужны красивые компоненты, то поставь се rxlib
            Skynet, версия Дельфи? И какие ты хочешь меню? Если в стиле оффиса - то это ToolBar2000/TBX, DevExpress...
              к S-MIKE

              где это все достать?(кроме ТИМЕЙДЖ КОНТРОЛС).

              и еще это распространяэтся на контекстные меню???
                Цитата Skynet @
                где это все достать?(кроме ТИМЕЙДЖ КОНТРОЛС).

                Skynet, в интернете. Искать в гугле или яндексе думаю умеешь.
                  искать - то я умею, но как правило это
                  500-1500 ссылок. и только пару могут быть нужными.

                  я думал у тебя есть прямие линки :unsure: потому и спросил.
                  извини за напряг :unsure: :unsure:
                    http://www.jrsoftware.org/tb2k.php
                    http://mxs.bergsoft.net/
                    http://g32.org
                      В 7ой Delphi есть пример - ..\Borland\Delphi7\Demos\ActionBands
                      там используется ХР меню, т.е. можно менять его вид. Можешь посмотреть, как это сделано, но это не через TMainMenu.
                        Цитата black_shade @
                        там используется ХР меню

                        На самом деле отрисовывается меню в стиле оффис XP.
                          Цитата
                          На самом деле отрисовывается меню в стиле оффис XP.

                          Ну да, это я и имел в виду. Я думаю, что это и надо было, потому что меню в XP отрисовывается как всегда. Но несмотря на это, у многих складывается впечатление, что менб в оффис - это меню XP.
                          P.S. Может я и не прав.
                            Насчёт манифеста:
                            В Delphi 2005 его нет, но там и так всё замечательно
                            В Delphi 7 он уже стандартен (компонент)
                            В более ранних версиях надо добавлять ресурс Manifest.res (или что-то такое)

                            Насчёт меню DevExpressBars. Это пожалуй лучшее, что я видел из меню. всё красиво (cтиль OfficeXP) и не глючит, как другие. Позволяет настраивать меню на этапе работы, что редкость, и записывать настройки в файл или реестр (т.е. в следующий раз будешь видеть то, как настроил в прошый)...


                            s-mike, у тебя рускоязычная версия в ссылках? (Если нет, то я могу куда-нить положить, свою, переведённыю)
                              Цитата Jupiter_perm @
                              и не глючит

                              Я вызывал AV в демке при работе в дезигн тайм ;)
                                Где достать этот
                                Цитата jack128 @
                                DevExpressBars
                                .

                                Я смотрел, нигде НЕТ.Jupiter_perm может дашь прямой линк???
                                  Чего вы к этому DevExpress прицепились? Он дорого стоит и много занимает. А Toolbar2000/TBX не хуже. Единственный недостаток - менее удобная настройка.
                                    Если уж "Писать всем" (с ударением где?), то и я (как противник сторонних компонентов) напишу: юзай onAdvancedDrawItem() - будет щастье.
                                      Уважаемые!
                                      С созданием МэйнМеню я разобрался, спасибо всем кто помог!
                                      В процесе обговорения моего вопроса мы потеряли его суть!
                                      напомню что суть в том что:"...как создать контекстное меню в стиле Майкрософт Офис" и "... почему не исчезает при деактивациии программы ее контекстное меню вызванное с Трэя".

                                      как быть с этим??????????? :unsure: :unsure:
                                        контекстное меню из трея надо вот так вызывать:
                                        ExpandedWrap disabled
                                          getCursorPos(P);
                                          setForegroundWindow(Handle);
                                          TrayMenu.Popup(P.X, P.Y);
                                          postMessage(Handle, WM_NULL, 0, 0)

                                        Тогда и исчезать будет, как надо.

                                        Добавлено
                                        главное меню и контекстное в стиле офиса (почти):
                                        ExpandedWrap disabled
                                          procedure TMainForm.File1AdvancedDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
                                          var
                                           Flag: integer;
                                           i: integer;
                                           r, g, b: real;
                                          begin
                                           if odSelected in State then
                                           begin
                                            r:=getRValue(colorToRGB(clMainMenuBar))/255;
                                            g:=getGValue(colorToRGB(clMainMenuBar))/255;
                                            b:=getBValue(colorToRGB(clMainMenuBar))/255;
                                            for i:=4 downto 0 do
                                            begin
                                             ACanvas.Pen.Color:=rgb(round(r*Shadow[i]), round(g*Shadow[i]), round(b*Shadow[i]));
                                             ACanvas.Brush.Color:=ACanvas.Pen.Color;
                                             ACanvas.RoundRect(ARect.Right-i, ARect.Top+9-i, ARect.Right+i, ARect.Bottom, i, i)
                                            end;
                                            ACanvas.Brush.Color:=clMenu{Background};
                                            ACanvas.FillRect(ARect);
                                            ACanvas.Pen.Color:=clBtnShadow;
                                            ACanvas.moveTo(ARect.Left, ARect.Bottom);
                                            ACanvas.lineTo(ARect.Left, ARect.Top);
                                            ACanvas.lineTo(ARect.Right-1, ARect.Top);
                                            ACanvas.lineTo(ARect.Right-1, ARect.Bottom);
                                            ACanvas.Font.Color:=clMenuText; //clMenuSelectedText
                                           end
                                           else          
                                            if odHotLight in State then
                                            begin
                                             ACanvas.Brush.Color:=clMenuLeft;
                                             ACanvas.Pen.Color:=clMenuSelectedBorder;
                                             ACanvas.Rectangle(ARect);
                                             ACanvas.Font.Color:=clMenuCaption
                                            end
                                            else
                                            begin
                                             ACanvas.Brush.Color:=clMainMenuBar;
                                             ACanvas.fillRect(Rect(ARect.Left, ARect.Top, ARect.Right+5, ARect.Bottom));
                                             ACanvas.Font.Color:=clMenuText
                                            end;
                                            ACanvas.Brush.Style:=bsClear;
                                            Flag:=DT_NOCLIP or DT_SINGLELINE or DT_CENTER or DT_VCENTER;
                                            if odNoAccel in State then Flag:=Flag or DT_HIDEPREFIX;
                                            drawText(ACanvas.Handle, PChar((Sender as TMenuItem).Caption), length((Sender as TMenuItem).Caption), ARect, Flag)
                                          end;
                                           
                                          procedure TMainForm.Exit1AdvancedDrawItem(Sender: TObject;
                                            ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
                                          const
                                           CHECK = 9; // Константы равны индексам соответствующих рисунков в ImageList
                                           RADIO = 10;
                                          var
                                           ImgIndex: integer;
                                           sc: string;
                                           r: TRect;
                                          begin
                                           if (odSelected in State) and (Sender as TMenuItem).Enabled then
                                           begin
                                            ACanvas.StretchDraw(ARect, MenuSelectedBitmap);
                                            ACanvas.Pen.Style:=psSolid;
                                            ACanvas.Pen.Color:=clMenuSelectedBorder;
                                            ACanvas.Brush.Style:=bsClear;
                                            ACanvas.Rectangle(ARect);
                                            ACanvas.Font.Color:=clMenuSelectedText
                                           end
                                           else
                                           begin
                                            ACanvas.Pen.Style:=psClear;
                                            ACanvas.StretchDraw(Rect(ARect.Left, ARect.Top, ARect.Left+18, ARect.Bottom+1), MenuLeftBitmap);
                                            ACanvas.Brush.Color:=clMenuBackground;
                                            ACanvas.Rectangle(ARect.Left+17, ARect.Top, ARect.Right+1, ARect.Bottom+1);
                                            if (Sender as TMenuItem).Enabled then ACanvas.Font.Color:=clMenuCaption
                                            else ACanvas.Font.Color:=clMenuDisabledCaption
                                           end;
                                           if (Sender as TMenuItem).Caption='-' then
                                           begin
                                            ACanvas.Pen.Color:=clMenuLine;
                                            ACanvas.Pen.Style:=psSolid;
                                            ACanvas.moveTo(ARect.Left+31, ARect.Top+1);
                                            ACanvas.lineTo(ARect.Right, ARect.Top+1)
                                           end
                                           else
                                           begin
                                            if (Sender as TMenuItem).Default then ACanvas.Font.Style:=ACanvas.Font.Style+[fsBold];
                                            ACanvas.Brush.Style:=bsClear;
                                            r:=Rect(ARect.Left+30, ARect.Top, ARect.Right, ARect.Bottom);
                                            ImgIndex:=DT_NOCLIP or DT_SINGLELINE or DT_VCENTER;
                                            {if BiDiMode=bdLeftToRight then }ImgIndex:=ImgIndex or DT_LEFT{ else ImgIndex:=ImgIndex or DT_RIGHT}; // It's not Image Index :) It's DrawText flag
                                            if odNoAccel in State then ImgIndex:=ImgIndex or DT_HIDEPREFIX;
                                            drawText(ACanvas.Handle, PChar((Sender as TMenuItem).Caption), length((Sender as TMenuItem).Caption), r, ImgIndex);
                                            sc:=ShortcutToText((Sender as TMenuItem).ShortCut);
                                            if sc<>'' then
                                            begin
                                             inc(r.Right, -10); // -10 - const of the VCL AdvancedDrawMenuItem. SubmenuArrows will never presents in MenuItems with Shortcuts
                                             ImgIndex:=DT_RIGHT or DT_VCENTER or DT_NOCLIP or DT_SINGLELINE;
                                             drawText(ACanvas.Handle, PChar(sc), length(sc), r, ImgIndex)
                                            end;
                                            if (Sender as TMenuItem).ImageIndex>=0 then
                                             ImageList1.draw(ACanvas, ARect.Left+4, ARect.Top+3, (Sender as TMenuItem).ImageIndex{, (Sender as TMenuItem).Enabled});
                                            if (Sender as TMenuItem).Checked then
                                            begin
                                             if (Sender as TMenuItem).RadioItem then ImgIndex:=RADIO else ImgIndex:=CHECK; // Here is The Image index :)
                                             ACanvas.Pen.Style:=psSolid;
                                             if (Sender as TMenuItem).ImageIndex<0 then
                                              ImageList1.draw(ACanvas, ARect.Left+5, ARect.Top+4, ImgIndex);
                                             ACanvas.Pen.Color:=clBlack;
                                             ACanvas.moveTo(ARect.Left+2, ARect.Bottom-3);
                                             ACanvas.lineTo(ARect.Left+2, ARect.Top+1);
                                             ACanvas.lineTo(ARect.Left+22, ARect.Top+1);
                                             ACanvas.Pen.Color:=clWhite;
                                             ACanvas.moveTo(ARect.Left+21, ARect.Top+2);
                                             ACanvas.lineTo(ARect.Left+21, ARect.Bottom-2);
                                             ACanvas.lineTo(ARect.Left+1, ARect.Bottom-2)
                                            end
                                           end
                                          end;
                                           
                                          procedure TMainForm.Exit1MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
                                          begin
                                           Width:=Width+7;
                                           if Height<22 then Height:=22;
                                           if (Sender as TMenuItem).Caption='-' then Height:=3
                                          end;
                                           
                                          procedure TMainForm.File1MeasureItem(Sender: TObject; ACanvas: TCanvas;
                                            var Width, Height: Integer);
                                          begin
                                           if width<13 then width:=13
                                          end;


                                        при запуске проекта еще создаются дополнительные примитивы:
                                        ExpandedWrap disabled
                                          // Shadow on white
                                           Shadow: array[0..4]of integer = (
                                            128,
                                            142,
                                            175,
                                            208,
                                            241
                                           );
                                           // Menu Colors
                                           clMenuLeft = $FFD0A0;
                                           clMenuBackground = $FFFFFF;
                                           clMenuCaption = $000000;
                                           clMenuDisabledCaption = $A0A0A0;
                                           clMenuSelectedTop = $80C0FF;
                                           clMenuSelectedBottom = $E0F8FF;
                                           clMenuSelectedBorder = $C0362C;
                                           clMenuSelectedText = $000000;
                                           clMenuLine = $D0A070;
                                           
                                          var
                                           ROOT: string;
                                           MenuSelectedBitmap: TBitmap;
                                           MenuLeftBitmap: TBitmap;
                                           clMainMenuBar: integer;
                                           
                                          implementation
                                           
                                          procedure paintMenuSelectedBitmap();
                                          var
                                           i: integer;
                                           dr, dg, db: real;
                                           r, g, b: integer;
                                          begin
                                           r:=getRValue(clMenuSelectedTop);
                                           g:=getGValue(clMenuSelectedTop);
                                           b:=getBValue(clMenuSelectedTop);
                                           dr:=(getRValue(clMenuSelectedBottom)-r)/MenuSelectedBitmap.Height;
                                           dg:=(getGValue(clMenuSelectedBottom)-g)/MenuSelectedBitmap.Height;
                                           db:=(getBValue(clMenuSelectedBottom)-b)/MenuSelectedBitmap.Height;
                                           for i:=0 to MenuSelectedBitmap.Height-1 do
                                            MenuSelectedBitmap.Canvas.Pixels[0, i]:=rgb(round(r+dr*i), round(g+dg*i), round(b+db*i))
                                          end;
                                           
                                          procedure paintMenuLeftBitmap();
                                          var
                                           i: integer;
                                           dr, dg, db: real;
                                           r, g, b: integer;
                                          begin
                                           r:=getRValue(clMenuLeft);
                                           g:=getGValue(clMenuLeft);
                                           b:=getBValue(clMenuLeft);
                                           dr:=(255-r)/MenuLeftBitmap.Width;
                                           dg:=(255-g)/MenuLeftBitmap.Width;
                                           db:=(255-b)/MenuLeftBitmap.Width;
                                           for i:=0 to MenuLeftBitmap.Width-1 do
                                            MenuLeftBitmap.Canvas.Pixels[i, 0]:=rgb(round(r+dr*i), round(g+dg*i), round(b+db*i))
                                          end;
                                           
                                          procedure checkMenuColor();
                                          var
                                           Ver: LongWord;
                                          begin
                                           Ver:=getVersion();
                                           if Lo(Ver)<5 then clMainMenuBar:=clMenu
                                           else clMainMenuBar:=clMenuBar
                                          end;
                                           
                                          initialization
                                           
                                          begin
                                           checkMenuColor();
                                           MenuSelectedBitmap:=TBitmap.create();
                                           MenuSelectedBitmap.PixelFormat:=pf24bit;
                                           MenuSelectedBitmap.Width:=1;
                                           MenuSelectedBitmap.Height:=32;
                                           paintMenuSelectedBitmap();
                                           MenuLeftBitmap:=TBitmap.create();
                                           MenuLeftBitmap.PixelFormat:=pf24bit;
                                           MenuLeftBitmap.Width:=32;
                                           MenuLeftBitmap.Height:=1;
                                           paintMenuLeftBitmap()
                                          end;
                                           
                                          finalization
                                           
                                          begin
                                           if assigned(MenuSelectedBitmap) then MenuSelectedBitmap.free();
                                           if assigned(MenuLeftBitmap) then MenuLeftBitmap.free()
                                          end;
                                           
                                          end.
                                          Miscђka огромное тебе спасибо, но не найдется чегото по-проще и конкретно для контекстного меню.
                                          а то ведь это все размер файла я уже и так вышел за рамки :)
                                            этот код размера файла почти не жрет. Посмотри, как рисует сам борланд - там код еще больше.
                                            Насчет ресурсов системы - можно подправить
                                              Посмотрел компоненты из ФАКа (Менюхи) - есть только один минус в них - если у элемента меню стоит MenuItem.Break = mbBreak | mbBarBreak, то отрисовка меню, мячгко говоря, страдает. Как можно это исправить? (шоты приложил)
                                              Сообщение отредактировано: LiquidStorm -

                                              Прикреплённый файлПрикреплённый файлmenu_exp.png (3.43 Кбайт, скачиваний: 244)
                                              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                              0 пользователей:


                                              Рейтинг@Mail.ru
                                              [ Script execution time: 0,0538 ]   [ 15 queries used ]   [ Generated: 18.07.25, 05:25 GMT ]