
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#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, то отрисовка меню, мячгко говоря, страдает. Как можно это исправить? (шоты приложил)
Прикреплённый файл ![]() |