Radek Chalupa - vývoj software

Hlavní stránka

Články

Vývoj software

Školení a konzultace

Webdesign

Externí spolupráce

Software

Knihy

Kontakt


Vlastní prvky v .NET: Možná nestandardní ale jednoduchý postup.

11.3.2006

U ovládacího prvku TextBox (pro WinForms) knihovny .NET Framework chybí (z pro mě nepochopitelného důvodu) možnost jednoduchého nastavení stylu prvku tak aby do něj bylo možno zadávat pouze čísla. Tato vlastnost včetně systémové obsluhy chybného zadání je přitom standardní součástí rozhraní Win API. Konkrétně jde o styl ES_NUMBER prvku třídy Edit.

Stál jsem tedy před otázkou jakým co nejjednodušším způsobem toto umožnit. Tím nejjednodušším způsobem myslím nějaký způsob bez vytváření nějaké knihovny tříd. Chtěl jsem mít vše v jednom exe souboru a nemuset kvůli takovéto maličkosti vytvářet vizuální prvek a ten přidávat na ToolBox.

Vyřešil jsem to následovně: Do projektu (Windows Forms aplikace v C#) jsem přidal novou třídu (Project -> Add Class) kterou jsem ručně (tj. až v kódu - nikoliv volbou Inherited User Control!) podědil od třídy TextBox.  Celý kód třídy vypadá takto:

class EditCislo : System.Windows.Forms.TextBox
{
	protected override CreateParams CreateParams
	{
		get
		{
			CreateParams cp = base.CreateParams;
			cp.Style |= 0x2000; // ES_NUMBER
			return cp;
		}
	}
}
	

Princip je jednoduchý. Každý prvek odvozený od třídy Control má property CreateParams, kterou si frameworkk "přečte" před vlastním vyvořením handle okna tohoto prvku a použije nastavené parametry. Jedním z nich je styl okna - zde nazvaný Style. Pro náš účel stačí do stylu přidat vlastnost ES_NUMBER, která je definovaná v hlavičkovém souboru winuser.h:

#define ES_NUMBER           0x2000L

Odtud tedy hodnota 0x2000 použitá v kódu třídy. Jak podobné hodnoty zjistit nejrychleji? Dělám to tak že pokud píšu projekt v C#/NET a potřebuji nějakou hodnotu z Windows SDK, vygeneruji si rychle si vedle nový projekt typu Win32 aplikace a pak stačí někam do jeho zdrojového kódy napsat například ES_NUMBER, najet myší a po krátkém okamžiku se v tooltipu objeví požadovaná hodnota.

Aplikace vyžaduje pro každý takový prvek pouhé dva zásahy do kódu formuláře. Po přidání prvku TextBox na formulář v souboru FormXX.designer.cs změnit deklartaci příslušné členské proměnné a její konstruktor v metodě InitializeComponent.

private EditCislo textBox1;
// ...
this.textBox1 = new VlastniPrvky.EditCislo();

Po spuštění programu se již textbox chová tak jak je standardem pro ovládací prvek Edit se stylem ES_NUMBER

Prvek za běhu

Problém plynoucí z nestandardního postupu a jak jej řešit

Vzhledem k tomu že tento postup asi není zcela "standadní", musíme počítat s jedním "problémem". Pokud před znovuotevřením projektu smažeme před tím vytvořený exe soubor a pokusíme se zobrazit formulář obsahující náš prvek, zobrazí se nám následující chyba:

Chyba designu

Řešení je jednoduché. Stačí prostě znovu sestavit (build) projekt a při opakovaném pokusu o zobrazení formuláře v designu jsme již úspěšní a vše je v pořádku.

Sdílet

  Copyright © 2010 Radek Chalupa || tel. 739 219 991Kontakt | Poslat e-mailÚvod