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

Cusco

Erfahrenes Mitglied
Hi,

ich versuche gerade eine GUI für mein Programm zu erstellen. Es soll ein Scrollbares Readonly-Text Feld und darunter eine Statusleiste Erscheinen. Nun bekomme ich die Gadgets aber nicht in Position, das Text-Feld erscheint über das ganze Fenster und von Status-Feld ist nix zu sehen. Es wird aber auch kein Fehler gemeldet, die Handler sind != NULL. Im Textfeld kann auch Text ausgegeben werden. Ich habe ein Bild angehangen wie es Momentan aussieht.

Edit: Das Bild wird nicht vom Forum gezeigt, habe es wieder gelöscht
Edit2: Habe es auf Webspace geladen hier der Link zum BIld

HIer der wichtige Code:

Code:
case WM_CREATE :
//cxChar = LOWORD(GetDialogBaseUnits());
cyChar = HIWORD(GetDialogBaseUnits());
	      
hwndStatus = CreateWindow (TEXT ("static"), NULL,
             WS_CHILD | WS_VISIBLE | SS_CENTER,
             0,
             GetSystemMetrics(SM_CYSCREEN)-(cyChar*2),
             GetSystemMetrics(SM_CXSCREEN),
             cyChar,
             hwnd, (HMENU) ID_STATUS,
             ((LPCREATESTRUCT) lParam) -> hInstance, NULL);
						 
if(hwndStatus==NULL)
  {int Fehler=GetLastError();
   TCHAR FehlerText[100];
   sprintf(FehlerText,TEXT("Status-HANDLER ist NULL!!\nERRORCODE: %i"),Fehler);
   InfoReq(TEXT("Fehler!!"),FehlerText);}
			
						 
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,
           GetSystemMetrics(SM_CXSCREEN),
           GetSystemMetrics(SM_CYSCREEN) - (cyChar*2),
           hwnd, (HMENU) ID_EDIT,
           ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
						 
if(hwndEdit==NULL)
  {int Fehler=GetLastError();
   TCHAR FehlerText[100];
   sprintf(FehlerText,TEXT("Edit HANDLER ist NULL!!\nERRORCODE: %i"),Fehler);
   InfoReq(TEXT("Fehler!!"),FehlerText);}
  else
  {AddTextZeile(hwndEdit,"Das ist ein Test\n");
   AddTextZeile(hwndEdit,"Das ist ein Test Nummer II\n");	
   AddTextZeile(hwndEdit,"Das ist ein Test Nummer III\n");}		 
         
return 0 ;

Noch was: Kann man bei Programmers-NotePad2 einstellen das er statt Tabs Leerzeichen einsetzen soll? Diese Ewigen Nach Korrkturen wenn man den Source wo anders haben will, z.B. hier im Forum, habe ich satt
 
Zuletzt bearbeitet:
Wenn ich das richtig sehe, dann erzeugst Du das Static-Fenster unterhalb des Bildschirmes. Die Bildschirmkoordinaten (0,0) bezeichnen die linke, obere Ecke des Bildschirmes und gehen positiv nach rechts bzw. unten.
Wieso nimmst du überhaupt die GetSystemMetrics-Funktion zur Ermittlung der Koordinaten? Die Koordinaten der Kindfensters eines Fensters beziehen sich soviel ich weiß auf das Elternfenster. Somit solltest du die Breite und Höhe des Elternfensters mit GetClientRect ermitteln und die Positionen der Kindfenster daran orientieren.
 
jokey2 hat gesagt.:
Wenn ich das richtig sehe, dann erzeugst Du das Static-Fenster unterhalb des Bildschirmes. Die Bildschirmkoordinaten (0,0) bezeichnen die linke, obere Ecke des Bildschirmes und gehen positiv nach rechts bzw. unten.
Wieso nimmst du überhaupt die GetSystemMetrics-Funktion zur Ermittlung der Koordinaten? Die Koordinaten der Kindfensters eines Fensters beziehen sich soviel ich weiß auf das Elternfenster. Somit solltest du die Breite und Höhe des Elternfensters mit GetClientRect ermitteln und die Positionen der Kindfenster daran orientieren.

Ich habe als Vorlage den PopPad Source aus dem Buch Windows-Programmierung genommen, da existiert nur das Edit-Gadget und geht über das ganze Fenster und da wird eben Metrics genutzt. Gut ich werde das gleich mal mit GetClientRect probieren. Aber übrigens kann ich Kordinaten einsetzen wie ich will, aber das Edit ersteckt sich immer über das Ganze Fenster, auch wenn ich z.B. 0,0,100,100 angebe. Ausserdem was ist ein Eltern und ein Kindfenster? Es ist doch nur ein Fenster oder sehe ich das Falsch? Ich habe übrigens den Fehler gemacht ca 300 Seiten vom Buch zu überspringen, werde ich aber ggf. nachholen.
 
Zuletzt bearbeitet:
Die 2 Fenster, welche du da mit CreateWindow(...) erzeugst, sind die Kindfenster, die innerhalb des Elternfensters liegen. Das Elternfenster ist das, dessen HANDLE Du in Deinen CreateWindow-Aufrufen mit 'hwnd' angibst. Unter Windows sind fast alle grafischen Elemente Fenster (Buttons, Editfelder, Statics, TreeControls, ...), d.h von CWnd abgeleitet.
 
jokey2 hat gesagt.:
Die 2 Fenster, welche du da mit CreateWindow(...) erzeugst, sind die Kindfenster, die innerhalb des Elternfensters liegen. Das Elternfenster ist das, dessen HANDLE Du in Deinen CreateWindow-Aufrufen mit 'hwnd' angibst. Unter Windows sind fast alle grafischen Elemente Fenster (Buttons, Editfelder, Statics, TreeControls, ...), d.h von CWnd abgeleitet.

Aha, habe mich auch schon gewundert warum CreateWindow für Windows und für Gadgets gleichermaßen gedacht ist, ausserdem muss ich mich jetzt erst mal umgewöhnen mit der Position-Berechnung, den auf dem Amiga war es immer x,y,width,height und nicht x,y,x2,y2 so wie es den anschein hat. Ausserdem war da ein Fenster ein eigener bereich und nicht nur einfach ne Position auf dem Bildschirm. Auf dem Amiga werden die Gadgets in C/C++ mit CreateGadget() an das Fenster gehangen, bzw in meinen Fall mit GTButton, GTListView, GTString, GTCheckBox usw. unter Amiblitz2.

Naja auf jeden Fall ezeugt mein Prog jetzt einen Absturz so bald ich h-(cyChar*2) rechne
beim Edit-Feld, ich weiss nicxht woran es liegen mag :(. Das Static-Feld dagegen wird richtig positioniert, so hat es zumindest den anschein.

Hier der jetzige Code:
Code:
case WM_CREATE :
      cyChar = HIWORD(GetDialogBaseUnits());
	  if (GetClientRect(hwnd,lpRect))
         { 
          w = lpRect->right;
          h = lpRect->bottom;
	      hwndStatus = CreateWindow (TEXT ("static"), NULL,
                       WS_CHILD | WS_VISIBLE | SS_CENTER,
                       0,
                       h-cyChar,
                       w,
                       cyChar,
                       hwnd, (HMENU) ID_STATUS,
                       ((LPCREATESTRUCT) lParam) -> hInstance, NULL);
						 
          if(hwndStatus==NULL)
            {int Fehler=GetLastError();
             TCHAR FehlerText[100];
             sprintf(FehlerText,TEXT("Status-HANDLER ist NULL!!\nERRORCODE: %i"),Fehler);
             InfoReq(TEXT("Fehler!!"),FehlerText);}
          
          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,
                     w,
                     h-(cyChar*2),
                     hwnd, (HMENU) ID_EDIT,
                     ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
						 
          if(hwndEdit==NULL)
            {int Fehler=GetLastError();
             TCHAR FehlerText[100];
             sprintf(FehlerText,TEXT("Edit HANDLER ist NULL!!\nERRORCODE: %i"),Fehler);
             InfoReq(TEXT("Fehler!!"),FehlerText);}
             else
            {AddTextZeile(hwndEdit,"Das ist ein Test\n");
             AddTextZeile(hwndEdit,"Das ist ein Test Nummer II\n");	
             AddTextZeile(hwndEdit,"Das ist ein Test Nummer III\n");}		 
             
         }
          return 0 ;
 
Ah, konnte ja nicht Funktionieren, da doch länge und breite Verwendet wird man also Right-Left und Bottom-Top rechnen muss. Und vor allem ich habe nicht gründlich genug gelesen, die Größe der Fenster wird nochmal unter MoveWindow() unter WM_Size gesetzt :rolleyes: Ich kann bei der Erstellung die Kordinaten also auf 0 lassen und Muss Sie erst Später mit Movewindow setzen.
 
Cusco hat gesagt.:
ausserdem muss ich mich jetzt erst mal umgewöhnen mit der Position-Berechnung, den auf dem Amiga war es immer x,y,width,height und nicht x,y,x2,y2 so wie es den anschein hat.

CreateWindow und MoveWindow nehmen beide jeweils x, y, width, height als Parameter für Fensterposition und Größe.

Anders ist das mit Funktionen die ein RECT ermitteln, wie z.B. GetWindowRect oder GetClientRect. In einem RECT steht immer die linke obere und die rechte untere Koordinate.
 
jsendrow hat gesagt.:
CreateWindow und MoveWindow nehmen beide jeweils x, y, width, height als Parameter für Fensterposition und Größe.

Anders ist das mit Funktionen die ein RECT ermitteln, wie z.B. GetWindowRect oder GetClientRect. In einem RECT steht immer die linke obere und die rechte untere Koordinate.

Ja gut ich habe mich getäuscht ist doch x,y,w,h wie auf dem Amiga, na zum Glück :)
Auf jeden Fall funktioniert die GUI jetz so wie ich sie mir vorstelle, vom Style der Gadget mal abgesehen. Gibt es noch andere Gadget ausser diesen? Ich könnte z.B: leider kein Cycelgadget in der MSND finden :( Und muss die GUI dauert neu abgefragt werden? Damit sich z.B: die Gadgets an eine Neue Fenstergröße anpassen? Dann bekomme ich ein Problem den mein Programm, kann nicht dauert darauf achten, ich muss mir noch bös überlegen wie ich die GUI da rein Quetsche.

EDIT: Kann igendwie die Min und Max größe eingestellt werden? Also die MIndestgröße und Maxgröße die der User das Fenster vergrößern und verkleinern darf. Bei mir ist das jetzt so das es auf die Titelleiste verkleinert und auf die Bildschirmgröße vergrößert werden kann. Ich möchte min eine MIngröße angeben damit die Gadgets auch noch was darstellen können.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück