Wordpad.exe-Fenster einbinden anstelle EditorGadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Wordpad.exe-Fenster einbinden anstelle EditorGadget

Beitrag von Eckhard.S »

Hallo Leute!

Ich melde mich zurück als stolzer Besitzer einer Vollversion :allright:
Es geht um mein Übersetzungsprogramm von Esperanto nach Deutsch.

Fenster 1: Text wird in Esperanto eingegeben oder einkopiert
Button drücken (übersetze)
Fenster 2: Text wird übersetzt in Deutsch ausgegeben.

Lässt sich folgende Idee realisieren:

Das PB-Programm hat selbst keine EditorGadgets, sondern nur einen Button und ist sozusagen ein Verwaltungsprogramm von zwei externen WordPad-Fenstern. PB öffnet zweimal WordPad.exe. Schreibt man in WordPad1 einen Text und drückt den Button, so wird dieser Text (bzw die Übersetzung) in das WordPad2 ausgegeben.

Ich sehe darin den sehr großen Vorteil, dass man frei verschiebbare Fenster hat, wo sich die Zeilenumbrüche usw. von alleine klären, egal wie groß man das jeweilige Fenster zieht. Jedes Fenster kann bequem zum Vollbild maximiert werden.

Geht so etwas? Kann man as fremden Wordpad-Fenster lesen und in diese schreiben? Gibt es Codeschnipsel dazu? Ist die Idee gut?
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag von Alves »

Also ich würde zwei ToolWindows von dir nehmen, mit Editorgadgets.

Die kann auch mit automatischen Zeilenumbrüchen versehen, zur Not kann ich Source geben.
Und freim esizebar ist doch selbstverständlich beim modernen Programmierer!

Also, fallst du Hilfe brauchst, melden!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Wordpad fensteuern halte ich für keine so gute Idee (wird wohl auch nicht
einfach sein, bzw. ist bei vielen auch garnicht erst installiert), lieber 2
EditorGadgets in einem Splitter, 2 Fenster sind auch unpraktisch.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Danke für die Vorschläge! Da die Texte auch größer werden können, wären seperate Fenster nicht schlecht, die man maximieren kann.

Vielleicht eines nach dem anderen.

Wie kann ich einen automatischen Zeilenumbruch machen, egal wie groß das Fenster ist.

Code: Alles auswählen

;PureBasic 4.0 Final 

Prototype SendMessage(hwnd,msg,wParam,lParam) 
OpenLibrary(0,"User32.dll") 
Global SendMessage_.SendMessage = GetFunction(0,"SendMessageA") 



; ************* Variables ************* 

Fensterueberschrift$ = "Unicode-Test" 
Button_1     = 20   ; Button-ID 
                                                      
Global FontID1 
FontID1 = LoadFont(1, "Courier", 10)    ; Font für die Darstellung 

;RTF- Test 
text$="{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fmodern\fprq1\fcharset0 Courier New;}{\f1\fswiss\fprq2\fcharset0 Arial;}}" 
text$=text$ + "{\colortbl ;\red0\green0\blue0;}" 
text$=text$ + "\viewkind4\uc1\pard\ltrpar\cf1\f0\fs20 Unicode: \u264?\u284?\u292?\u308?\u348?\u364?\u265?\u285?\u293?\u309?\u349?\u365? \u264?\u284?\u292?\u308?\u348?\u364?\u265?\u285?\u293?\u309?\u349?\u365? \u264?\u284?\u292?\u308?\u348?\u364?\u265?\u285?\u293?\u309?\u349?\u365? \u264?\u284?\u292?\u308?\u348?\u364?\u265?\u285?\u293?\u309?\u349?\u365? \u264?\u284?\u292?\u308?\u348?\u364?\u265?\u285?\u293?\u309?\u349?\u365? \u264?\u284?\u292?\u308?\u348?\u364?\u265?\u285?\u293?\u309?\u349?\u365?\cf0\f1\par " 
text$=text$ + "}" 

#WM_SETTEXT     = 12 
#SF_RTF         = 2 
#EM_STREAMOUT   = 1098 

CompilerIf Defined(EDITSTREAM,#PB_Structure) = 0 
  Structure EDITSTREAM 
    dwCookie.l 
    dwError.l 
    pfnCallback.l 
  EndStructure 
CompilerEndIf 

; ************* Mainprogram ************* 

Procedure StreamOut(dwCookie,pbBuff,cb,*pcb) 
  SetGadgetText(dwCookie,PeekS(pbBuff)) 
EndProcedure 

If OpenWindow(0, 1, 1, 800, 350, Fensterueberschrift$,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) 
  SetWindowColor(0,RGB(100, 150, 100)) 
  CreateGadgetList(WindowID(0)) 
  EditorGadget(1, 20, 50, 650, 110)  ;#PB_Editor_ReadOnly 
  SetGadgetFont(1, FontID1) 
  EditorGadget(2, 20, 160, 650, 110);#PB_Editor_ReadOnly 
  SetGadgetFont(2, FontID1) 
  ButtonGadget(Button_1, 650+25, 130, 100, 20, "Copy") 
  SetGadgetText(1, text$)      
  
  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        Break 
        
      Case #PB_Event_Gadget 
        Select EventGadget() 
          
          Case Button_1 
            Stream.EDITSTREAM 
            Stream\dwCookie    = 2 
            Stream\pfnCallback = @StreamOut() 
            SendMessage_(GadgetID(1), #EM_STREAMOUT, #SF_RTF, @Stream)            
            
            
            
        EndSelect 
        
    EndSelect 
  ForEver 
  
EndIf ; Open Window 

End
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Ich melde mich zurück als stolzer Besitzer einer Vollversion

Glückwunsch! :D

> Wie kann ich einen automatischen Zeilenumbruch machen, egal wie
> groß das Fenster ist.

http://www.purebasic.fr/german/viewtopic.php?t=5339

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Danke, Kiffi! Das klappt! :allright:
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Eckhard.S hat geschrieben:

Code: Alles auswählen

;PureBasic 4.0 Final 

Prototype SendMessage(hwnd,msg,wParam,lParam) 
OpenLibrary(0,"User32.dll") 
Global SendMessage_.SendMessage = GetFunction(0,"SendMessageA") 
Das brauchste nicht mehr :wink:

// Nachtrag:
unter http://www.purebasic.fr/german/viewtopic.php?t=9190
findest Du das Include-Pack. Darin befindet sich unter:
Macros
-- RichEdit_Macro.pbi
eine Include-Datei (erstellt von Flype), die so ziemlich alles enthält, was für das RichtEdit benötigt wird.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Nur so als Vorschlag: Wenn du mehrere Fenster brauchst,wie wäre es dann mit MDI-gadgets?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Der MDI-Gadget-Vorschlag ist prima, AND51. Das werde ich mir mal noch genauer ansehen.

Danke ts-soft für den Hinweis auf das Include-Pack. Das ist ja ein richtiges Schlachtschiff :-)
Mittlerweile habe ich ausprobiert, dass Win98 mit RTF anscheinend nicht umgehen kann. Dort wird im Fenster dann der RTF-Sourcetext angezeigt. Und Unicode gibt es dort ja dort auch noch nicht. Daher möchte ich möglichst schnell den Text in Ascii wandeln, falls er (unter XP oder 2000) unicode enthält. Den Code hierfür habe ich schon geschrieben (anbei).

Den Prototype (Demo-Version) habe ich entfernt. Edel schrieb aber, dass die EDITSTREAM-Geschichte nur bei kurzen Texten geht, wenn ich das richtig verstanden habe. Mit der Vollversion geht es wahrscheinlich ganz einfach, aber ich habe etwas den Überblick verloren. Kannst du mir eine Hilfe geben bzw. den Code abändern?

Code: Alles auswählen

;Prototype SendMessage(hwnd,msg,wParam,lParam) 
;OpenLibrary(0,"User32.dll") 
;Global SendMessage_.SendMessage = GetFunction(0,"SendMessageA") 


;PB4 
; ************* Variables ************* 
Global a$
Fensterueberschrift$ = "Unicode-Test" 
Button_1     = 20   ; Button-ID 
                                                      
Global FontID1 
FontID1 = LoadFont(1, "Courier", 10)    ; Font für die Darstellung 

;RTF- Test 
text$="{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fmodern\fprq1\fcharset0 Courier New;}{\f1\fswiss\fprq2\fcharset0 Arial;}}" 
text$=text$ + "{\colortbl ;\red0\green0\blue0;}" 
text$=text$ + "\viewkind4\uc1\pard\ltrpar\cf1\f0\fs20 Unicode: \u264?\u284?\u292?\u308?\u348?\u364?\u265?\u285?\u293?\u309?\u349?\u365?\cf0\f1\par " 
text$=text$ + "}" 

#WM_SETTEXT     = 12 
#SF_RTF         = 2 
#EM_STREAMOUT   = 1098 

CompilerIf Defined(EDITSTREAM,#PB_Structure) = 0 
  Structure EDITSTREAM 
    dwCookie.l 
    dwError.l 
    pfnCallback.l 
  EndStructure 
CompilerEndIf 

; ************* Mainprogram ************* 

Procedure StreamOut(dwCookie,pbBuff,cb,*pcb) 
  SetGadgetText(dwCookie,PeekS(pbBuff)) 
  A$ = PeekS(pbBuff)  
EndProcedure 

If OpenWindow(0, 1, 1, 800, 350, Fensterueberschrift$,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) 
  SetWindowColor(0,RGB(100, 150, 100)) 
  CreateGadgetList(WindowID(0)) 
  EditorGadget(1, 20, 50, 650, 110)  ;#PB_Editor_ReadOnly 
  SetGadgetFont(1, FontID1) 
  EditorGadget(2, 20, 160, 650, 110);#PB_Editor_ReadOnly 
  SetGadgetFont(2, FontID1) 
  ButtonGadget(Button_1, 650+25, 130, 100, 20, "Copy") 
  SetGadgetText(1, text$)      
  
  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        Break 
        
      Case #PB_Event_Gadget 
        Select EventGadget() 
          
          Case Button_1 
            Stream.EDITSTREAM 
            Stream\dwCookie    = 2 
            Stream\pfnCallback = @StreamOut() 
            SendMessage_(GadgetID(1), #EM_STREAMOUT, #SF_RTF, @Stream)            
          
               A$ = ReplaceString(A$, "\u264?", "^C")  
               A$ = ReplaceString(A$, "\u284?", "^G")
               A$ = ReplaceString(A$, "\u292?", "^H")
               A$ = ReplaceString(A$, "\u308?", "^J")
               A$ = ReplaceString(A$, "\u348?", "^S")
               A$ = ReplaceString(A$, "\u364?", "^U")
               A$ = ReplaceString(A$, "\u265?", "^c")
               A$ = ReplaceString(A$, "\u285?", "^g")
               A$ = ReplaceString(A$, "\u293?", "^h")
               A$ = ReplaceString(A$, "\u309?", "^j")
               A$ = ReplaceString(A$, "\u349?", "^s") 
               A$ = ReplaceString(A$, "\u365?", "^u") 
        Debug A$       
        SetGadgetText(2, A$)
        A$ = GetGadgetText(2)
        Debug A$ 
            
        EndSelect 
        
    EndSelect 
  ForEver 
  
EndIf ; Open Window 

End
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

WordWrap mit Stringgadget

Beitrag von tmjuk »

Hallo,
ich habe in dem Programm, an dem ich gerade bastle WordWrap im Stringgadget folgendermaßen erzeugt ( mit PB 4.0 )

StringGadget(77,0,0,600,465,"",#ES_MULTILINE|#ES_AUTOVSCROLL|#WS_VSCROLL|#WS_HSCROLL|#ESB_DISABLE_LEFT|#ESB_DISABLE_RIGHT)

Außerdem hat man direkt das windowsübliche Kontextmenü zur Hand

Gruß
Torsten
Antworten