Darstellung erweiterter ASCII-Codes mit DrawText

Anfängerfragen zum Programmieren mit PureBasic.
johnnysnet
Beiträge: 26
Registriert: 05.11.2006 22:01
Kontaktdaten:

Darstellung erweiterter ASCII-Codes mit DrawText

Beitrag von johnnysnet »

Hey,

weiß jemand, ob und wie das möglich ist? Würde gerne mit DrawText solche erweiterten ASCII-Zeichen darstellen, wie z.B. diese Ecken (191, 192, 217, 218). Ich habe es schon mit verschiedenen Zeichensätzen, mit der Einstellung Unicode im Compiler und mit UTF-8 Codierung des Quellcodes probiert, jedoch klappt es nicht.
Zuletzt geändert von johnnysnet am 09.11.2006 13:57, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

interessante frage....

ich habs noch nie probiert, man müste ja den charset-code auf reinem ANSI bzw. ASCII ansprechen...
...und das über direct-draw...
hast du schon mal die help-seiten von MS über direct-draw durchforstet?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
johnnysnet
Beiträge: 26
Registriert: 05.11.2006 22:01
Kontaktdaten:

Beitrag von johnnysnet »

Auf die Idee, bei MS etwas nachzuschauen, würde ich nie kommen.

Im Consolenmodus nämlich, da ist es auch kein Problem. Wenn ich da Print(Chr(218)) schreibe, erhalte ich mein gewünschtes Zeichen, deshalb wundere ich mich, warum es nicht auch mit DrawText im Fenster oder bei Gadgets geht.
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag von Andreas »

Scheinbar hast Du nicht den richtigen Font erwischt ?

Code: Alles auswählen

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
StartDrawing(WindowOutput(0))
DrawingFont(GetStockObject_(#OEM_FIXED_FONT))
FrontColor(RGB(255,0,0))
BackColor(0)
DrawText(20,8,Chr(191))
DrawText(10,22,Chr(192))
DrawText(20,22,Chr(217))
DrawText(10,8,Chr(218))
StopDrawing()
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    EndIf
  Until Quit = 1
EndIf
End
Gruss Andreas
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@Andreas

Code: Alles auswählen

DrawingFont(GetStockObject_(#OEM_FIXED_FONT))
erklärung?

tatsächlich kann ich in der zeichentabelle auswählen, ob er mir den
gewählten zeichensatz in DOS, WIN oder Unicode anzeigen soll.

und zwar denselben zeichensatz.
und in DOS-mode hat er den rahmen, in Unicode nicht.

anscheinend ändert dein API-aufruf das.
aber nicht den Font, sondern der Font-mode.


@johnnysnet
> Auf die Idee, bei MS etwas nachzuschauen, würde ich nie kommen.
...bitte an die sarkasmus-tags denken...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag von Andreas »

Kaeru Gaman hat geschrieben:@Andreas

Code: Alles auswählen

DrawingFont(GetStockObject_(#OEM_FIXED_FONT))
erklärung?

tatsächlich kann ich in der zeichentabelle auswählen, ob er mir den
gewählten zeichensatz in DOS, WIN oder Unicode anzeigen soll.

und zwar denselben zeichensatz.
und in DOS-mode hat er den rahmen, in Unicode nicht.

anscheinend ändert dein API-aufruf das.
aber nicht den Font, sondern der Font-mode.
GetStockObject_(#OEM_FIXED_FONT) gibt ein Handle auf den OEM/DOS Font zurück, mehr nicht.
Gruss Andreas
johnnysnet
Beiträge: 26
Registriert: 05.11.2006 22:01
Kontaktdaten:

Beitrag von johnnysnet »

@Andreas
Vielen Dank für dein Beispiel. So wie ich das verstehe, ist die Konstante #OEM_FIXED_FONT sozusagen wie eine FontID.
Scheinbar hast Du nicht den richtigen Font erwischt ?
Das stimmt, denn nachdem ich mir mal in der Zeichentabelle ein paar Fonts angesehen habe, musste ich feststellen, dass längst nicht alle diese Rahmensymbole enthalten. Für mein Programm möchte ich die Schrift "Terminal" nutzen und tatsächlich funktioniert es mit dieser. Doch die Frage ist für mich noch nicht entgültig geklärt, denn auch die Schrift "Courier New" enthält diese Symbole nur bei dieser bekomme ich sie nicht angezeigt. Ich kann nur vermuten, dass das damit zusammenhängt, wieviele Zeichen ein Zeichensatz enthält. Womöglich sind dann die Zeichen, welche nach der 255. Position liegen, auf diesem Wege nicht erreichbar.
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Ich habs umständlicher per Unicode gemacht:

DEAD PICTURE LINK
Zuletzt geändert von Leonhard am 31.07.2018 14:22, insgesamt 2-mal geändert.
johnnysnet
Beiträge: 26
Registriert: 05.11.2006 22:01
Kontaktdaten:

Beitrag von johnnysnet »

Nicht schlecht, es direkt in den Editor von PB einzugeben. Was auch immer ich versuche, mir gelingt dies nicht.

Wie auch immer, PB ist ohne Frage eine super Sache, aber: Das Arbeiten mit Fonts ist meiner Meinung nach noch nicht zufriedenstellend. Noch immer enthält die Font Library lediglich 4 Befehle/Funktionen. Für die Zukunft fände ich ganz wichtig eine Funktion zum Überprüfen, ob genau der angegebene Zeichensatz geladen wurde oder nicht. Nur zu wissen, dass irgendeiner geladen wurde, reicht nicht immer aus. Über die Möglichkeit, einen eigenen Bitmapfont zu erstellen, den man dann in sein Programm einbindet, habe ich auch schon nachgedacht, nur gibt es den großen Nachteil, dass die Handhabung desselben nicht so komfortabel ist, wie mit einem "echten" Font.
Zuletzt geändert von johnnysnet am 10.11.2006 17:26, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du kannst dir auch nen TrueType-Font selber erstellen, gibt werkzeuge dafür im Netz....

ich gebe dir recht, dass die arbeit mit Fonts etwas erleichtert werden könnte...
aber es ist tatsächlich relativ normal, dass irgendein zeichensatz geladen wird,
wenn der gewünschte nicht vorhanden ist.

erstelle mal ein Word-Dokument mit ziemlich speziellen Zeichensätzen,
und lade es dann auf einem rechner, der diese zeichensätze nicht hat...
...du wirst sehen, dass er das stur in einem halbwegs ähnlichen oder sogar in Arial anzeigt,
ohne dir die gerigste fehlermeldung zu poppen...

eigentlich arbeitet man auch nur mit eigenen fonts, wenn man die selbst erstellt hat und mitliefert.
wenn man irgendwelchen text auf fenstern darstellt, put man den sowieso meist in gadgets,
und diese beläßt man in der einstellung, wie der benutzer sein windows eben eingestellt hat.

und rahmen zeichnet man eigentlich unter benutzung von Box und Line,
und nicht per zusammenstückeln aus einzelnen chars,
außer man möchte ganz bewusst für irgendein game ein DOS-Pur-Feeling erzeugen.

schau dir mal so ein beispiel an:

Code: Alles auswählen

OpenWindow(0,0,0,200,200,"Rahmen-Demo",#PB_Window_ScreenCentered | #PB_Window_SystemMenu) 

StartDrawing(WindowOutput(0)) 
  Box(50,50,100,100,$802020)
  DrawingMode(4)
  Box(51,51,100,100,$401010)
  Box(49,49,100,100,$FF4040)
  Box(50,50,100,100,$C03030)
StopDrawing() 

Repeat 
Until WaitWindowEvent() = #PB_Event_CloseWindow
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten