none
Ekran Çözünürlüğüne Göre Form ve Form Kontrollerinin Boyutunu Ayarlama RRS feed

  • Soru

  • Kolay gelsin.

    Şöyle bir sorunum var. İnternette birkaç kaynak buldum ama tam olarak istediğimi yapamadım.

    Windows formumda Combobox, Textbox, Label, DateTimePicker, PicrureBox ve Butonlar var. Ben bu formu hazırlarken 1920x1080 çözünürlükte çalıştım. Ama kurmak istediğim bilgisayarların çözünürlükleri farklı olduğundan doğal olarak form ve kontroller ekrana sığmadı. Bu formu ve form üzerindeki kontrolleri yüklenecek bilgisayarın çözünürlüğüne göre nasıl ayarlayabilirim. Yardımcı olursanız sevinirim.

    13 Ekim 2015 Salı 10:59

Yanıtlar

  • if (nesne.Controls.Count > 0)
    	foreach (Control subNesne in nesne.Controls)
    	{
    		nesFontAdi = subNesne.Font.SystemFontName;
    		nesFont = subNesne.Font.Size;
    		nesX = subNesne.Location.X;
    		nesY = subNesne.Location.Y;
    		nesGen = subNesne.Size.Width;
    		nesYuk = subNesne.Size.Height;
    		subNesne.Location = new Point((int)(nesX / genislikOrani), (int)(nesY / yukseklikOrani));
    		subNesne.Size = new Size((int)(nesGen / genislikOrani), (int)(nesYuk / yukseklikOrani));
    		fontBuyuk = (int)(nesFont / yukseklikOrani);
    		if (fontBuyuk < 8) fontBuyuk = 8;
    		subNesne.Font = new Font("Calibri", fontBuyuk);
    		this.Size = new Size((int)((forGen / genislikOrani) + 20), (int)(forYuk / yukseklikOrani) + 150);
    	}

    Pardon orası şöyle olacak, iterasyondaki itemi değiştirmeyi unutmuşum.

    • Yanıt Olarak İşaretleyen Sedat Kaynar 14 Ekim 2015 Çarşamba 15:00
    14 Ekim 2015 Çarşamba 14:46

Tüm Yanıtlar

  • 13 Ekim 2015 Salı 11:08
  • Anchor, Dock özelliklerini kullanarak yapabilirsiniz.

    Anchor

    http://www.techrepublic.com/article/manage-winform-controls-using-the-anchor-and-dock-properties/

    Açıklayabilir misiniz. Anchor ve Dock özelliiklerinin hangi seçeneklerini seçmeliyim. Biraz karıştırdım ama olmadı. Mesela ben Anchor özelliğini Top, Left, Right, Botton olarak seçiyorum bilgisayarımın çözünürlülüğünü düşürerek uygulamayı çalıştırıyorum sadece GroupBox kendini boyutlandırdı. Diğer textbox, combobox, label gibi kontroller boyutlandırmadı. Ayrıca anladığım kadarıyla anchor boyutlandırmıyor kontrollerin bir birlerine olan uzaklıklarını koruyor. Diğer Dock'ta ise Left, Right, Top, Bottom ve Fill gibi seçenekler var. Bunlarıda denedim olmadı. Fill yapınca nesneyi ekranda doldurmaya çalışıyor. Ayrıca kontrolleri seçip hem anchor hem de dock uyapmaya çalıştığımda birisi muhakkak varsayılan ayarlarına dönüyor. Mesela Anchor özelliğinin varsayılan ayarı Left, top ben bunu Left, Top, Right, Bottom olarak değiştirip daha sonra Dock özelliğini de Fill yapmaya çalıştığımda Anchor yine default ayarı olan Left, Top oluyor. Birde sadece formu seçtiğimde properties panelinde anchor ve dock özelliği çıkmıyor sanırım formun özelliklerinde bu 2 özellik yok.

    Benim yapmak istediğim şu;

    Formumda Groupbox'ların içerisinde label, textbox, combobox, datetimepicker ve groupbox dışında da buton ve picturebox'larım var. Form tasarımını 1920x1080 çözünürlülükte yaptım. Ben bu uygulamayı mesela 1280x720 çözünürlükteki başka bir bilgisayara kurduğumda Formum ve üzerinde bulunan bütün kontrollerim yeni çözünürlülük oranında kendini boyutlandırsın.

    14 Ekim 2015 Çarşamba 06:53
  • Zaten bu özellikler dediğin iş için var. Sadece doğru ayarlayamamışsın. Buradan neyi nasıl yapacağın konusunda pek bir şey söylenemez. Abdullah'ın verdiği linkte açıklıyor her şeyi. Form tasarımına göre ayarlamalarını yapacaksın. GroupBox içierisinde kontrolleri seçerek vermelisin aynı zamanda Groupbox lara da ayrı olarak ayarlaman gerekir. Mesela formun her zaman solunda olacak bir nesneyi veya Groupbox ı Dock özelliği ile Left yapabilirsin. Böylelikle hep solda olacaktır. Groupbpx, Panel, Tablayout gibi kontroller form dizaynı için vardır. Doğru kullanıldığında her çözünürlüğe uygun olarak çalıştıracaktır.

    Barış Ceviz - Software Developer
    Blog'um
    World Of You is Peace Of World

    14 Ekim 2015 Çarşamba 07:25
    Moderatör
  • Anlattığım konuyu okuyamadım kusura bakmayın, gönderdiğim linkte örnek var ona baktınız mı?

    Yine sizin için kendim şahsen üç örnek daha hazırladım. Bunlara bakarak çözmeye çalışın

    http://1drv.ms/1hDHoCy

    14 Ekim 2015 Çarşamba 07:26
  • Bir türlü olmadı. Anchor neredeyse bütün seçenekleri ile kullandım. Abdullah Bey'in örneklerini de inceledim. Onun örneklerinde formdaki bütün kontrollerin boyutu form ile birlikte aynı anda ve aynı oranda değişmiyor. Aynı zamanda değişirken kontroller arasındaki mesafe de aynı kalmalı. Aşağıdaki kodlar ile biraz yaklaştığımı düşünüyorum. Ama sadece formu ve formun üzerinde bulunan kontrolleri boyutlandırabildim. GruopBox içindeki kontrolleri boyutlandıramadım. Break point ile çalıştırdığımda zaten döngünün gruopbox içindeki kontrolleri görmediğini görüyorum. Kodlar düzeltip tekrar gönderirseniz sevinirim.

    void ekranCozunurlugu()
            {
                int bizimPcGenislik = 1920;
                int bizimPcYukseklik = 1080;
    
                float kullanilanPcGenislik = SystemInformation.PrimaryMonitorSize.Width;
                float kullanilanPcYukseklik = SystemInformation.PrimaryMonitorSize.Height;
                float genislikOrani = (bizimPcGenislik / kullanilanPcGenislik);
                float yukseklikOrani = (bizimPcYukseklik / kullanilanPcYukseklik);
                float forGen = this.Size.Width;
                float forYuk = this.Size.Height; 
    
                foreach (Control nesne in this.Controls) 
                {
                    string nesFontAdi = nesne.Font.SystemFontName;
                    float nesFont = nesne.Font.Size;
                    float nesX = nesne.Location.X;
                    float nesY = nesne.Location.Y;
                    float nesGen = nesne.Size.Width;
                    float nesYuk = nesne.Size.Height;
                    nesne.Location = new Point((int)(nesX / genislikOrani), (int)(nesY / yukseklikOrani));
                    nesne.Size = new Size((int)(nesGen / genislikOrani), (int)(nesYuk / yukseklikOrani));
                    int fontBuyuk = (int)(nesFont / yukseklikOrani);
                    if (fontBuyuk < 8) fontBuyuk = 8;
                    nesne.Font = new Font("Calibri", fontBuyuk);
                    this.Size = new Size((int)((forGen / genislikOrani) + 20), (int)(forYuk / yukseklikOrani) + 150);              
                }
            }

    14 Ekim 2015 Çarşamba 14:07
  • groupbox'ın içindeki kontrolü taramıyorsunuz o yüzden,

    int bizimPcGenislik = 1920;
    int bizimPcYukseklik = 1080;
    
    float kullanilanPcGenislik = SystemInformation.PrimaryMonitorSize.Width;
    float kullanilanPcYukseklik = SystemInformation.PrimaryMonitorSize.Height;
    float genislikOrani = (bizimPcGenislik / kullanilanPcGenislik);
    float yukseklikOrani = (bizimPcYukseklik / kullanilanPcYukseklik);
    float forGen = this.Size.Width;
    float forYuk = this.Size.Height;
    
    string nesFontAdi;
    float nesFont, nesX, nesY, nesGen, nesYuk;
    int fontBuyuk;
    
    foreach (Control nesne in Controls)
    {
    	nesFontAdi = nesne.Font.SystemFontName;
    	nesFont = nesne.Font.Size;
    	nesX = nesne.Location.X;
    	nesY = nesne.Location.Y;
    	nesGen = nesne.Size.Width;
    	nesYuk = nesne.Size.Height;
    	nesne.Location = new Point((int)(nesX / genislikOrani), (int)(nesY / yukseklikOrani));
    	nesne.Size = new Size((int)(nesGen / genislikOrani), (int)(nesYuk / yukseklikOrani));
    	fontBuyuk = (int)(nesFont / yukseklikOrani);
    	if (fontBuyuk < 8) fontBuyuk = 8;
    	nesne.Font = new Font("Calibri", fontBuyuk);
    	this.Size = new Size((int)((forGen / genislikOrani) + 20), (int)(forYuk / yukseklikOrani) + 150);
    
    	if (nesne.Controls.Count > 0)
    		foreach (var item in nesne.Controls)
    		{
    			nesFontAdi = nesne.Font.SystemFontName;
    			nesFont = nesne.Font.Size;
    			nesX = nesne.Location.X;
    			nesY = nesne.Location.Y;
    			nesGen = nesne.Size.Width;
    			nesYuk = nesne.Size.Height;
    			nesne.Location = new Point((int)(nesX / genislikOrani), (int)(nesY / yukseklikOrani));
    			nesne.Size = new Size((int)(nesGen / genislikOrani), (int)(nesYuk / yukseklikOrani));
    			fontBuyuk = (int)(nesFont / yukseklikOrani);
    			if (fontBuyuk < 8) fontBuyuk = 8;
    			nesne.Font = new Font("Calibri", fontBuyuk);
    			this.Size = new Size((int)((forGen / genislikOrani) + 20), (int)(forYuk / yukseklikOrani) + 150);
    		}
    }



    formdaki bütün kontrollerin boyutu form ile birlikte aynı anda ve aynı oranda değişmiyor. Aynı zamanda değişirken kontroller arasındaki mesafe de aynı kalmalı. 

    Saygısızlık gibi anlamayın

    Siz daha önce böyle bir şey gördünüz mü ? Ben anchor ile yapılabilecek, kod geliştirenlerin kullandığı, genel geçer yöntemleri örnekledim. Kontrolleri büyütüp küçülterek olayı çözebileceğinizi düşünmüyorum.  Bir butonun büyümesi veya küçülmesi çok saçma bir görünüme yol açar. 

    Mobil hariç tüm web sitelerinde ekran çözünürlüğü ne olursa olsun buton boyutu sabittir. Çözünürlük büyüdüğünde buton küçülmüş gibi gözükür, insanlar buna alıştı. Sizin yapmaya çalıştığınız yeni bir akım.

    Aklıma bir şey daha geldi, ben programı tam ekran kullanmak istemezsem o zaman ne olacak, bütün her şey küçülecek, aşağıdan çeksem kısa gözükecek, sağdan çeksem dar gözükecek, görüntünün aslında birde oranında olması gerekiyor. 

    14 Ekim 2015 Çarşamba 14:17
  • Son olarak Abdullah Bey'in kodlarını denedikten sonra aşağıdaki resimdeki gibi oldu.

    Orjinal hali aşağıdaki gibidir.

    foreach (var item in nesne.Controls) döngü bloğu arasındaki kodlarla alakalı olduğunu tahmin ediyorum ama düzeltemedim.

    14 Ekim 2015 Çarşamba 14:37
  • groupbox'ın içindeki kontrolü taramıyorsunuz o yüzden,

    int bizimPcGenislik = 1920;
    int bizimPcYukseklik = 1080;
    
    float kullanilanPcGenislik = SystemInformation.PrimaryMonitorSize.Width;
    float kullanilanPcYukseklik = SystemInformation.PrimaryMonitorSize.Height;
    float genislikOrani = (bizimPcGenislik / kullanilanPcGenislik);
    float yukseklikOrani = (bizimPcYukseklik / kullanilanPcYukseklik);
    float forGen = this.Size.Width;
    float forYuk = this.Size.Height;
    
    string nesFontAdi;
    float nesFont, nesX, nesY, nesGen, nesYuk;
    int fontBuyuk;
    
    foreach (Control nesne in Controls)
    {
    	nesFontAdi = nesne.Font.SystemFontName;
    	nesFont = nesne.Font.Size;
    	nesX = nesne.Location.X;
    	nesY = nesne.Location.Y;
    	nesGen = nesne.Size.Width;
    	nesYuk = nesne.Size.Height;
    	nesne.Location = new Point((int)(nesX / genislikOrani), (int)(nesY / yukseklikOrani));
    	nesne.Size = new Size((int)(nesGen / genislikOrani), (int)(nesYuk / yukseklikOrani));
    	fontBuyuk = (int)(nesFont / yukseklikOrani);
    	if (fontBuyuk < 8) fontBuyuk = 8;
    	nesne.Font = new Font("Calibri", fontBuyuk);
    	this.Size = new Size((int)((forGen / genislikOrani) + 20), (int)(forYuk / yukseklikOrani) + 150);
    
    	if (nesne.Controls.Count > 0)
    		foreach (var item in nesne.Controls)
    		{
    			nesFontAdi = nesne.Font.SystemFontName;
    			nesFont = nesne.Font.Size;
    			nesX = nesne.Location.X;
    			nesY = nesne.Location.Y;
    			nesGen = nesne.Size.Width;
    			nesYuk = nesne.Size.Height;
    			nesne.Location = new Point((int)(nesX / genislikOrani), (int)(nesY / yukseklikOrani));
    			nesne.Size = new Size((int)(nesGen / genislikOrani), (int)(nesYuk / yukseklikOrani));
    			fontBuyuk = (int)(nesFont / yukseklikOrani);
    			if (fontBuyuk < 8) fontBuyuk = 8;
    			nesne.Font = new Font("Calibri", fontBuyuk);
    			this.Size = new Size((int)((forGen / genislikOrani) + 20), (int)(forYuk / yukseklikOrani) + 150);
    		}
    }



    formdaki bütün kontrollerin boyutu form ile birlikte aynı anda ve aynı oranda değişmiyor. Aynı zamanda değişirken kontroller arasındaki mesafe de aynı kalmalı. 

    Saygısızlık gibi anlamayın

    Siz daha önce böyle bir şey gördünüz mü ? Ben anchor ile yapılabilecek, kod geliştirenlerin kullandığı, genel geçer yöntemleri örnekledim. Kontrolleri büyütüp küçülterek olayı çözebileceğinizi düşünmüyorum.  Bir butonun büyümesi veya küçülmesi çok saçma bir görünüme yol açar. 

    Mobil hariç tüm web sitelerinde ekran çözünürlüğü ne olursa olsun buton boyutu sabittir. Çözünürlük büyüdüğünde buton küçülmüş gibi gözükür, insanlar buna alıştı. Sizin yapmaya çalıştığınız yeni bir akım.

    Aklıma bir şey daha geldi, ben programı tam ekran kullanmak istemezsem o zaman ne olacak, bütün her şey küçülecek, aşağıdan çeksem kısa gözükecek, sağdan çeksem dar gözükecek, görüntünün aslında birde oranında olması gerekiyor. 

    Abdullah Bey,

    Haklısınız buton hariç tutulabilir. Uygulama tam ekran değildir.

    14 Ekim 2015 Çarşamba 14:45
  • if (nesne.Controls.Count > 0)
    	foreach (Control subNesne in nesne.Controls)
    	{
    		nesFontAdi = subNesne.Font.SystemFontName;
    		nesFont = subNesne.Font.Size;
    		nesX = subNesne.Location.X;
    		nesY = subNesne.Location.Y;
    		nesGen = subNesne.Size.Width;
    		nesYuk = subNesne.Size.Height;
    		subNesne.Location = new Point((int)(nesX / genislikOrani), (int)(nesY / yukseklikOrani));
    		subNesne.Size = new Size((int)(nesGen / genislikOrani), (int)(nesYuk / yukseklikOrani));
    		fontBuyuk = (int)(nesFont / yukseklikOrani);
    		if (fontBuyuk < 8) fontBuyuk = 8;
    		subNesne.Font = new Font("Calibri", fontBuyuk);
    		this.Size = new Size((int)((forGen / genislikOrani) + 20), (int)(forYuk / yukseklikOrani) + 150);
    	}

    Pardon orası şöyle olacak, iterasyondaki itemi değiştirmeyi unutmuşum.

    • Yanıt Olarak İşaretleyen Sedat Kaynar 14 Ekim 2015 Çarşamba 15:00
    14 Ekim 2015 Çarşamba 14:46
  • Bu arada Size'a göre yaptığınız tüm hesaplamalar yanlıştır, border ve caption kısmını kullanıcı değiştirebiliyor, Windows'tan Windows'a da farklılık gösteriyor. Bu yüzden ClientSize'a göre hesap yapmalısınız.

    14 Ekim 2015 Çarşamba 15:01
  • Abdullah Bey,

    Teşekkür ederim. Verdiğiniz kod büyük ölçüde işimi gördü. Ufak tefek ayarlar kaldı. Onlara yarın bakacağım. İyi çalışmalar.

    14 Ekim 2015 Çarşamba 15:02
  • selam hocam çözümü nasıl buldunuz bana da yardımcı olur musuuz bende program yazılyorum ama ekran çözünürlüğüne göre dağılımda kaymalar oluşuyor.

    29 Kasım 2021 Pazartesi 08:27