![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Меню состоящее из одних изображений? [D7, Win95/98, WinXP]
killer © (2004-06-20 13:42:00)Подскажите пожалуйста... Как сделать меню состоящее из одних изображений? Как это сделано в ICQ или в Messanger-е при выборе смайлика...
killer (2004-06-22 20:26:00) [1]???
killer (2004-06-21 23:04:00) [2]sergeЗаменить только вылеленные тобой строки или все? Т.е. я как понял надо так сделать?
if (Sender as TMenuItem).Checked and Selected then begin
ACanvas.Brush.Color := clBtnHighlight;
ACanvas.FillRect(ARect);
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENINNER, BF_TOPLEFT);
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_BOTTOMRIGHT);
end else if Selected then begin
Rectangle(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_TOPLEFT);
Rectangle(ACanvas.Handle, ARect, BDR_RAISEDOUTER, BF_BOTTOMRIGHT);
end else if (Sender as TMenuItem).Checked then begin
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENINNER, BF_TOPLEFT);
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_BOTTOMRIGHT);
end;
но Rectangle там X1 Y1 X2 Y2...
serge (2004-06-21 15:27:00) [3]
if (Sender as TMenuItem).Checked and Selected then begin
ACanvas.Brush.Color := clBtnHighlight;
ACanvas.FillRect(ARect);
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENINNER, BF_TOPLEFT);
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_BOTTOMRIGHT);
end else if Selected then begin
DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_TOPLEFT);
DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDOUTER, BF_BOTTOMRIGHT)
;
end else if (Sender as TMenuItem).Checked then begin
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENINNER, BF_TOPLEFT);
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_BOTTOMRIGHT);
end;
Вместо DrawEdge пиши Rectangle();
а перед этим
[
pen.width:=...;
pen.color:=...;
brush.style:=bsclear
] - если надо будет.
killer (2004-06-21 14:18:00) [4]Клас!!! Спасибо тебе serge! Работает...:) Тут у меня еще один вопросик возник... можно ли какнибудь сделать чтобы при наведении на картинку, картинка квадратиком черным обводилась... как это осуществить?
Knight (2004-06-21 13:00:00) [5]
> [22] GrayFace © (21.06.04 10:32)
> 1) Зачем TPaintBox? Лучше на канвасе формы.(Ведь все-равно
> нужна дополнительная форма)
Если меню не выходит за пределы формы то можно обойтись и без дополнительной...
serge (2004-06-21 10:46:00) [6]> GrayFace © (21.06.04 10:32) [22]
Григорьев Антон © очень даже прав ! :)
>killer ©
Нашел у себя давно скачанный компонент лови его текст:ъ
//
// TImageMenu 1.0
// special for My Notes Center project
// written by Dmitry "Creator" Bobrik / BC soft Team
// (c) 2001
// FREEWARE
//
unit ImageMenu;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus;
type
TImageMenuSelectEvent = procedure (Sender: TObject; SelImage: integer) of object;
TImageMenu = class(TPopupMenu)
private
{ Private declarations }
FCreated : boolean;
FSelImage : integer;
FOnSelect : TImageMenuSelectEvent;
FImagesPerCol : integer;
procedure MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
procedure DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
protected
{ Protected declarations }
procedure DoPopup(Sender: TObject); override;
procedure ClickImage(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
{ Public declarations }
published
{ Published declarations }
property OnSelect : TImageMenuSelectEvent read FOnSelect write FOnSelect;
property SelImage : integer read FSelImage write FSelImage;
property ImagesPerCol : integer read FImagesPerCol write FImagesPerCol;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TImageMenu]);
end;
constructor TImageMenu.Create(AOwner: TComponent);
begin
inherited;
Self.OwnerDraw := TRUE;
FCreated := FALSE;
end;
procedure TImageMenu.DoPopup(Sender: TObject);
var i : integer;
M : TMenuItem;
begin
if not FCreated then begin
if FImagesPerCol 0) then M.Break := mbBreak;
M.RadioItem := TRUE;
Self.Items.Add(M);
end;
FCreated := TRUE;
end;
Self.Items[FSelImage].Checked := TRUE;
inherited;
end;
destructor TImageMenu.Destroy;
begin
inherited;
end;
procedure TImageMenu.ClickImage(Sender: TObject);
begin
(Sender as TMenuItem).Checked := TRUE;
FSelImage := (Sender as TMenuItem).MenuIndex;
if Assigned(FOnSelect) then FOnSelect(Sender, FSelImage);
end;
procedure TImagemenu.MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height:
Integer);
begin
Height := 21;
Width := 6;
inherited;
end;
procedure TImageMenu.DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected:
Boolean);
begin
ACanvas.Brush.Color := clMenu;
ACanvas.FillRect(ARect);
if (Sender as TMenuItem).Checked and Selected then begin
ACanvas.Brush.Color := clBtnHighlight;
ACanvas.FillRect(ARect);
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENINNER, BF_TOPLEFT);
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_BOTTOMRIGHT);
end else if Selected then begin
DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_TOPLEFT);
DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDOUTER, BF_BOTTOMRIGHT);
end else if (Sender as TMenuItem).Checked then begin
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENINNER, BF_TOPLEFT);
DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_BOTTOMRIGHT);
end;
Images.Draw(ACanvas, ARect.Left + 2, ARect.Top + 2, (Sender as TMenuItem).MenuIndex);
end;
end.
GrayFace (2004-06-21 10:32:00) [7]Knight
1) Зачем TPaintBox? Лучше на канвасе формы.(Ведь все-равно нужна дополнительная форма)
5) OnMouseClick
Григорьев Антон
Ему нужна таблица картинок, а не список.
Григорьев Антон (2004-06-21 10:16:00) [8]Да вы что тут все, про WM_DRAWITEM и WM_MEASUREITEM никогда не слышали? Какие-то PaintBox'ы, OnMouseMove... Бр!!! У TMenuItem есть события OnDrawItem и OnMeasureItem - с их помощью можно вместо текста на пункте меню отобразить всё, что угодно.
Knight (2004-06-20 23:51:00) [9]
> [16] killer © (20.06.04 23:31)
> Knight Я почитал про TPaintBox, понял что в нем рисовать
> можно.... а вот как меню это сделать я не понимаю...
1) Бросаешь TPaintBox
2) Обзываешь его, например, SmilesMenuBox
3) onPaint - отрисовка изображений пунктов меню в цикле, например из TImageList, ресурса или ещё от куда...
4) onMouseMove - обработка перемещения мышы, например для подсветки...
5) onMouseDown - берёшь номер иконки и прячешь меню.
Можно также обработать события с клавы... вроде проще некуда.
pasha_golub (2004-06-20 23:45:00) [10]killer © (20.06.04 23:39) [18]
TControl.Width + TControl.Height + цикл
killer (2004-06-20 23:39:00) [11]pasha_golubа как это сделать?
pasha_golub (2004-06-20 23:38:00) [12]killer © (20.06.04 23:23) [14]
Это не самое сложное
killer (2004-06-20 23:31:00) [13]KnightЯ почитал про TPaintBox, понял что в нем рисовать можно.... а вот как меню это сделать я не понимаю...
Knight (2004-06-20 23:27:00) [14]
> killer © (20.06.04 23:21)
> все изображения разные
По размеру или содержанию?
Если содержанию, то TPaintBox самый простой...
killer (2004-06-20 23:23:00) [15]pasha_golubхорошая идея кстати... :) сделать бы еще какнибудь эффект появления и скрытия, то вообще супер будет :)
killer (2004-06-20 23:21:00) [16]KnightМеню как PopupMenu, но только раскрывается сетка изображений.... т.е. сколько изображений в строке и сколько-то таких строк... все изображения разные, и какое-то из этих изображений можно выбрать... Понял теперь? :)
pasha_golub (2004-06-20 21:44:00) [17]Берем DG:TDrawGrid
DG.Visible := False;
Заполнение и рисование грида на вашей совести.
Далее, по нажатию на кнопку по которой должно появляться меню:
...
DG.Visible := True;
...
Далее ловим нажатие мыши на гриде либо "потерю фокуса гридом". Все.
Knight (2004-06-20 21:34:00) [18]Опиши, что именно требуется... меню бывают разные, а ICQ и Messanger у меня не установлены.
killer (2004-06-20 17:07:00) [19]Что-то у меня так и не получилось... :(
killer (2004-06-20 14:15:00) [20]KnightПриведи пожалуйста пример как ты это делаешь......