Форум: "Основная";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
Вниз
Меню состоящее из одних изображений? Найти похожие ветки
← →
killer © (2004-06-20 13:42) [0]Подскажите пожалуйста... Как сделать меню состоящее из одних изображений? Как это сделано в ICQ или в Messanger-е при выборе смайлика...
← →
Knight © (2004-06-20 13:50) [1]Я обычно использую TPaintBox...
← →
killer © (2004-06-20 13:55) [2]мне же нужно чтобы выбрать изображение можно было...... и оно вставилось в Image...
← →
Knight © (2004-06-20 13:57) [3]А onMouseMove для кого сделано? :)
← →
killer © (2004-06-20 14:00) [4]а как он еще раскрываться будет???
← →
Knight © (2004-06-20 14:03) [5]Как сделаешь так и будет... всё в твоих руках %)
← →
killer © (2004-06-20 14:05) [6]логично.... :)
может какой-нибудь компонент есть такой? не знаешь?
← →
Knight © (2004-06-20 14:06) [7]Пока не возникало необходимости в компоненте... но наверно есть.
← →
killer © (2004-06-20 14:11) [8]я на torry.net в "Menu" посмотрел, нет что-то...
← →
killer © (2004-06-20 14:15) [9]Knight Приведи пожалуйста пример как ты это делаешь......
← →
killer © (2004-06-20 17:07) [10]Что-то у меня так и не получилось... :(
← →
Knight © (2004-06-20 21:34) [11]Опиши, что именно требуется... меню бывают разные, а ICQ и Messanger у меня не установлены.
← →
pasha_golub © (2004-06-20 21:44) [12]Берем DG:TDrawGrid
DG.Visible := False;
Заполнение и рисование грида на вашей совести.
Далее, по нажатию на кнопку по которой должно появляться меню:
...
DG.Visible := True;
...
Далее ловим нажатие мыши на гриде либо "потерю фокуса гридом". Все.
← →
killer © (2004-06-20 23:21) [13]Knight Меню как PopupMenu, но только раскрывается сетка изображений.... т.е. сколько изображений в строке и сколько-то таких строк... все изображения разные, и какое-то из этих изображений можно выбрать... Понял теперь? :)
← →
killer © (2004-06-20 23:23) [14]pasha_golub хорошая идея кстати... :) сделать бы еще какнибудь эффект появления и скрытия, то вообще супер будет :)
← →
Knight © (2004-06-20 23:27) [15]
> killer © (20.06.04 23:21)
> все изображения разные
По размеру или содержанию?
Если содержанию, то TPaintBox самый простой...
← →
killer © (2004-06-20 23:31) [16]Knight Я почитал про TPaintBox, понял что в нем рисовать можно.... а вот как меню это сделать я не понимаю...
← →
pasha_golub © (2004-06-20 23:38) [17]killer © (20.06.04 23:23) [14]
Это не самое сложное
← →
killer © (2004-06-20 23:39) [18]pasha_golub а как это сделать?
← →
pasha_golub © (2004-06-20 23:45) [19]killer © (20.06.04 23:39) [18]
TControl.Width + TControl.Height + цикл
← →
Knight © (2004-06-20 23:51) [20]
> [16] killer © (20.06.04 23:31)
> Knight Я почитал про TPaintBox, понял что в нем рисовать
> можно.... а вот как меню это сделать я не понимаю...
1) Бросаешь TPaintBox
2) Обзываешь его, например, SmilesMenuBox
3) onPaint - отрисовка изображений пунктов меню в цикле, например из TImageList, ресурса или ещё от куда...
4) onMouseMove - обработка перемещения мышы, например для подсветки...
5) onMouseDown - берёшь номер иконки и прячешь меню.
Можно также обработать события с клавы... вроде проще некуда.
← →
Григорьев Антон © (2004-06-21 10:16) [21]Да вы что тут все, про WM_DRAWITEM и WM_MEASUREITEM никогда не слышали? Какие-то PaintBox"ы, OnMouseMove... Бр!!! У TMenuItem есть события OnDrawItem и OnMeasureItem - с их помощью можно вместо текста на пункте меню отобразить всё, что угодно.
← →
GrayFace © (2004-06-21 10:32) [22]Knight
1) Зачем TPaintBox? Лучше на канвасе формы.(Ведь все-равно нужна дополнительная форма)
5) OnMouseClick
Григорьев Антон
Ему нужна таблица картинок, а не список.
← →
serge © (2004-06-21 10:46) [23]> 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 FImagesPerCol := Trunc(sqrt(Images.Count)); // â êâàäðàòèê :)
for i := 0 to Images.Count - 1 do begin
M := TMenuItem.Create(Self);
M.OnMeasureItem := MeasureItem;
M.OnDrawItem := DrawItem;
M.OnClick := ClickImage;
M.ImageIndex := i;
if (i/FImagesPerCol = i div FImagesPerCol) and (i>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.
← →
Knight © (2004-06-21 13:00) [24]
> [22] GrayFace © (21.06.04 10:32)
> 1) Зачем TPaintBox? Лучше на канвасе формы.(Ведь все-равно
> нужна дополнительная форма)
Если меню не выходит за пределы формы то можно обойтись и без дополнительной...
← →
killer © (2004-06-21 14:18) [25]Клас!!! Спасибо тебе serge! Работает...:) Тут у меня еще один вопросик возник... можно ли какнибудь сделать чтобы при наведении на картинку, картинка квадратиком черным обводилась... как это осуществить?
← →
serge © (2004-06-21 15:27) [26]
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 23:04) [27]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...
← →
killer © (2004-06-22 20:26) [28]???
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.036 c