Main Menü'ye tasarım eklemek istiyorum

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
burcayn
Üye
Mesajlar: 5
Kayıt: 15 May 2014 10:34

Main Menü'ye tasarım eklemek istiyorum

Mesaj gönderen burcayn »

Merhaba, main menünün rengini filan nasıl değiştirebilirim ?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Main Menü'ye tasarım eklemek istiyorum

Mesaj gönderen mrmarman »

(1) MainMenu'nun OwnerDraw özelliğini TRUE yaparak başlayabilirsiniz.
(2) Geriye her menu item'in OnMeasureItem ve OnDrawItem eventlerine kod ile yapılacak boyama, yazı fontu manipülasyonu vb. kalıyor.
(-) Menu item'lerden ilkine renklendirmeye ilişkin kodu yazacak, diğer menuItem'lerin bu procedure'e yönlendirilmesini sağlayacaksınız ki her biri aynı şekilde mimik versin.

- Yapamazsanız da uygun bir zamanda örnek hazırlarım.
Resim
Resim ....Resim
burcayn
Üye
Mesajlar: 5
Kayıt: 15 May 2014 10:34

Re: Main Menü'ye tasarım eklemek istiyorum

Mesaj gönderen burcayn »

mrmarman yazdı:(1) MainMenu'nun OwnerDraw özelliğini TRUE yaparak başlayabilirsiniz.
(2) Geriye her menu item'in OnMeasureItem ve OnDrawItem eventlerine kod ile yapılacak boyama, yazı fontu manipülasyonu vb. kalıyor.
(-) Menu item'lerden ilkine renklendirmeye ilişkin kodu yazacak, diğer menuItem'lerin bu procedure'e yönlendirilmesini sağlayacaksınız ki her biri aynı şekilde mimik versin.

- Yapamazsanız da uygun bir zamanda örnek hazırlarım.
Renk kodu için bi örnek yazabilir misiniz ?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Main Menü'ye tasarım eklemek istiyorum

Mesaj gönderen mrmarman »

Önce:
Resim

Sonra:
Resim

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  Sayac : Integer;
begin
  MainMenu1.OwnerDraw := True; 
  For Sayac := 0 to ComponentCount-1 do begin
    If Components[Sayac] is TMenuItem then
    begin
      With TMenuItem(Components[Sayac]) do begin
        If Caption <> '-' then
        begin
          OnDrawItem    := MenuItemDrawItem;
        end;
      end;
    end;
  end;
end;

procedure TForm1.MenuItemDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
  strMenuBasligi : string;
  MenuRect       : TRect;
begin
  strMenuBasligi := TMenuItem(sender).Caption;

//(1)// Arka Fonu Temizleyelim...
  ACanvas.Brush.Style := bsSolid;
  ACanvas.Brush.Color := clBtnFace;
  ACanvas.FillRect(ARect);

//(2)// Seçili Olan Item'in Reklerini Ayarlayalım...
  if Selected then
  begin
//(a)// Seçili Item'in içini ele alalım...
    ACanvas.Brush.Style := bsSolid;  // Dolgu modunda olsun, içini boyasın...
    ACanvas.Brush.Color := clYellow; // İç boyası Sarı olsun...
    ACanvas.FillRect(ARect); // Item'in içini boyayla doldurduk. Yazı falan yok.

//(b)// Seçili Item'in içi farklı, çerçevesi farklı olsun istedik diyelim...
    ACanvas.Brush.Style := bsClear;  // Transparan modunda olsun, içini boş bıraksın...
    ACanvas.Pen.Color   := clRed;         // Çerçeve rengi Kırmızı olsun...
    ACanvas.Pen.Width   := 3;             // Çerçeve biraz kalın olsun...
    ACanvas.Pen.Style   := psInsideFrame; // Çerçeve Item sınırlarıda olsun...
    ACanvas.Rectangle( ARect.Left, ARect.Top, ARect.Right, ARect.Bottom );
  end;

//(c)// Item yazılarını yazalım...
    ACanvas.Brush.Style := bsClear;  // Transparan modunda olsun, içini boş bıraksın...
    ACanvas.Font.Style  := [fsBold];
    ACanvas.Font.Color  := clBlack;
    MenuRect.Left   := ARect.Left   + 25; // Menü içerisinde yazının konumunu belirliyoruz...
    MenuRect.Right  := ARect.Right  - 5;
    MenuRect.Top    := ARect.Top    + 2;
    MenuRect.Bottom := ARect.Bottom - 2;
    DrawText(ACanvas.Handle, PChar(strMenuBasligi), length(strMenuBasligi), MenuRect, DT_LEFT or DT_EXTERNALLEADING or DT_TOP);

//(d)// Icon tanımlı ise onu da şimdi basmanın zamanı, yoksa icon da görünmez...
  if (TMenuItem(sender).ImageIndex >= 0) and (TMenuItem(sender).GetImageList <> nil) then
  begin
    TMenuItem(sender).GetImageList.Draw(ACanvas, ARect.Left + 4, ARect.Top + 2, TMenuItem(sender).ImageIndex);
  end;
end;
Hazırladığım örneğin kaynak kodlu proje paketini bu linkten indirebilirsin.


Başarılar.
Resim
Resim ....Resim
burcayn
Üye
Mesajlar: 5
Kayıt: 15 May 2014 10:34

Re: Main Menü'ye tasarım eklemek istiyorum

Mesaj gönderen burcayn »

mrmarman yazdı:Önce:
Resim

Sonra:
Resim

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  Sayac : Integer;
begin
  MainMenu1.OwnerDraw := True; 
  For Sayac := 0 to ComponentCount-1 do begin
    If Components[Sayac] is TMenuItem then
    begin
      With TMenuItem(Components[Sayac]) do begin
        If Caption <> '-' then
        begin
          OnDrawItem    := MenuItemDrawItem;
        end;
      end;
    end;
  end;
end;

procedure TForm1.MenuItemDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
  strMenuBasligi : string;
  MenuRect       : TRect;
begin
  strMenuBasligi := TMenuItem(sender).Caption;

//(1)// Arka Fonu Temizleyelim...
  ACanvas.Brush.Style := bsSolid;
  ACanvas.Brush.Color := clBtnFace;
  ACanvas.FillRect(ARect);

//(2)// Seçili Olan Item'in Reklerini Ayarlayalım...
  if Selected then
  begin
//(a)// Seçili Item'in içini ele alalım...
    ACanvas.Brush.Style := bsSolid;  // Dolgu modunda olsun, içini boyasın...
    ACanvas.Brush.Color := clYellow; // İç boyası Sarı olsun...
    ACanvas.FillRect(ARect); // Item'in içini boyayla doldurduk. Yazı falan yok.

//(b)// Seçili Item'in içi farklı, çerçevesi farklı olsun istedik diyelim...
    ACanvas.Brush.Style := bsClear;  // Transparan modunda olsun, içini boş bıraksın...
    ACanvas.Pen.Color   := clRed;         // Çerçeve rengi Kırmızı olsun...
    ACanvas.Pen.Width   := 3;             // Çerçeve biraz kalın olsun...
    ACanvas.Pen.Style   := psInsideFrame; // Çerçeve Item sınırlarıda olsun...
    ACanvas.Rectangle( ARect.Left, ARect.Top, ARect.Right, ARect.Bottom );
  end;

//(c)// Item yazılarını yazalım...
    ACanvas.Brush.Style := bsClear;  // Transparan modunda olsun, içini boş bıraksın...
    ACanvas.Font.Style  := [fsBold];
    ACanvas.Font.Color  := clBlack;
    MenuRect.Left   := ARect.Left   + 25; // Menü içerisinde yazının konumunu belirliyoruz...
    MenuRect.Right  := ARect.Right  - 5;
    MenuRect.Top    := ARect.Top    + 2;
    MenuRect.Bottom := ARect.Bottom - 2;
    DrawText(ACanvas.Handle, PChar(strMenuBasligi), length(strMenuBasligi), MenuRect, DT_LEFT or DT_EXTERNALLEADING or DT_TOP);

//(d)// Icon tanımlı ise onu da şimdi basmanın zamanı, yoksa icon da görünmez...
  if (TMenuItem(sender).ImageIndex >= 0) and (TMenuItem(sender).GetImageList <> nil) then
  begin
    TMenuItem(sender).GetImageList.Draw(ACanvas, ARect.Left + 4, ARect.Top + 2, TMenuItem(sender).ImageIndex);
  end;
end;
Hazırladığım örneğin kaynak kodlu proje paketini bu linkten indirebilirsin.


Başarılar.
Çok yardımcı oldunuz başka hiçbir yerde örnek filan bulamamıştım emeğinize sağlık.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Main Menü'ye tasarım eklemek istiyorum

Mesaj gönderen mrmarman »

- Gördüğünüz üzere sıradan CANVAS boyama işlemleridir.
- Sadece her MenuItem'inin bundan pay çıkarması için döngü ile projenin OnShow olayında olabilir, OnCreate olayında olabilir; button altındaki döngüyü kurmanız kafidir. Siz yeni menu eklediğinizde kendiliğinden sisteme dahil olmuş olacaktır. Unutma gibi bir durum yaşamazsınız.

- OnMeasureItem eventi de vardır demiştim ya, onunla da dilediğiniz menünüitem'inin boyutlarıyla oynayabiliyorsunuz. Projelerimin çoğunda kullandığım şekliyle, her menuitem'in yüksekliğini farklı farklı yapmış, bu HINT'e atadığım metni, her menü başlığının altına yazdırmıştım. Böylece kullanıcı menünün ne amaçla kullanıldığını anlayabiliyordu. Ayarlar kısmına HINT'leri gizle diye bir opsiyon koymuş, artık bu menü başlıkları öğrenildikten sonra sadece başlıkların yer aldığı, detay açıklamaların görünmediği forma kendiliğinden dönüşmesini sağlamıştım.

Resim
Resim
Resim ....Resim
burcayn
Üye
Mesajlar: 5
Kayıt: 15 May 2014 10:34

Re: Main Menü'ye tasarım eklemek istiyorum

Mesaj gönderen burcayn »

mrmarman yazdı:- Gördüğünüz üzere sıradan CANVAS boyama işlemleridir.
- Sadece her MenuItem'inin bundan pay çıkarması için döngü ile projenin OnShow olayında olabilir, OnCreate olayında olabilir; button altındaki döngüyü kurmanız kafidir. Siz yeni menu eklediğinizde kendiliğinden sisteme dahil olmuş olacaktır. Unutma gibi bir durum yaşamazsınız.

- OnMeasureItem eventi de vardır demiştim ya, onunla da dilediğiniz menünüitem'inin boyutlarıyla oynayabiliyorsunuz. Projelerimin çoğunda kullandığım şekliyle, her menuitem'in yüksekliğini farklı farklı yapmış, bu HINT'e atadığım metni, her menü başlığının altına yazdırmıştım. Böylece kullanıcı menünün ne amaçla kullanıldığını anlayabiliyordu. Ayarlar kısmına HINT'leri gizle diye bir opsiyon koymuş, artık bu menü başlıkları öğrenildikten sonra sadece başlıkların yer aldığı, detay açıklamaların görünmediği forma kendiliğinden dönüşmesini sağlamıştım.

Resim
Sizinki gerçekten çok güzel olmuş ellerinize sağlık. Ben daha yeni başladım delphiye projem vardı. Menü tasarımlarıyla ilgili pek bir şey bulamadığım için sıradan yapmıştım. Şimdi renkleriyle değilde sizin gibi büyütmeye çalışıcam. Teşekkürler ilgiliniz için
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Main Menü'ye tasarım eklemek istiyorum

Mesaj gönderen brs »

Hocam Mainmenu özelleştirmek için "OnMeasureItem eventi de vardır " demişsniz sizi yanlış anlamadıysam google da herhangi bir kaynak bulamadım
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Main Menü'ye tasarım eklemek istiyorum

Mesaj gönderen mrmarman »

MainMenu için eklediğin her itemin ayrı ayrı vardır. Mesajda da belirttiğim üzere her itemi bağımsız bir şekilde özelleştirme imkanı vardır demiştim. Bu amaca yönelik kullanılıyor.

TMainMenu ekledin ya, ona eklediğin Menu başlıklarının her birinin eventinde bulabilirsiniz.
Resim
Resim ....Resim
Cevapla