Design a rozlišení   zodpovězená otázka

VB.NET

mohl by jste mi někdo pomoc? rozmístil jsem komponenty pomocí kódu a to procentuálně k me.width a me.hight. Jinak mám nastaven fullscreen a když měním na svém PC rozlišení vše funguje oki, vše vidím a vše je veliké jak má být. Ale když jsem spustil aplikaci na jiném PC tak to bylo rozhozené (při stejném rozlišení). Např. u jednoho textboxu jsem měl jeho šířku nastavenou na 96% šířky okna ale na tom druhém PC se vykreslil jen něco málo přes půlku. Nevíte někdo co s tím?

Děkuji za každou radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Procenta neberte z me.width a me.hight, ale z rozměru (rozlišení) obrazovky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

děkuji, přes to rozlišení jsem se moc nepohnul, ale i tak děkuji zaradu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A vůbec nejlepší je používat Layout Controls - TableLayoutPanel a FlowLayoutPanel které umí vše absolutně/relativně v pixelech/procentuálně rozmístit automaticky už v návrhovém režimu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji, pokusím se to udět přes to. Snad se mi to povede (měl jsem s tím nějaké problémy). Ale stále nechápu proč to na jednom PC jde (asi v 5 rozlišeních) a na jiném ne. Nemuže to být velikostí monitoru? mám 19" a zkoušel jsem to na 17".

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A mohl byste napsat, jak nastavujete ten "full screen" a jak potom nastavujete velikost a pozici jednotlivých komponent?

Osobně jedu na 20" a občas i na staré 15", ale nevšiml jsem si, že by velikost monitoru měla mít nějaký vliv na relativní rozmisťování komponent (ale přiznám se, zatím jsem to nepotřeboval do důsledku zkoumat).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak táto téma by aj mňa zaujímala. Mám podobný problém. Mohli by ste uviesť niejaký príklad ako použiť Layout Controls - TableLayoutPanel a FlowLayoutPanel ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

full nastavuji "WindowState" na "Maximized" a mam zrušen celý "ControlrolBox" aby se okno nemohlo zmenšit.

A jinak ten kód např.:

Dim resX As Integer = Screen.PrimaryScreen.Bounds.Width
Dim resY As Integer = Screen.PrimaryScreen.Bounds.Height

...

  ''GroupBox gpbAsk
  point = New Point(resX * 0.01, resY * 0.1)
  font = New Font("Microsoft Sans Serif", resX * 0.01)
  With gpbAsk
      .Location = point
      .Width = resX * 0.98
      .Height = resY * 0.27
      .Font = font
      .Text = "Otázka"
   End With

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Skutečně mne nenapadá možná příčina problémů. Jediné, co by teoreticky přicházelo v úvahu, že se Vám to okno se statam "maximize" na tom záhadném počítači otevře na sekundárním monitoru a Vy při tom vycházíte z rozměrů primáru - ale nevěřím tomu, protože když jsem to zkoušel, nepodařilo se mi dosáhnout toho, aby se mi formulář samočinně maximalizoval na "sekundáru".

Jediné, co bych Vám mohl poradit - zkuste nastavovat "fullscreen" mód trochu jinak. Já osobně to dělám tím způsobem (ale začal jsem to tak dělat proto, protože takto jsem schopen tu maximalizaci provést jak na primárním, tak na sekundárním monitoru), že formuláři nastavím vlastnost border na none a v sekci load nastavím jeho velikost na velikost primární (resp. sekundární) obrazovky:

Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
Me.Bounds = Screen.PrimaryScreen.Bounds

Pak taky budete mít jistotu, že vycházíte (jak při tvorbě formuláře, tak i při rozmisťování jednotlivých komponent na něm) ze stejných výchozích hodnot (rozměr primaryscreen).

Pokud jste spustil svou aplikaci na tom "záhadném" počítači, nenechal jste si kontrolně vypsat, jaké rozměry Vám to hází? Nebo jste to spouštěl již kompilované a tuto možnost jste neměl?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Při testování Vašeho kódu jsem došel ještě k jedné drobnosti - nevím, jste-li si toho vědom, nebo je to dokonce záměr.

Samozřejmě neznám, nemáte-li někde v kódu ještě chybějící deklarace, ale tak trochu bych varoval před používáním klíčových slov jako názvů proměnných - může to být jen a jen zdrojem problémů.

Třeba máte hned v úvodu definice groubbox nastavení nového bodu, který dále používáte v kódu. (zřejmě tam někde před tím máte proměnnou "point" deklarovánu jako "point", což není nejideálnější (koukněte na zajímavý článek na tomto Webu obledně konvencí a pravidel názvů ve VB).

Pokud to tady ještě prošlo, pak u toho druhého řádku je to ještě o něco horší. A to z toho důvodu, že "font" je návev vlastnosti formuláře a VB je natolik "chytrý", že pokud to takto použijete, sám si před tím domyslí "me." Jinak řečeno, vy v tomto řádku přenastavíte font celého formuláře (není-li to tedy účelem, pak ale je navíc to přiřazení dále v kódu). No a tady může být taky problém, protože formulář má, co jsem se díval, implicitně přednastavenu vlastnost "Autoscalemode" na "font", což asi znamená, že své rozměry upraví dle nové velikosti fontu. Netvrdím, že je právě toto příčinou Vámi popisovaného problému, protože natvrdo Vaším postupem definovaná umístění by se změnit neměla, ale rozhodně bych si na to dal pozor, protože by to mohlo být do budoucna i zdrojem dalších chyb.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

jj děkuji za upozornění, úmyslně to nebylo, spíše mé nedopatření, ani nevím proc jsem to tu tak pouzil. Smeg know:). tak ještě jednou děkuji za rozebrání článku.

PS: jinak jsem nakonec použil ty TableLayoutPanels....It's GooD

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak se dá zjistit rozlišení obrazovky, tj. jak je nastaveno dpi - nemyslím rozměr, např. 1024x768px, ale např. standard u LCD 96dpi nebo dále nabízených 120dpi (ve Windows XP), anebo jiné uživatelské nastavení?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nastavení hodnoty MS nazývá velikost a ja ve vlastnostech monitoru . pr. tl. na Ploše - Vlastnosti - Nastavení - Upřesnit - Obecné - Zobrazení

V XP volby:

Normální velikost

Velká velikost

Vlastní nastavení...

Jak nastavení zjistit a kódem nastavit? Věděl by někdo, prosím?

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stačí zavolat funkci GetDeviceCaps a zjistit si dpi pro horizontální a vertikální osu:

    Declare Function GetDeviceCaps Lib "GDI32.dll" (ByVal hDC As IntPtr, ByVal nIndex As Integer) As Integer

    Const LOGPIXELSX = 88
    Const LOGPIXELSY = 90

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim hdc As IntPtr = Me.CreateGraphics().GetHdc()
        Dim dpiX As Integer = GetDeviceCaps(hdc, LOGPIXELSX)
        Dim dpiY As Integer = GetDeviceCaps(hdc, LOGPIXELSY)

        MsgBox(dpiX & "x" & dpiY)

    End Sub

Pokud je v proměnných dpiX a dpiY hodnota 96, pak je nastaveno 96 dpi, pokud je v obou 120, pak je nastaveno 120 dpi.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback