[VB] TextBox verticaal uitlijnen met DrawText API?

Pagina: 1
Acties:
  • 297 views sinds 30-01-2008
  • Reageer

  • mim
  • Registratie: Juni 2001
  • Laatst online: 03-05-2007
Voor de duidelijkheid het volgende doe ik/wil ik doen in VB6.

Ik wil graag de text in een TextBox verticaal uitlijnen. Na een zoektocht van ruim 2 dagen heb ik velen voorbeelden en adviezen voorbij zien komen. De meeste concentreerde zich rond het gebruik van de DrawText API Call.

Echter ik heb nog steeds geen uitleg/voorbeeld gevonden hoe deze API Call te gebruiken om de text in een TextBox verticaal te centreren. Het probleem is dat de TextBox niet zijn eigen DC (Device Context) heeft. Het lukt me dan ook wel om bijvoorbeeld op het form zelf de DrawText API Call los te laten. Maar nog niet voor de TextBox.

Is dit mogelijk of is er misschien een andere methode om de text in een TextBox verticaal te kunnen centreren?

Verwijderd

De device context haal je op met GetDC. Dan moet je wel de hwnd hebben, die als het goed is gewoon onder de .hwnd van je textbox staat.

Visual Basic:
1
Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Long) As Long

Als je klaar bent met de DC dan release je hem weer met ReleaseDC

Visual Basic:
1
Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Hoe je het aanroepen kan:

Visual Basic:
1
2
3
4
Dim hDC As Long
hDC = GetDC(textboxnogwat.hwnd)
'doe de gevallen die je wilt doen
ReleaseDC textboxnogwat.hwnd, hDC


Hopelijk heb je hier wat aan, iig succes!

  • mim
  • Registratie: Juni 2001
  • Laatst online: 03-05-2007
Verwijderd schreef op 20 June 2003 @ 14:46:
De device context haal je op met GetDC. Dan moet je wel de hwnd hebben, die als het goed is gewoon onder de .hwnd van je textbox staat.

Visual Basic:
1
Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Long) As Long

Als je klaar bent met de DC dan release je hem weer met ReleaseDC

Visual Basic:
1
Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Hoe je het aanroepen kan:

Visual Basic:
1
2
3
4
Dim hDC As Long
hDC = GetDC(textboxnogwat.hwnd)
'doe de gevallen die je wilt doen
ReleaseDC textboxnogwat.hwnd, hDC


Hopelijk heb je hier wat aan, iig succes!
He bedankt voor de snelle reactie. Ik zal eens kijken of ik daar iets mee kan.

  • mim
  • Registratie: Juni 2001
  • Laatst online: 03-05-2007
Helaas:( Ik kan hiermee inderdaad de DC van de TextBox bepalen maar ik krijg het toch niet aan de praat.
Ik weet eigenlijk nog steeds niet of de TextBox op die manier wel kan worden bewerkt? Ik ben dit gaan onderzoeken toen ik ergens op het INet de opmerking vond dat je dit zou moeten doen met de DrawText API. Helaas stond daar geen voorbeeld bij.

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Uhm ??????
* muba start Visual Basic
* muba begint een Standard Exe project
* muba sleurt-en-pleurt een textbox op het form
* muba opent het properties-window van de textbox
* muba zet het alignment property op right justify
* muba drukt op PLAY
* muba tikt tekst in en ziet dat die mooi rechts uit wordt gelijnd.

Geloof je niet? Heb ff een screenie voor je gemaakt:
Afbeeldingslocatie: http://members.home.nl/par/watnou.jpg

[ Voor 22% gewijzigd door muba op 20-06-2003 16:47 ]

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 22:29

johnwoo

3S-GTE

MUBA schreef op 20 June 2003 @ 16:46:
Uhm ??????
* muba start Visual Basic
* muba begint een Standard Exe project
* muba sleurt-en-pleurt een textbox op het form
* muba opent het properties-window van de textbox
* muba zet het alignment property op right justify
* muba drukt op PLAY
* muba tikt tekst in en ziet dat die mooi rechts uit wordt gelijnd.

Geloof je niet? Heb ff een screenie voor je gemaakt:
[afbeelding]
Da's heel mooi, horizontaal uitgelijnd, MUBA ;)
Probleem is dat de topicstarter de text verticaal in het midden wil hebben.

Je zou eens kunnen proberen om de textbox te subclassen en zelf het tekenen af te handelen. * johnwoo pakt VB er even bij...

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Oh FUCK! Verticaal! Ik moet wel ff wat beter opletten :) Sorry

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 22:29

johnwoo

3S-GTE

Hmm.. het zelf afhandelen van de WM_PAINT messages is ook nogal omslachtig...
Je zou nog naar EM_GETRECT en EM_SETRECT kunnen kijken, daarmee stel je de formatting rectangle voor de text in (hiermee kan je dus de kantlijnen aanpassen), maar bij mij gaf EM_GETRECT steeds (0, 0)-(0, 0) terug :?

De makkelijkste oplossing: maak een PictureBox van de gewenste grootte (wel AutoRedraw en HasDC ff op False zetten, scheelt weer wat resources ;)), en zet daarin een textbox zonder border. Om de illusie compleet te maken zet je de mousepointer van deze picturebox nog op de textcursor, en geef je de focus aan de textbox zodra je picturebox de focus krijgt.

[edit] OK, ik had n dom foutje, EM_SETRECT werkt prima :) Het nadeel is dat het alleen voor multiline textboxjes werkt. Dat kun je dan weer oplossen door de enter toets niet door te laten in TextBox_KeyDown.

In je declaraties:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Const EM_GETRECT As Long = &HB2
Private Const EM_SETRECT As Long = &HB3

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hWnd As Long, _
    ByVal uMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long

Ergens in je code nadat de textbox is gecreeerd:
Visual Basic .NET:
1
2
3
4
5
6
7
    Dim rc As RECT
    Dim m As Long
    SendMessage Text1.hWnd, EM_GETRECT, 0, VarPtr(rc)
    m = rc.Top + (rc.Bottom - rc.Top) \ 2
    rc.Top = m - 8  ' Formatting rectangle begint 8 pixels boven het midden...
    rc.Bottom = m + 8   ' ... en eindigt 8 pixels onder het midden.
    SendMessage Text1.hWnd, EM_SETRECT, 0, VarPtr(rc)

En vergeet MultiLine niet op True te zetten in de properties van de textbox! ;)

[ Voor 52% gewijzigd door johnwoo op 20-06-2003 18:41 ]

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Bij mij gebeurd er echt helemaal niets met bovenstaande code.

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 22:29

johnwoo

3S-GTE

robjanssen schreef op 21 June 2003 @ 10:05:
Bij mij gebeurd er echt helemaal niets met bovenstaande code.
Weet je zeker dat je MultiLine op True hebt gezet? :P
EM_SETRECT werkt, zoals ik al eerder zei, alleen op multiline edit boxes. De code werkt prima :)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Ik heb MultiLine op True staan.

Ik heb je code onder een Command button geplaatst, maar als ik op de Command button klik, gebeurt er helemaal niets.

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 22:29

johnwoo

3S-GTE

robjanssen schreef op 21 juni 2003 @ 15:14:
Ik heb MultiLine op True staan.

Ik heb je code onder een Command button geplaatst, maar als ik op de Command button klik, gebeurt er helemaal niets.
Da's raar, hier werkt het perfect...
Ik heb het ff online gegooid: form / proggel.
Als ik op t knopje klik ziet het er zo uit:
Afbeeldingslocatie: http://lunenburg.xs4all.nl/zooi/Textbox-VAlign.gif

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • mim
  • Registratie: Juni 2001
  • Laatst online: 03-05-2007
Wow :o Ik ben van het weekend helaas niet in de buurt van een computer geweest dus kheb nog niet kunnen kijken hoe het met dit topic stond. Maar Ik zie hier nu zeker dingen staan die misschien wel een oplossing kunnen zijn. Helaas heb ik nu weer geen tijd om er verder naar te kijken misschien wel in de loop van de dag.
In ieder geval iedereen alvast bedankt voor het meedenken. _/-\o_

  • mim
  • Registratie: Juni 2001
  • Laatst online: 03-05-2007
johnwoo schreef op 21 juni 2003 @ 17:28:
[...]

Da's raar, hier werkt het perfect...
Ik heb het ff online gegooid: form / proggel.
Als ik op t knopje klik ziet het er zo uit:
[afbeelding]
Ik heb er naar gekeken en dit werkt! Na wat stoeien met je voorbeeldje heb ik het kunnen inpassen in het progsel waar ik het voor bedoeld had! Bedankt!

Nu weet ik alleen nog niet off het ook met DrawText kan ;)

Maar kheb nu tenminste een methode die het gewenste doel verwezenlijkt :9
Pagina: 1