|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 29.06.2005, 22:56 Titel: Edit Fenster (WinAPI) mit mehreren zeilen |
|
|
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 |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 30.06.2005, 14:12 Titel: |
|
|
licer hat Folgendes geschrieben: |
Sin und zweck soll sein: Eine Kasse
|
Doch nicht etwa die aktuelle Aufgabe des Programierwettbewerbs ?
jb |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 30.06.2005, 16:15 Titel: |
|
|
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.
Das einzige, was in dieser Hinsicht nicht beim Wb. erlaubt ist, ist, das Programm zuvor von der Forengemeinde testen zu lassen o.ä. Solange sich die Fragen auf das programmiertechnische Problem beziehen und nicht lauten "Wie schreib ich eine Kassensoftware?" haben wir da nichts gegen.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 30.06.2005, 18:18 Titel: |
|
|
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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 04.07.2005, 09:01 Titel: |
|
|
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 |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 04.07.2005, 14:35 Titel: |
|
|
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 _________________ 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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 07.07.2005, 18:48 Titel: |
|
|
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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 07.07.2005, 19:41 Titel: |
|
|
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 |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 08.07.2005, 16:10 Titel: |
|
|
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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 10.07.2005, 23:38 Titel: |
|
|
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 |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 11.07.2005, 11:42 Titel: |
|
|
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 |
|
|
|
|
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.
|
|