Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Edit Fenster (WinAPI) mit mehreren zeilen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 29.06.2005, 22:56    Titel: Edit Fenster (WinAPI) mit mehreren zeilen Antworten mit Zitat

Hi

Ich bräucht unbedingt mal hilfe zur winapi. Undzwar wollte ich einen string mit mehreren zeilen (zeilenumbruch mit chr$(13)) in ein editfenster (Ich bin auch für andere lösungen offen) schreiben. Bzw. das fenster auch wieder leeren können.
Meine Frage also: Welche eigenschaften braucht das editfenster und welche funktion nem ich um das fenster zu beschreiben bzw. wieder zu löschen.

Falls das jetzt total unverständlich war schreibt einfach nochma dann stell ich ma den code online.

Sin und zweck soll sein: Eine Kasse
am oberen rand sind die buttons fürs essen die dann auch den string generieren. Dieser string soll dann halt nurnoch dargestellt werden. Es soll auch möglich sein dinge wieder zu löschen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 30.06.2005, 14:12    Titel: Antworten mit Zitat

licer hat Folgendes geschrieben:

Sin und zweck soll sein: Eine Kasse

Doch nicht etwa die aktuelle Aufgabe des Programierwettbewerbs ? zwinkern

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 30.06.2005, 16:15    Titel: Antworten mit Zitat

Hallo.

Sich Hilfe für bestimmte Programmierschwierigkeiten zu holen ist auch beim Programmierwettbewerb völlig legitim. Ich denke, dass dies eine Frage für Dusky_Joe ist. Der hat ein Tutorial über das Handlen einer Windows-GUI mit FB geschrieben. lächeln
Das einzige, was in dieser Hinsicht nicht beim Wb. erlaubt ist, ist, das Programm zuvor von der Forengemeinde testen zu lassen o.ä. zwinkern Solange sich die Fragen auf das programmiertechnische Problem beziehen und nicht lauten "Wie schreib ich eine Kassensoftware?" haben wir da nichts gegen. lächeln

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 30.06.2005, 18:18    Titel: Antworten mit Zitat

Und wenn ich mal wieder Zeit finde, werde ich daran auch weiterschreiben.

nur zwei kleine Infos:
1. Die Aktuelle Version meines Tutorials ist auf dieser Adresse zu finden:
http://dhost.info/siteofkaos/freeBASIC/WIN-GUI_Grundlagen.html
Die Quellcodes beziehen sich aber noch auf FB v0.13b, siehe den Thread hier im Forum, was zu ändern ist.

2. Um Textboxen mit mehreren Zeilen zu erstellen, erstellst du einfach mit CreateWindow/CreateWindowEx ein Fenster der Klasse EDIT, und gibst als Klasse ES_MULTILINE an.
Damit du einen schönen Ramen drum rum bekommst, kannst du als ExStyle (nur mit CreateWindowEx) WS_EX_CLIENTEDGE.

Für weitere Fragen kann ich dir nur den Tipp von... ich glaube es war Peter Harder, könnte aber auch volta, ts-soft oder sonst wer gewesen sein (sorry)... weitergeben: Such mal mit google nach Win32.hlp und Download. Das Ding is ziemlich groß (unkomprimiert 20 MB, als ZIP vllt 5 MB), und enthält eine engl. Erklärung zu praktisch jedem Befehl, sowie eine volle Parameterliste zu den API-Funktionen.
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 04.07.2005, 09:01    Titel: Antworten mit Zitat

Das Tutorial hab ich schon gelesen. Ohne das hätte ich die WinApi ja so garnet verstanden.

Aber das Problem muss wohl doch woanders liegen. da der Code so lang is wollt ich ihn hier nicht ganz reinschreiben.

Das Programm besteht aus drei fenstern: Das Hauptfenster und zwei child fenstern (eins für die buttons der Ware eins für die anzeige der Kasse). Auf dem Kassenfenster sitzt das editfeld um das es geht. Durch drücken der Essenbuttons wird ein string generiert in essen().bon dessen ausgabe per messagebox auch funktoiniert.

Und hier der Problemteil

Code:
case WM_PAINT
           
               for i = 1 to essencount
                        with essen(i)
                            if .bon <> "" then
                                bon = bon + .bon + chr$(13)
                            end if
                        end with
                next
           
           
           
            hDC = BeginPaint( hedit, pnt )
            GetClientRect hedit, rct
           
            DrawText hDC, bon , -1, _
                     rct, null
           
            EndPaint hedit, pnt
               
            bon = ""   


hedit is in dem fall der Handle des editfensters (wer hätte das gedacht)
essencount ist die anzahl der waren.

Könnte das Problem daran liegen, dass ich alles über eine WndProc laufen lasse? Ist es immer nötig für jedes fenster eine Eigene eigene WndProc zu schreiben?


Wegen dem Programmierwettbewerb....

Das Programm is für die Gemeinde gedacht und erfüllt sowieso nicht die anforderungen des Wettbewerbs und ist somit keine Konkurenz (Es wirdauch garnicht erst dort landen).



Hab den Code jetzt auf NoPaste hochgeladen:

http://fb.exp-soft.de/fbnp/index.php?view=12
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 04.07.2005, 14:35    Titel: Antworten mit Zitat

Child-Windows lässt du i.d.R. immer vom selben WndProc behandeln, da die z.T. gar nicht umleitbar sind - EDITs, BUTTONs, ... sind Controls, die von Windows bereit gestellt werden. Die Klasse dazu gibtst du ja gar nicht an.

Was sein kann: Wenn du Child-Child-Fenster benutzt (Ein button in einem Frame z.B.), kommen die Nachrichten nicht mehr an...

Zu deinem Prog:
Ich denke, der Fehler liegt darin, dass du versuchst, auf das Edit zu zeichnen. Wenn du einfach nur einen Bereich brauchst, in dem Text angezeigt werden kann, versuch mal die Klasse STATIC, Style WHITEFRAME oder so was...
(Schau mal in der win32.hlp=>CreateWindows, wenn du sie schon runtergeladen hast... ist fast unverzichtbar beim proggen, du kannst dir kaum alles merken...)
Um Text in ein Edit zu schrieben gibt es eine eigene Funktion. Müsste SetWindowTitle o.ä. heißen. Denn der Fenstertitel ist bei Textboxen der Text, der in der Box steht.

(in der aktuellen Version müsste eh erklärt sein, wie man mit Textboxen umgeht... oder hab ich die V noch nicht hochgeladen?)



Schön, dass sich jemand mit dem Tut auseinander gesetzt hat zwinkern
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 07.07.2005, 18:48    Titel: Antworten mit Zitat

Ich hab jetzt folgendes herausgefunden

1. Man kann auch auf editfenster zeichnen den gezeichneten text allerding nicht editieren sondern nur überschreiben.

2. Ein Childfenster in einem Childfenster empfängt anscheinen wirklich keine messages mehr.

Nun wieder zum Programm:

änderungen unter http://fb.exp-soft.de/fbnp/index.php?view=17

Ich hab jetzt das Problem, dass auf dem Anzeigefenster nur gezeichnet wird, wenn man ein anderes fenster drüberschiebt.

Um den Fehler zu rekonstruieren also einfach mal ein paar buttons im oberen teil anklicken und dann mal die Konsole über das Anzeigefenster schieben. Wenn man es wieder wegschiebt.... siehe da es wurde gezeichnet.

Aber warum erst dann? Warum nicht gleich nach dem Buttondruck? [/url]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 07.07.2005, 19:41    Titel: Antworten mit Zitat

Hab noch ein bisschen herumgespielt und wenn ich nach einem Buttondruck

Code:

showwindow hwnd,sw_hide
showwindow hwnd,sw_normal


schreib dann wird alles so angezeigt wie ich es möchte. Aber es flimmert bei jedem buttondruck und is denk ich mal auch kein sauberer programmierstil. Ich habs auch schon mit redrawwindow und updatewindow versucht aber da tut sich nix.

Wie kann ich das denn anders lösen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 08.07.2005, 16:10    Titel: Antworten mit Zitat

Du benutzt deine Textbox - soweit ich das sehe - nur als Fläche, auf der du deinen Text ausgibst. Textboxen bieten aber sehr viel mehr möglichkeiten der Textbearbeitung. Das ist hier erklärt:

http://dhost.info/siteofkaos/freeBASIC/WIN-GUI_Grundlagen.html#04DetTxt

Anstatt
Code:
case WM_PAINT
           
               bon = ""
               
               for i = 1 to essencount
                        with essen(i)
                            if .bon <> "" then
                                bon = bon + .bon + chr$(13)
                            end if
                        end with
                next
           
           
           
            hDC = BeginPaint( hedit, pnt )
            GetClientRect hedit, rct
           
            DrawText hDC, bon , -1, _
                     rct, null
           
                       
            EndPaint hedit, pnt

Solltest du etwas in dieser Richtung hier machen:

Code:
               bon = ""
               for i = 1 to essencount
                        with essen(i)
                            if .bon <> "" then
                                bon = bon + .bon + chr$(13)
                            end if
                        end with
                next

               SetWindowText hEdit, bon


Wenn du zu späterem Zeitpunkt wissen willst, was in der Box steht, benutze GetWindowText:
Code:
Dim tmp As String * 16384 ' beliebige Länge, hier genau 16KB
GetWindowText hEdit, tmp, 16384


Alles klar?

Dann bis bald!
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 10.07.2005, 23:38    Titel: Antworten mit Zitat

Hab den Fehler jetzt gefunden

WM_Paint wird irgendwie nicht nach einem Buttondruck ausgeführt deswegen musste ich mit

Code:

dim rc as RECT
GetClientRect hWnd, rc      
InvalidateRect hWnd, rc, FALSE


WM_Paint erzwingen

@Dusky_Joe:

SetWindowText funktioniert soweit ich weiß nicht wenn man zeilenumbrüche mit chr$(13) in dem String hat und ich benutze dazu mitlerweile kein EDIT Fenster mehr da ein Normales fenster als Ausgabefenster ja auch seinen Zweck erfüllt. Trotzdem danke
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 11.07.2005, 11:42    Titel: Antworten mit Zitat

Kann sein, dass Edits ein CRLF brauchen, also CHR$(13) + CHR$(10).

However, schön, dass du eine Lösung gefunden hast.
Übrigens: Du scheinst dich ja etwas mit den Win-API-Funktionen auseinander zu setzen. Solltest du irgendwelche Tuts finden, bzw. Vorschläge haben, welche Themen erklärt werden sollten, schreib mir bitte!
Nach der Referenz werde ich (mit etwas Glück...) auch dafür mal wieder Zeit finden....
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz