Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.04;
Скачать: CL | DM;

Вниз

Меню состоящее из одних изображений?   Найти похожие ветки 

 
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));  // &#226; &#234;&#226;&#224;&#228;&#240;&#224;&#242;&#232;&#234; :)
 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.025 c
9-1079558648
Sergeyshb
2004-03-18 00:24
2004.07.04
Создание игры "Другой мир"


1-1087478400
Leron
2004-06-17 17:20
2004.07.04
А как получить имена всех запущенных файлов word a


1-1087889155
Chery
2004-06-22 11:25
2004.07.04
Как узнать окончание файла?


1-1087420050
P@vel
2004-06-17 01:07
2004.07.04
Window Handle


3-1086610429
Valeri
2004-06-07 16:13
2004.07.04
DBRichEdit