Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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));  // &#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.036 c
4-1085302975
WOLF
2004-05-23 13:02
2004.07.04
Свой рабочий стол


14-1087056449
Xtz
2004-06-12 20:07
2004.07.04
Настроить маршрутизацию в 2003 сервере


8-1082385049
Insight
2004-04-19 18:30
2004.07.04
OpenGL для Delphi-7 с функциями инициализации


14-1087208942
PenguinX
2004-06-14 14:29
2004.07.04
Фоновый рисунок папки в XP


1-1087908433
Gia Gvatua
2004-06-22 16:47
2004.07.04
Одновременное нажатие двух клавиш





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский