popup menu tarzı form kullanmak
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
popup menu tarzı form kullanmak
Standart popup menu yerine form kullanabilirmiyim,bu konuda arama yapmama ragmen bir örnek bulamadım.
bu tarz bir resimli popup menu nasıl kullanabiliriz.
http://hizliresim.com/5ok0nz
bu tarz bir resimli popup menu nasıl kullanabiliriz.
http://hizliresim.com/5ok0nz
Re: popup menu tarzı form kullanmak
Hazır bir örnek proje hazırladım. Verdiğin resmi parçalayarak PhotoShop ile farklılaştırdım...
Proje kaynak kodu, Bitmap'ler vs. hepsi bu linktedir.

Kaynak Kod içeriğine göz atmak isteyenler için de aşağıdaki gibi...
Kaynak Menü Image Tekleri







Proje kaynak kodu, Bitmap'ler vs. hepsi bu linktedir.

Kaynak Kod içeriğine göz atmak isteyenler için de aşağıdaki gibi...
Kod: Tümünü seç
{$R RES\RES.RES}
procedure TForm1.BitBtn1Click(Sender: TObject);
Var
Sayac : Integer;
begin
PopupMenu1.OwnerDraw := True;
For Sayac := 0 to PopupMenu1.Items.Count-1 do begin
With PopupMenu1.Items[Sayac] do begin
If Caption <> '-' then
begin
OnDrawItem := MenuItemDrawItem;
OnMeasureItem := MenuItemMeasureItem;
end;
end;
end;
end;
procedure TForm1.MenuItemDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
strMenuBasligi : string;
Bitmap : TBitmap;
ResStream : TResourceStream;
begin
// Menu Item'leri ayırt etmek için içindeki metni kullanıcaz...
strMenuBasligi := TMenuItem(sender).Caption;
// Kenar boşluklarında çerçeve görünecek. Seçili ise Sarı, değilse standart gri
if Selected
then ACanvas.Brush.Color := clYellow
else ACanvas.Brush.Color := clBtnFace;
ACanvas.FillRect(ARect);
Bitmap := TBitmap.Create;
try
// Şimdi başlıığa göre özel resim getirilecek...
if strMenuBasligi = '&0' then
begin
ResStream := TResourceStream.Create(HInstance, 'M00', RT_RCDATA);
Bitmap.LoadFromStream(ResStream);
ResStream.Free;
end else
if strMenuBasligi = '&1' then
begin
if Selected then ResStream := TResourceStream.Create(HInstance, 'M1a', RT_RCDATA)
else ResStream := TResourceStream.Create(HInstance, 'M1b', RT_RCDATA);
Bitmap.LoadFromStream(ResStream);
ResStream.Free;
end else
if strMenuBasligi = '&2' then
begin
if Selected then ResStream := TResourceStream.Create(HInstance, 'M2a', RT_RCDATA)
else ResStream := TResourceStream.Create(HInstance, 'M2b', RT_RCDATA);
Bitmap.LoadFromStream(ResStream);
ResStream.Free;
end else
if strMenuBasligi = '&3' then
begin
if Selected then ResStream := TResourceStream.Create(HInstance, 'M3a', RT_RCDATA)
else ResStream := TResourceStream.Create(HInstance, 'M3b', RT_RCDATA);
Bitmap.LoadFromStream(ResStream);
ResStream.Free;
end;
// Dilersen biraz içeri daraltıp kenarlarında çerçeve görünmesini sağlamak için
//InflateRect(ARect, -2, -2) ;
ACanvas.Draw(ARect.Left+4, ARect.Top+4, Bitmap) ;
finally
Bitmap.Free;
end;
end;
procedure TForm1.MenuItemMeasureItem( Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer) ;
begin
// Menü yüksekliği burada boyutlandırılacak...
Width := 300; // Resimden daha geniş
Height := 64; // Resimden daha yüksek
end;







- mustafasoy
- Üye
- Mesajlar: 154
- Kayıt: 02 Ağu 2013 05:00
- Konum: istanbul
- İletişim:
Re: popup menu tarzı form kullanmak
mrmarman hocam eline,emeğine sağlık
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Re: popup menu tarzı form kullanmak
Çok teşekkürler mrmarman hocam, peki alt menü ekledim subitem'e tıklayınca 'N01' Menü Image bitmap resmini nasıl degiştirebilirim.
Re: popup menu tarzı form kullanmak
Aynı şekilde yapacaksınız. Eklediğiniz altmenünün de ondrawitem ve onmeasureitem eventlerini benzer döngü ile aynı procedure bağkamanız kafi.
değil de items[menu_index].items.count-1
gibi olacak. Siz menünün yine adına veya başlığına göre ilgili resmi (seçili olma durumunu gözeterek) atayacaksınız.
Kod: Tümünü seç
PopupMenu1.Items.Count-1
gibi olacak. Siz menünün yine adına veya başlığına göre ilgili resmi (seçili olma durumunu gözeterek) atayacaksınız.
Re: popup menu tarzı form kullanmak
mrmarman abi teşşekür ederim ama subiteme resim ekliyorum problem yok , fakat benim anlatmak istedigim
altmenüye tklanınca ana menü resminin degişmesini istiyorum.
http://hizliresim.com/g48vD0
altmenüye tklanınca ana menü resminin degişmesini istiyorum.
http://hizliresim.com/g48vD0
Re: popup menu tarzı form kullanmak
Sihrini çalıştır.
O başlığı (caption) sub item ile değiştirmen yeterli. Şöyle düşün, her itemde aynı başlık yazıyor olsaydı hepsinde aynı resim / image görünecekti.
Bilmem anlatabildim mi?
O başlığı (caption) sub item ile değiştirmen yeterli. Şöyle düşün, her itemde aynı başlık yazıyor olsaydı hepsinde aynı resim / image görünecekti.
Bilmem anlatabildim mi?
Re: popup menu tarzı form kullanmak
abi valla anlamadım geceden beri kafam şişti valla bir örnek verebilirmisin teşekkürler.
Re: popup menu tarzı form kullanmak
Subitemin on click olayında subitemin caption değerini ana itemin caption değerine eşitle.
Re: popup menu tarzı form kullanmak
abi rica etsem bir örnek verebilirmisin inan kafam durdu.
Re: popup menu tarzı form kullanmak
Bence çık biraz hava al mesajları ve verdiğim örneği anlamaya çalış.
Daha ne diyebilirim. Kopyala / yapıştır yaparak öğrenemezsin. Kavrayarak ilerlemelisin.
Tekrarvediyorum dikkatlice oku;
SORU: Resimler neye göre menuitemlerde beliriyor?
Cevap: Caption ne ise ona göre.
Soru: Bir menüitemin resmini nasıl dinamik olarak değiştirebilirsin?
CEVAP: Caption text içeriğini değiştirmen yeterli. Ek bir işlem yapmana gerek yok.
İstersen şunu dene, tüm menü itemlerin Caption içeriğini '0' yap ve programı çalıştır. Hepsinde aynı resmi göreceksin.
Bundan başka tüyo nasış verebilirim anlamadım.
Daha ne diyebilirim. Kopyala / yapıştır yaparak öğrenemezsin. Kavrayarak ilerlemelisin.
Tekrarvediyorum dikkatlice oku;
SORU: Resimler neye göre menuitemlerde beliriyor?
Cevap: Caption ne ise ona göre.
Soru: Bir menüitemin resmini nasıl dinamik olarak değiştirebilirsin?
CEVAP: Caption text içeriğini değiştirmen yeterli. Ek bir işlem yapmana gerek yok.
İstersen şunu dene, tüm menü itemlerin Caption içeriğini '0' yap ve programı çalıştır. Hepsinde aynı resmi göreceksin.
Bundan başka tüyo nasış verebilirim anlamadım.
Re: popup menu tarzı form kullanmak
haklısın abi biraz hava alsam iyi olacak teşekkürler.
Re: popup menu tarzı form kullanmak
hata alıyorum abi subitem click
Canvas does not allow drawing hatası, derlemede problem olmuyor ama altmenüye tıklayınca bu taha çıkıyor.
kod
Canvas does not allow drawing hatası, derlemede problem olmuyor ama altmenüye tıklayınca bu taha çıkıyor.
kod
Kod: Tümünü seç
procedure TForm1.N41Click(Sender: TObject);
var
strMenuBasligi : string;
Bitmap : TBitmap;
ResStream : TResourceStream;
ACanvas: TCanvas;
ARect: TRect;
begin
strMenuBasligi := TMenuItem(sender).Caption;
Bitmap := TBitmap.Create;
ACanvas := TCanvas.Create;
try
if strMenuBasligi = '&4' then
begin
ResStream := TResourceStream.Create(HInstance, 'M2aa', RT_RCDATA);
Bitmap.LoadFromStream(ResStream);
ResStream.Free;
end;
ACanvas.Draw(ARect.Left, ARect.Top, Bitmap);
finally
Bitmap.Free;
end;
end;
Re: popup menu tarzı form kullanmak
Bu örneği de veriyorum. Anlamaya çalış lütfen.
Aşağıdaki procedure, vereceğin POPUPMENU hangisi ise onun en alt menu başlıklarına kadar Event Tanımlamasını recursive dediğimiz iç içe döngü kurarak yapar.
Kaynak kodları ile projenin linki için buradan indirebilirsin.
Bahsettiğim Caption değerini aktarma işi için de örnek ekledim.
Bu dinamik yapılı halidir. Bu örnekteki N22Click eventini hangi SUBItem'e ilişkilendirirsen, o subitem tıklandığında onun ana itemini caption değeri bununki ile değişecek, dolayısı ile resim de onunla aynısı olacak.
Kullanımı :
Procedure:
Aşağıdaki procedure, vereceğin POPUPMENU hangisi ise onun en alt menu başlıklarına kadar Event Tanımlamasını recursive dediğimiz iç içe döngü kurarak yapar.
Kaynak kodları ile projenin linki için buradan indirebilirsin.
Bahsettiğim Caption değerini aktarma işi için de örnek ekledim.
Kod: Tümünü seç
procedure TForm1.N22Click(Sender: TObject);
begin
TMenuItem(Sender).Parent.Caption := TMenuItem(Sender).Caption;
end;
Kullanımı :
Kod: Tümünü seç
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
EventAtamasiYap( PopupMenu1 );
end;
Kod: Tümünü seç
Procedure TForm1.EventAtamasiYap( PopUpMenu :TPopUpMenu );
Procedure AltMenuItem( aMenuItem:TMenuItem );
Var
Sayac : Integer;
begin
With aMenuItem do
begin
If Caption <> '-' then
begin
OnDrawItem := MenuItemDrawItem;
OnMeasureItem := MenuItemMeasureItem;
end;
if aMenuItem.Count > 0 then
begin
For Sayac := 0 to aMenuItem.Count-1
do AltMenuItem( aMenuItem.Items[Sayac] );
end;
end;
end;
Var
iSayac : Integer;
begin
PopupMenu.OwnerDraw := True;
For iSayac := 0 to PopupMenu.Items.Count-1
do AltMenuItem( PopUpMenu.Items[iSayac] );
end;