hWnd   zodpovězená otázka

VB6/VBA

Prosím, k čemu je dobrá vlastnost hWnd (Windows Handle)? Přečetl jsem si už aspoň 5 definic, ale já to prostě nechápu:). Případně prosím o nějakou ukázku kódu ve VB6..

Díky :)

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

Příklad použit hwn - zde hwnd RichTextBoxu

Klepnutím na tlačítko Command1 se do RichTextBox1 vloží obsah paměťové schránky:

Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) _
  As Long
Private Const WM_PASTE = &H302

Private Sub Command1_Click()
  SendMessage RichTextBox1.hwnd, WM_PASTE, 0, 0
End Sub

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

Handle je velice jednoduše řečeno unikátní identifikátor. Ve Windows má téměř všechno Handle, ať už je to okno, ovládací prvek, nebo obrázek načtený v paměti. Pokud chcete s něčím pracovat na nižší úrovni, téměř vždy k tomu použijete Handle. V high-level jazycích jako je Visual Basic nebo C# se tím nemusíte zabývat, používá se to téměř výhradně při práci s Windows API (unmanaged kód).

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

Vy první jste mi zřejmě napsal příklad ve VB.NET, takže tomu vůbec nerozumim :) a Vy, pane Ondřeji, jste mi to sice vysvětlil moc pěkně, ale v podstatě nevim zase nic :). Takže díky Vám oběma za snahu a někdo další může zkusit štěstí a vysvětlit mi to tak, abych to i já debil pochopil ;)

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

Dám vám příklad ve VB.NET:

Public Class Form1
  Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
    Using g = Graphics.FromHwnd(Me.Handle)
      g.DrawEllipse(Pens.Black, Me.ClientRectangle)
    End Using
  End Sub
End Class

Po klepnutí na okno se vytvoří kreslící plocha. Na tuto plochu se nakreslí elipsa. Kreslící plocha je ve skutečnosti klientská oblast okna, jejíž identifikátor je právě Handle.

Ve VB 6.0 se Handle používá pouze a jenom pro volání některých funkcí Windows API, takže pokud nemáte konkrétní představu co chcete pomocí Windows API udělat, nemá cenu to řešit.

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

Jsme ve fóru Visual Basic 6 - nikoliv VB.NET a první příklad není v .NET!

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

Však sem na to také upozorňoval, čtěte pořádně...

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

Odpověď patří k: Datum: 13.1.2009 17:43

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

Jak už psal Ondřej Linhart, handle je unikátní (jedinečný) identifikátor něčeho. Ve Windows takřka všeho.

Vezměme si jako příklad klasickou aplikaci s formulářem (neboli oknem). Při programování pomocí Windows API (tedy volání přímo funkcí Windows v knihovnách jako kernel32.dll, user.dll) se nejprve musí okno vytvoři zavoláním funkce CreateWindow, která má spoustu parametrů. Ta okno (formulář) vytvoří a vrátí handle (tedy identifikátor) tohoto okna. To je číslo, nad jehož hodnotou není potřeba nějak přemýšlet. Teď chci toto okno třeba zvětšit. Tak řeknu Windows (zavoláním příslušné funkce z Windows API), změň velikost okna. Ovšem oken (aplikací) je najednou otevřeno hodně, takže zároveň musím říct, které okno mají Windows zvětšit. A to sdělím pomocí handle, protože handle toto okno identifikuje. Odtud je doufám zřejmé, že každé okno má svůj vlastní jedinečný handle.

Příklad číslo dvě: Chci si nakreslit na okno čáru. Když chci kreslit ve skutečnosti, musím mít tužku, pero atd. prostě psací nástroj. Ve Windows potřebuji taky pero (o určitém stylu čáry, barvě, tlouštce), aby Windows věděly, jak mají kreslit. Pero si tedy pomocí funkce CreatePen vytvořím. Toto vytvořené pero (řekněme tloušťka 1, styl čáry tečkovaná, barva červená) je opět identifikované pomocí svého jedinečného handle. Když potom řeknu Windows kresli čáru od bodu A do bodu B, řeknu zároveň pomocí jakého pera to mají kreslit. Pero identifikuju pomocí jeho handle.

Při práci se soubory se také používá pro soubor handle. Chci do souboru zapsat?

1. Říct Windows, otevři soubor, je mi vrácen jeho handle.

2. Říct Windows, zapiš do souboru. Soubor identifikuju pomocí handle z bodu 1.

3. Říct Windows, zavři soubor. Soubor identifikuju pomocí handle z bodu 1.

Atd. Takhle je to skoro při všem

Ve Visual Basicu to není nutné řešit, protože Visual Basic nás od volání těchto funkcí z Windows API odděluje a umožňuje nám tak pohodlnější práci. Ovšem protože někdy je nutné nebo vhodné si něco pomocí Windows API zařídit sám, je nutné znát příslušný handle. A ten je pro Form obsažený v jeho vlastnosti hWnd. hWnd je zkratka handle window. Když budeš chtí u svého formuláře změnit velikost na 300 x 200, tak buď

1. Form1.Width = 300 Form1.Height = 200

2. pomocí funkce z Window API MoveWindow(Form1.hWnd, Form1.Left, Form2.Top, 300, 200, True) udělám to samé. Pomocí handle okna (vlastnost Form.hWnd) si to svoje okno identifikuju.

Visual Basic v odrážce jedna vlastně odrážku 2 provede za mě. To je výhodné, protože práce čistě pomocí Window API je někdy zdlouhavá, náchylná na chyby a vůbec dost nepohodlná.

Doufám, že teď už je to jasnější.

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