Pevná výška Controlu   zodpovězená otázka

VB.NET, WinForms

Zdravím,

rád bych požádal o radu, jakým způsobem je možné nastavit, aby můj Control bylo možné dimenzovat jen do šířky? Výška by měla jít nastavit pouze 'zevnitř'.

Díky

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

No, asi bych to ošetřil v nějaké události resize, ne?

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

Ano jistě, ale nehodlám se s uživatelem dohadovat, jaký rozměr bude Control mít. AutoSize=True také znemožní uživateli prvek dimenzovat, já bych chtěl totéž, ovšem jen na výšku.

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

Tak si na začátku události Resize zapamatujte Váš napevno daný rozměr a po skončení resize jej automaticky vraťte zpět, ne? ;-))

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

Samozřejmě, to bylo první, co mě napadlo. Ale hledám nějaké elegantnější řešení... Nějaká nastavení CreateParams nebo WndProc, atribut, něco, co by zabránilo tomu, aby se Control dal dimenzovat do výšky.

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

Zdravím, já bych to řešil jednoduše, nastavením minimální a maximální hodnoty výšky na stejnou hodnotu. Třeba:

MinimumSize(40;70)
MaximumSize(1000;70)
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dobře, ale co, pokud si uživatel tyto hodnoty změní?

Nejde mi o to, dohadovat si s uživatelem, jak bude Control vysoký. Chci mít napevno dané, že Control lze dimenzovat pouze do šířky. A tuším, že klíč bude právě v CreateParams, nebo WndProc.

Nicméně díky za snahu! :-)

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

Pokud chcete skutečně low-level řešení, což je podle mě naprosto zbytečné, pak se můžete inspirovat tímto:

Imports System.Runtime.InteropServices
Public Class UserControl1
  Private Const WM_SIZE As Integer = &H5
  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If m.Msg = WM_SIZE Then
      'Dodělat m.LParam = ...
    End If
    MyBase.WndProc(m)
  End Sub
End Class

Když přijde do ovládacího prvku zpráva pro změnu velikosti (WM_SIZE), potom horní část hodnoty LParam (high-order word) znamená nově požadovanou výšku ovládacího prvku. Tuto horní část hodnoty byste musel pokaždé nastavovat na požadovanou konstantní velikost. Ale pozor, hodnota LParam má také dolní část (low-order word), která udává nově požadovanou šířku ovládacího prvku. Takže byste složil pomocí dolní a horní části hodnotu typu Integer a tu potom pomocí maršálizace přeložil v Unmanaged paměti na Pointer (IntPtr) a ten nastavil do LParam a předal ke zpracování pomocí MyBase.WndProc(m). Ještě se vám do toho chce?

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

Děkuji za reakci! Tušil jsem, že to nebude snadné, ale netušil jsem, že to bude až tak složité.

Děkuji za odpověď

nahlásit spamnahlásit spam 0 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