[c] Gadget-Posion im Windows-Fenster - Hilfe

Hi,

ich wieder :) So die GUI ist in meinen Programm mehr oder weniger eingebunden. Nun habe ich aber das Problem, das sobald eine weitere Zeile im Mehrzeiligen Edit-Gadget hinzukommt, ich den Text mitr SetWindowText neu übergeben muss. Genauer der Text wird wieder von oben an neu gezeigt jedes mal und man muss nach unten Scrollen um die neue Zeile überhaupt zu sehen. Also gibt es eine Möglichkeit die Zeilennummer zu bestimmen aber der Text im Sichtbaren Bereich ist? Oder zumindest das das ende des Textes im Sichtbaren bereich ist? Das man nicht nach unten sondern nach oben Scrollen muss ggf.
 
Das mit der Größeneinstellung kannst du in der OnSize-funktion machen, wenn du die MFC verwendest, ansonsten in Deiner Behandlungsroutine der WM_SIZE Nachricht. Beides natürlich im Elternfenster. Dann kannst Du die Größen der Kindfenster anpassen. Wie du eine Mindestgröße festlegts, kann ich dir leider nicht sagen. Da muß Dir jemand anderes weiterhelfen.
Was Dein Problem mit dem Editfeld angeht, da kannst Du evtl eine Listbox verwenden, da kannst Du einzelne Zeilen hinzufügen Wenn du trotzdem das Editfeld verwenden willst, dann kannst Du mit SetSel(...) bzw. der EM_SETSEL Nachricht das Ende (hinter dem letzten Zeichen) selektieren und dann die Selektion mit ReplaceSel bzw. der EM_REPLACESEL Nachricht ersetzen.
Leider kann ich Dir auch den Umgang mit den nachrichten nicht besser erklären, da ich eigentlich immer mit den MFC arbeite. Aber ich hoffe, das hilft Dir schonmal weiter. Es gibt ja noch ein paar Leute hier, die Dir das dann genauer erklären können.:)
 
jokey2 hat gesagt.:
Das mit der Größeneinstellung kannst du in der OnSize-funktion machen, wenn du die MFC verwendest, ansonsten in Deiner Behandlungsroutine der WM_SIZE Nachricht. Beides natürlich im Elternfenster. Dann kannst Du die Größen der Kindfenster anpassen. Wie du eine Mindestgröße festlegts, kann ich dir leider nicht sagen. Da muß Dir jemand anderes weiterhelfen.
Was Dein Problem mit dem Editfeld angeht, da kannst Du evtl eine Listbox verwenden, da kannst Du einzelne Zeilen hinzufügen Wenn du trotzdem das Editfeld verwenden willst, dann kannst Du mit SetSel(...) bzw. der EM_SETSEL Nachricht das Ende (hinter dem letzten Zeichen) selektieren und dann die Selektion mit ReplaceSel bzw. der EM_REPLACESEL Nachricht ersetzen.
Leider kann ich Dir auch den Umgang mit den nachrichten nicht besser erklären, da ich eigentlich immer mit den MFC arbeite. Aber ich hoffe, das hilft Dir schonmal weiter. Es gibt ja noch ein paar Leute hier, die Dir das dann genauer erklären können.:)

Was ist den die MFC nun schon Wieder? Bei meinen Kleinen Ausflug stellte ich fest das das anscheint nur 'Visual C++ unterstützt, da habe ich glaub ich keine Chance mit meinen Freeware Borlad. Welche Standarts gibt es den noch? Ich fürchte die GUI von der MSDN sieht immer so aus wie die GUI die ich bei anderen Programmen immer gehasst habe, also kein 3D Aussehen, die sieht aus wie im Mittelalter. Ich hoffe aber ich täusche mich.
 
Die MFC sind die Microsoft Foundation Classes, also logischerweise in der Borland-IDE nicht enthalten. Sie bieten C++-Wrapper-Klassen für die Windows Controls (so heißen die 'Gadgets' unter Windows :)), damit sie etwas leichter zu handhaben sein sollen. Haben aber andere Fallen ;-). Was das 3D-Aussehen angeht, so mußt Du glaube ich den entsprechenden Fensterstil setzen. Mit den MFC geht das mit Enable3DControls(), wie das im SDK geht, weiß ich nicht:(.
 
jokey2 hat gesagt.:
Die MFC sind die Microsoft Foundation Classes, also logischerweise in der Borland-IDE nicht enthalten. Sie bieten C++-Wrapper-Klassen für die Windows Controls (so heißen die 'Gadgets' unter Windows :)), damit sie etwas leichter zu handhaben sein sollen. Haben aber andere Fallen ;-). Was das 3D-Aussehen angeht, so mußt Du glaube ich den entsprechenden Fensterstil setzen. Mit den MFC geht das mit Enable3DControls(), wie das im SDK geht, weiß ich nicht:(.

Visual ist mir zu Teuer, obwohl ich nicht Weiss wie der Preis nochmal war. Ich habe sogar ein "Buch" eher nur ne CD "Visual C++ in 21 Tagen" da war ne 30Tage Demo von Visual C++ drauf, Hat mir glaub ich 50Euro gekostet damals. Als ich dann sah das das Orginal glaub min 1500Euro kostet habe ich es wieder aufgegeben zumal ich mit den "Klick dir dein Programm zusammen" nicht zurecht kam.

Ich habe jetzt glaub ich für mein Scroll Problem was passendes gefunden Edit_Scroll(); das soll so viel ich weiss für Editboxen sein, man muss dazu aber noch die windowsx.h laden. Nur komme ich damit nicht zurecht, zumal ich zugegeben mich mit diesen LPARAM und WPARAM noch nicht beschäftig habe. Mein Versuch damit endet immer mit einen Absturz. Ich kopiere mal den Relevaten Code hier zusammen.

Code:
static TCHAR *textadr; //Textadresse für Edit-Gadget
static HWND *hwndGTListe,*hwndGTStatus;
static WPARAM *wparamGTListe;
static LPARAM *lparamGTListe;
// Globale VariablenEnde

// WnDProc()
     hwndGTListe  = &hwndEdit;
     hwndGTStatus = &hwndStatus;
     wparamGTListe = &wParam;
     lparamGTListe = &lParam;
     switch (message)
     {
     case WM_CREATE :
	      hwndStatus = CreateWindow (TEXT ("static"), NULL,
                       WS_CHILD | WS_VISIBLE | WS_BORDER | SS_CENTER,
                       0,0,0,0,hwnd, (HMENU) ID_STATUS,
                       ((LPCREATESTRUCT) lParam) -> hInstance, NULL);
						           
          hwndEdit = CreateWindow (TEXT ("edit"), NULL,
                     WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER | 
                     ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY,
                     0,0,0,0,hwnd, (HMENU) ID_EDIT,
                     ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;             
          return 0 ;

// Textausgabe()
if(textadr>0)
  // Zeile an den Speicherblock (ggf. Alten Text) anhängen
  {strcpy(textadr+gesamtlaenge,newtext);
   gesamtlaenge+=laenge; // Neue gesamtlänge merken
   // Neuen Text im Listen-Gadget ausgeben
   SetWindowText (*hwndGTListe,textadr);
   // ************** Hier das Absturz-Problem **************************
   Edit_Scroll(*hwndGTListe,LOWORD(*wparamGTListe),HIWORD(*lparamGTListe));
  }

Hmm ich seh gerade Edit_Scroll ist in der MSND gar nicht dokumentiert, zumindest kann ich nix finden, ich habe den Befehl per zufall in den Includes gefunden.
 
Edit_Scroll ist ein Makro, das die EM_LINESCROLL Message verwendet.

Als WPARAM und LPARAM sollen da nur die Anzahl der Zeilen (LPARAM) bzw. der Zeichen horizontal (WPARAM) die gescrollt werden sollen eingesetzt werden.

Warum um Himmels Willen machst du da Pointer auf HWND? HWND ist einfach nur ein Handle (also wie eine Zahlen-Variable), da musst du nicht umständlich mit &- und *-Operatoren arbeiten.

Da du bei Edit_Scroll leider nicht die absolute Scroll-Position angeben kannst, sondern nur die relative, würde ich da auf WM_VSCROLL zugreifen:

SendMessage( hwndEdit, WM_VSCROLL, SB_BOTTOM, 0 );

Das scrollt deine Edit bis zum Anschlag nach unten.
 
Cusco hat gesagt.:
Visual ist mir zu Teuer, obwohl ich nicht Weiss wie der Preis nochmal war. Ich habe sogar ein "Buch" eher nur ne CD "Visual C++ in 21 Tagen" da war ne 30Tage Demo von Visual C++ drauf, Hat mir glaub ich 50Euro gekostet damals. Als ich dann sah das das Orginal glaub min 1500Euro kostet habe ich es wieder aufgegeben zumal ich mit den "Klick dir dein Programm zusammen" nicht zurecht kam.

Hallo Cusco,

GUI-Programmierung ausschließlich mit der Windows API zu machen ist meiner Meinung nach ziemlich umständlich, man programmiert sich schlichtweg einen Wolf :) Die Unterstützung durch eine Klassenbibliothek macht das Entwickeln sehr viel effizienter.

Vielleicht solltest du hier mal einen Blick drauf werfen: Visual Studio Express
So wie Microsoft das schreibt, gibt's diese Entwicklungsumgebung kostenlos.

Gruß
MCoder
 
Endurion hat gesagt.:
Edit_Scroll ist ein Makro, das die EM_LINESCROLL Message verwendet.

Als WPARAM und LPARAM sollen da nur die Anzahl der Zeilen (LPARAM) bzw. der Zeichen horizontal (WPARAM) die gescrollt werden sollen eingesetzt werden.

Warum um Himmels Willen machst du da Pointer auf HWND? HWND ist einfach nur ein Handle (also wie eine Zahlen-Variable), da musst du nicht umständlich mit &- und *-Operatoren arbeiten..

Ganz Einfach der HWND ist ein Globaler Pointer der auf eine Static HWND der WndProc-Funktion zeigt, ich habe keine Lust das Ding immer von Funktion zu Funktion zu übertragen. Gut nun hätte ich natürlich auch den HWND gleich Global machen können aber das viel mir in dem Moment nicht ein. :(

Endurion hat gesagt.:
Da du bei Edit_Scroll leider nicht die absolute Scroll-Position angeben kannst, sondern nur die relative, würde ich da auf WM_VSCROLL zugreifen:

SendMessage( hwndEdit, WM_VSCROLL, SB_BOTTOM, 0 );

Das scrollt deine Edit bis zum Anschlag nach unten.

Aha Danke, ich dachte die Messages sind nur Readonly, wuste von SendMessage noch nix.
 
MCoder hat gesagt.:
Hallo Cusco,

GUI-Programmierung ausschließlich mit der Windows API zu machen ist meiner Meinung nach ziemlich umständlich, man programmiert sich schlichtweg einen Wolf :) Die Unterstützung durch eine Klassenbibliothek macht das Entwickeln sehr viel effizienter.

Vielleicht solltest du hier mal einen Blick drauf werfen: Visual Studio Express
So wie Microsoft das schreibt, gibt's diese Entwicklungsumgebung kostenlos.

Gruß
MCoder

Bin gerade am Saugen :) 400Mb :rolleyes: 110 bisher übertragen
 
Dann nicht vergessen, das Platform SDK zu ziehen (für reine Win32 Anwendungen) benötigst du das noch.

Damit der Win32-Projekt-Wizard aktiviert wird, muss man nach Microsoft das machen:

"In Visual C++ Express, the Win32 Windows Application type is disabled in the Win32 Application Wizard. To enable that type, you need to edit the file AppSettings.htm file located in the folder “%ProgramFiles%\Microsoft Visual Studio 8\VC\VCWizards\AppWiz\Generic\Application\html\1033\".

In a text editor comment out lines 441 - 444 by putting a // in front of them as shown here:

// WIN_APP.disabled = true;
// WIN_APP_LABEL.disabled = true;
// DLL_APP.disabled = true;
// DLL_APP_LABEL.disabled = true;

Save and close the file and open Visual C++ Express. "
 

Neue Beiträge

Zurück