
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Сообщ.
#1
,
|
|
|
в своих программах я использую меню: TMainMenu и TPopupMenu.
но даже в ХР их внешний вид не меняется! как этому помочь? может нужны специальные компоненты-меню или еще что-то? и ще: когда программа на трэе можно вызвать меню после дэактивации, меню не исчезает. что делать??? |
Сообщ.
#2
,
|
|
|
Там, по-моему, есть какой-то стандартный компонент, он помогает адаптироваться... XPманифест, начиная с Delphi7... точнее не скажу, сам краем уха где-то слышал... вполне возможно, что это не тот звон, что тебе нужен...
|
Сообщ.
#3
,
|
|
|
я забыл дописать что это уже с Манифестом
|
Сообщ.
#4
,
|
|
|
Skynet, если нужны красивые компоненты, то поставь се rxlib
|
Сообщ.
#5
,
|
|
|
Skynet, версия Дельфи? И какие ты хочешь меню? Если в стиле оффиса - то это ToolBar2000/TBX, DevExpress...
|
Сообщ.
#6
,
|
|
|
к S-MIKE
где это все достать?(кроме ТИМЕЙДЖ КОНТРОЛС). и еще это распространяэтся на контекстные меню??? |
Сообщ.
#7
,
|
|
|
Цитата Skynet @ где это все достать?(кроме ТИМЕЙДЖ КОНТРОЛС). Skynet, в интернете. Искать в гугле или яндексе думаю умеешь. |
Сообщ.
#8
,
|
|
|
искать - то я умею, но как правило это
500-1500 ссылок. и только пару могут быть нужными. я думал у тебя есть прямие линки ![]() извини за напряг ![]() ![]() |
Сообщ.
#9
,
|
|
|
http://www.jrsoftware.org/tb2k.php
http://mxs.bergsoft.net/ http://g32.org |
Сообщ.
#10
,
|
|
|
В 7ой Delphi есть пример - ..\Borland\Delphi7\Demos\ActionBands
там используется ХР меню, т.е. можно менять его вид. Можешь посмотреть, как это сделано, но это не через TMainMenu. |
Сообщ.
#11
,
|
|
|
Цитата black_shade @ там используется ХР меню На самом деле отрисовывается меню в стиле оффис XP. |
Сообщ.
#12
,
|
|
|
Цитата На самом деле отрисовывается меню в стиле оффис XP. Ну да, это я и имел в виду. Я думаю, что это и надо было, потому что меню в XP отрисовывается как всегда. Но несмотря на это, у многих складывается впечатление, что менб в оффис - это меню XP. P.S. Может я и не прав. |
Сообщ.
#13
,
|
|
|
Насчёт манифеста:
В Delphi 2005 его нет, но там и так всё замечательно В Delphi 7 он уже стандартен (компонент) В более ранних версиях надо добавлять ресурс Manifest.res (или что-то такое) Насчёт меню DevExpressBars. Это пожалуй лучшее, что я видел из меню. всё красиво (cтиль OfficeXP) и не глючит, как другие. Позволяет настраивать меню на этапе работы, что редкость, и записывать настройки в файл или реестр (т.е. в следующий раз будешь видеть то, как настроил в прошый)... s-mike, у тебя рускоязычная версия в ссылках? (Если нет, то я могу куда-нить положить, свою, переведённыю) |
![]() |
Сообщ.
#14
,
|
|
Цитата Jupiter_perm @ и не глючит Я вызывал AV в демке при работе в дезигн тайм ![]() |
Сообщ.
#15
,
|
|
|
Где достать этот
Цитата jack128 @ .DevExpressBars Я смотрел, нигде НЕТ.Jupiter_perm может дашь прямой линк??? |
Сообщ.
#16
,
|
|
|
Чего вы к этому DevExpress прицепились? Он дорого стоит и много занимает. А Toolbar2000/TBX не хуже. Единственный недостаток - менее удобная настройка.
|
![]() |
Сообщ.
#17
,
|
|
Если уж "Писать всем" (с ударением где?), то и я (как противник сторонних компонентов) напишу: юзай onAdvancedDrawItem() - будет щастье.
|
Сообщ.
#18
,
|
|
|
Уважаемые!
С созданием МэйнМеню я разобрался, спасибо всем кто помог! В процесе обговорения моего вопроса мы потеряли его суть! напомню что суть в том что:"...как создать контекстное меню в стиле Майкрософт Офис" и "... почему не исчезает при деактивациии программы ее контекстное меню вызванное с Трэя". как быть с этим??????????? ![]() ![]() |
![]() |
Сообщ.
#19
,
|
|
контекстное меню из трея надо вот так вызывать:
![]() ![]() getCursorPos(P); setForegroundWindow(Handle); TrayMenu.Popup(P.X, P.Y); postMessage(Handle, WM_NULL, 0, 0) Тогда и исчезать будет, как надо. Добавлено главное меню и контекстное в стиле офиса (почти): ![]() ![]() 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; при запуске проекта еще создаются дополнительные примитивы: ![]() ![]() // 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. |
Сообщ.
#20
,
|
|
|
Miscђka огромное тебе спасибо, но не найдется чегото по-проще и конкретно для контекстного меню.
а то ведь это все размер файла я уже и так вышел за рамки ![]() |
![]() |
Сообщ.
#21
,
|
|
этот код размера файла почти не жрет. Посмотри, как рисует сам борланд - там код еще больше.
Насчет ресурсов системы - можно подправить |
Сообщ.
#22
,
|
|
|
Посмотрел компоненты из ФАКа (Менюхи) - есть только один минус в них - если у элемента меню стоит MenuItem.Break = mbBreak | mbBarBreak, то отрисовка меню, мячгко говоря, страдает. Как можно это исправить? (шоты приложил)
Прикреплённый файл ![]() |