На главную Наши проекты:
Журнал   ·   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_
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Менюхи , Писать всем!
    Чего вы к этому 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,0361 ]   [ 15 queries used ]   [ Generated: 18.07.25, 05:34 GMT ]