Seite 1 von 2

Wordpad.exe-Fenster einbinden anstelle EditorGadget

Verfasst: 23.08.2006 08:56
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?

Verfasst: 23.08.2006 09:25
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!

Verfasst: 23.08.2006 09:35
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.

Verfasst: 23.08.2006 09:49
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

Verfasst: 23.08.2006 09:55
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

Verfasst: 23.08.2006 10:01
von Eckhard.S
Danke, Kiffi! Das klappt! :allright:

Verfasst: 23.08.2006 10:03
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.

Verfasst: 23.08.2006 14:56
von AND51
Nur so als Vorschlag: Wenn du mehrere Fenster brauchst,wie wäre es dann mit MDI-gadgets?

Verfasst: 23.08.2006 16:47
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

WordWrap mit Stringgadget

Verfasst: 23.08.2006 22:10
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