Toon posts:

[VB6] Outlined tekst?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een vraag over Visual Basic 6, hoe maak je outlined tekst?
Zoiets dus:
Afbeeldingslocatie: http://rotzooi.lakwijk.com/contour.gif

Ik moet hem natuurlijk wel kunnen aanpassen (net zoals een label, of een textbox) ;)


Met google kon ik niks vinden (alleen over hoe je een form maakt in de vorm van letters, met outline), en #devschuur is tegenwoordig moderated :?
In een ander channel op een andere server op IRC zei iemand dat hij twee manieren wist zonder API calls, maar toen ik vroeg hoe bande die kerel me :/
Ook de search hier kon me niet verder helpen.

Verwijderd

Als je het mij vraagt is dit niet mogelijk ...

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Dit moet je met het handje doen, kwestie van iedere letter 2 keer tekenen: 1 keer zwart groot en dan met wit 1 keer klein. Er zit wel een hoop rekenkundige lulligheid achter, daarvoor moet je een hoop rekenwerk met de Win32 font-functies verrichten (zie GetTextMetrics en gerelateerde functies).

offtopic:
#devschuur is overigens niet meer moderated, dat was maar een kwartiertje :)

[ Voor 10% gewijzigd door curry684 op 17-12-2003 00:15 ]

Professionele website nodig?


Verwijderd

Topicstarter
Hmm... Dat had ik al geprobeerd, maar grotere tekst achter kleinere tekst zetten geeft geen outlined tekst als resultaat; is ook logisch, want voor outlined tekst zou je dikkere tekst (over beide assen bold zeg maar) over dunnere tekst moeten plaatsen, met allebei dezelfde grootte.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 17 december 2003 @ 00:24:
Hmm... Dat had ik al geprobeerd, maar grotere tekst achter kleinere tekst zetten geeft geen outlined tekst als resultaat; is ook logisch, want voor outlined tekst zou je dikkere tekst (over beide assen bold zeg maar) over dunnere tekst moeten plaatsen, met allebei dezelfde grootte.
Je moet er natuurlijk wel een geschikt filled font zoals Arial Black of zo voor pakken, anders schiet het niet echt op nee.

Maar mocht deze 'truc' niet afdoende werken, is het antwoord op je vraag gewoon 'nee' :)

Professionele website nodig?


Verwijderd

Topicstarter
Zoals ik al voorspelde, werkt die 'truc' niet afdoende:
Afbeeldingslocatie: http://rotzooi.lakwijk.com/w.gif

Iemand misschien nog een idee om tekst op een andere mooie manier leesbaar te krijgen op alle mogelijke achtergronden (steeds veranderend plaatje) zonder dat er teveel van dat plaatje wegvalt?
;(

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 10:41

johnwoo

3S-GTE

Maak een memory DC, TextOut daar je string op, en verzin vervolgens zelf een algoritme om de randjes om die tekst te tekenen. Het resultaat MaskBlt je naar de uiteindelijke DC (in VB waarschijnlijk op een PictureBox).

Een mogelijk algoritme: loop alle pixels af, kijk voor iedere pixel of er binnen r pixels rondom deze een (witte) text pixel is te vinden, en zo ja, maak deze pixel dan zwart. r is dan de dikte van de outline. Kan vast nog wel het een en ander aan geoptimaliseerd worden :P

[ Voor 5% gewijzigd door johnwoo op 17-12-2003 16:14 ]

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


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wellicht een betere optie: Gebruik een outlined font? Denk er dan wel aan dat je dat font mee neemt in je setup.
Voorbeeldje van wat ik bedoel, maar niet het juiste font

[edit]
Bedenk me zojuist dat je dan wel de "witte binnenkant" niet krijgt...

[ Voor 15% gewijzigd door RobIII op 17-12-2003 16:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Schoot me naar aanleiding van johnwoo's post ineens een oud topic te binnen: [rml][ Win C++] image effect[/rml]

Lees eens door, gaat ongeveer over wat jij wil :)

Professionele website nodig?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
* RobIII geeft effe wat code gebakken ;)

Visual Basic 6:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Private Sub OutlineText(ByRef objDraw As Object, _
                            strText As String, _
                            iFontsize As Integer, _
                            Optional iBorderSize As Double = 1, _
                            Optional lInnerColor As Long = vbWhite, _
                            Optional lOutlineColor As Long = vbBlack, _
                            Optional X As Long = -1, _
                            Optional Y As Long = -1)
    Dim lX As Long
    Dim lY As Long
    Dim R As Integer
    Dim I As Double
    
    Const pi = 3.14159265358979
    
    With objDraw
        If X < 0 Then X = .CurrentX
        If Y < 0 Then Y = .CurrentY
        .Enabled = False
        .AutoRedraw = True
        .FontSize = iFontsize
        .ForeColor = lOutlineColor
        .ScaleMode = vbPixels
                
        For R = Abs(iBorderSize) To 0 Step -1
            For I = 0 To 2 * pi Step 0.1
                lX = X + (R * Cos(I))
                lY = Y + (R * Sin(I))
                .CurrentX = lX
                .CurrentY = lY
                objDraw.Print strText
            Next
        Next
        
        .ForeColor = lInnerColor
        .CurrentX = X
        .CurrentY = Y
        objDraw.Print strText
        
        .Enabled = True
    End With
End Sub


Aanroep:
Visual Basic 6:
1
OutlineText Picture1, "Test", 25, 1.5, vbWhite, vbRed, 25, 25


De parameters zijn als volgt:
objDraw Het object waarin je wil tekenen (Meestal een picturebox, maar kan ook anders zijn)
iFontsize Font grootte
iBorderSize Border grootte (default 1)
lInnerColor Kleur "binnenkant" letters (default wit)
lOutlineColor Kleur "border" (default zwart)
X X-Positie waar de tekst moet komen (default: huidige .CurrentX van objDraw)
Y Y-Positie waar de tekst moet komen (default: huidige .CurrentY van objDraw)

Hoe werkt het :?
Als je de code in slow-motion zou bekijken zie je dat de tekst een aantal keren in een cirkel over elkaar wordt geprint in de borderkleur. Vervolgens wordt precies in het midden de juiste tekst 1 maal in de "innercolor" kleur geplaatst.

Simple as that ;)

Thanks curry684 voor je draad (die bracht me op het idee) ;)

Screenshotje van bovenstaand voorbeeld:
Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/1203/btest.gif
En eentje voor de TS:
Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/1203/btest2.gif
Nog meer voorbeelden:
Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/1203/btest3.gif

Snel testen?
Open een nieuw project, gooi de bovenstaande sub in je code en gooi in je form_load event de volgende code:
Visual Basic 6:
1
2
Me.FontName = "Arial"
OutlineText Me, "Test", 50, 3, vbWhite, vbBlack, 25, 25

Runnen et voila 8)

Overigens wordt anti-aliasing al een stukje moeilijker ;)

Oh, en het default font van objDraw wordt gebruikt. Je zou hier nog een extra parameter van kunnen maken. Gebruik om te testen bijvoorbeeld "Arial". MS Sans serif (default font van VB) geeft geen mooi resultaat. En let op dat de X en Y in pixels wordt gemeten, niet twips!

[ Voor 52% gewijzigd door RobIII op 17-12-2003 18:05 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:59

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als je echt een vloeiende cirkelboog wilt volgen kun je beter het bresenham cirkel-algoritme gebruiken.

Je antwoord is erg inefficient en bovendien niet altijd correct. Als de border groter is dan de dikte van de lijnstukken van de letters, dan krijg je gaten. Je moet het dus ook opvullen.

Het voorbeeld van de topicstarter geeft trouwens geen rondingen, zie bijvoorbeeld de linker-bovenhoek van de B. Als je gewoon een vierkante border wilt van zeg 3x3, dan kun je beter gewoon een genest loopje doen waarbij -3 < y < 3 en -3 < x < 3

anti-aliasing is overigens vrij simpel te doen dmv supersampling. Je tekent het plaatje op een grotere resolutie, en daarna schaal je het naar beneden door steeds het gemiddelde te nemen van een groepje pixels

[ Voor 17% gewijzigd door .oisyn op 17-12-2003 18:03 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
.oisyn schreef op 17 december 2003 @ 18:01:
Als je echt een vloeiende cirkelboog wilt volgen kun je beter het bresenham cirkel-algoritme gebruiken.
Inderdaad, echter ging het om het idee...En het werkt IMHO voldoende voor simpele doeleinden.
.oisyn schreef op 17 december 2003 @ 18:01:
Je antwoord is erg inefficient en bovendien niet altijd correct. Als de border groter is dan de dikte van de lijnstukken van de letters, dan krijg je gaten. Je moet het dus ook opvullen.
Klopt, maar zie voorgaande reactie...Dit kun je overigens oplossen door de step size van 0.1 naar 0.01 te zetten
.oisyn schreef op 17 december 2003 @ 18:01:
Het voorbeeld van de topicstarter geeft trouwens geen rondingen, zie bijvoorbeeld de linker-bovenhoek van de B. Als je gewoon een vierkante border wilt van zeg 3x3, dan kun je beter gewoon een genest loopje doen waarbij -3 < y < 3 en -3 < x < 3
Dat heb ik eerst geprobeerd, maar was geen gezicht. Ik zal zo een screenshotje posten.

Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/1203/btest4.gifAfbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/1203/btest5.gif

Zoals je ziet worden de randen te recht. Maar als de TS dat zou willen kun je regels 25 t/m 33 vervangen door:

Visual Basic 6:
1
2
3
4
5
6
7
        For lX = X - iBorderSize To X + iBorderSize
            For lY = Y - iBorderSize To Y + iBorderSize
                .CurrentX = lX
                .CurrentY = lY
                objDraw.Print strText
            Next
        Next
.oisyn schreef op 17 december 2003 @ 18:01:
anti-aliasing is overigens vrij simpel te doen dmv supersampling. Je tekent het plaatje op een grotere resolutie, en daarna schaal je het naar beneden door steeds het gemiddelde te nemen van een groepje pixels
Ja, maar dat los je niet op in 4 regels code en gaat buiten mijn bedoeling om: Het illustreren van hoe het kan en dat het kan. Mijn bedoeling was de TS op weg te helpen (ik heb al genoeg voorgekauwd dacht ik zo) en het zelf te laten verfijnen...

[ Voor 18% gewijzigd door RobIII op 17-12-2003 18:14 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 09:01

klinz

weet van NIETS

Het kan natuurlijk veel simpeler. In het volgende stukje is DC de device context waar je op wilt tekenen:
code:
1
2
3
4
5
BeginPath(DC);
TextOut(DC, 0, 0, Text, Length(Text));
EndPath(DC);

StrokePath(DC);

Syntax is misschien niet helemaal correct omdat het uit een delphi programma komt. Overigens werkt dit alleen met true type fonts IIRC.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
klinz schreef op 17 december 2003 @ 18:10:
Het kan natuurlijk veel simpeler. In het volgende stukje is DC de device context waar je op wilt tekenen:
code:
1
2
3
4
5
BeginPath(DC);
TextOut(DC, 0, 0, Text, Length(Text));
EndPath(DC);

StrokePath(DC);

Syntax is misschien niet helemaal correct omdat het uit een delphi programma komt. Overigens werkt dit alleen met true type fonts IIRC.
En de correcte syntax voor VB6 (en werkend voorbeeld) vind je hier

* RobIII wist niet van het bestaan van de StrokePath API :X

Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/1203/btest6.gif

[ Voor 13% gewijzigd door RobIII op 17-12-2003 18:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

RobIII schreef op 17 december 2003 @ 18:24:
[...]
* RobIII wist niet van het bestaan van de StrokePath API :X
Hmm ik had er wel eens van gehoord maar niet echt aan gedacht voor deze toepassing... is volgens mij wel leuk idee ja. Werkt ook met verschillende pen sizes dan neem ik aan?

Professionele website nodig?

Pagina: 1