MFC Fenster..



  • Hallo Leute,
    ich habe mir einfach ein MFC-Projekt angelegt..wie kann ich jetzt die größe meines fensters(habe ein dialog erstellt"IDD_SCANEDGE_DIALOG") mit hilfe von code einstellen??oder gibt s da einfach einen assistenten bei visual studio??kann mir einer mal sagen, wie ich den code und wo ich ihn einbinden muss??ich will s halt etwas größer oder kleiner machen, als s dann beim debuggen ist..wie geht dies??



  • Entweder du überschreibst PreCreateWindow deiner Dialogklasse oder du rufst MoveWindow oder eine ähnliche Funktion auf, bevor Du den Dialog anzeigst.



  • du könntest aber auch ganz einfach im resourceneditor deinen dialog anwählen und ihn mit der maus (ziehend) auf die gewünschte größe bringen.



  • Wie soll das denn gehen??also eine Funktion vor meinem Dialogaufruf machen und dann wie soll ich die gewünschte größe und die erstellten Buttons o-ä an die größe anpassen??



  • Hallo

    Du hast im Res.-editor doch den Dialog und du kannst diesen dort auf die gewünschte Größe bringen.

    chrische



  • ja ,wenn dies so einfach wäre.Ich kann nur eine bestimmte Größe im Res-editor machen.habe auch schon die Funktion ShowWindow(SW_MAX) benutzt. Die klappt ja ganz gut, er maximiert mir das fenster, jedoch die buttons, die ich eingebracht habe, werden irgendwo gesetzt. wie kann ich s machen, dass er mir die buttons genau dort setzt, wie ich sie vorher im res-editor hatte??



  • PiotreD schrieb:

    wie kann ich s machen, dass er mir die buttons genau dort setzt, wie ich sie vorher im res-editor hatte??

    Genau dort setzt das Programm doch deine Buttons hin (was etwas stören könnte ist die Tatsache, daß er die Position auf die linke obere Ecke des Fensters festhält). Wenn du die Buttons optisch ansprechend auf dem (nun etwas größeren) Fenster anordnen willst, solltest du OnSize() überschreiben und dort die per MoveWindow() die Buttons zurechtrücken.



  • Ja, wie kann ich dieses dann erstellen??einfach die funktion OnSize() aufrufen und dann mit MoveWindow() neue Date nerstellen oder wie??



  • Du gehst in den Klassenassistenten, wählst deine Dialogklasse und die Nachricht WM_SIZE und klickst auf "Funktion hinzufügen" - das legt dir deine OnSize() an:

    void CMyDlg::OnSize(UINT nType, int cx, int cy) 
    {
      CDialog::OnSize(nType, cx, cy);
    
      // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen
    }
    

    Hinter dem TODO-Kommentar kannst du dir die korrekte Position aller Dialog-Elemente berechnen und sie per MoveWindow() in die gewünschte Position verschieben, z.B.:

    CWnd* OK_Button = GetDlgItem(IDOK);
    CRect r;
    OK_Button->GetClientRect(r);
    int offx=dx-r.right-10;
    r.OffsetRect(offx,0);
    OK_Button->MoveWindow(r);
    


  • hey, dieser tip ist ja nicht schlecht.nur komischerweise funktioniert bei mir nix. habe dies so gemacht und auch die funktion in .h reingepackt, damit die erkannt wird.nur mein button, der bleibt immer an der gleichen stelle bzw. wird nicht vergrößert oder so.egal ob ich nun -5000 mache oder was anderes..der button bleibt an gleicher bzw. die größe bleibt gleich..muss ich irgendwo noch was ändern??oder warum klappt dies nicht..



  • Wie hast du das so gemacht? Und wo?

    Der Code zur Anpassung der Buttons gehört in die OnSize()-Methode, die dir der Klassenassistent auf Antrag automatisch anlegt (und du solltest den Klassenassistenten auch dafür bemühen - ist umeiniges entspannender als wenn du die Nachrichtenzuordnung von Hand einprogrammieren willst).



  • also ehrlich gesagt hat er schon eine "void CLLTScannenDlg::OnSize()" bei mir gehabt..dort habe ich einfach die sachen reingeschrieben..oder muss ich extra irgendwie über den assistenten vorgehen??wie muss ich dies im einzelnen tun..wo kann ich diese nachtrichten auswahl aussuchen??wenn ich beim projekt bin und dann hinzufügen mache von mfc-klasse, findet er meine dialogklasse nicht..komisch..



  • Hast du mal nachgesehen, ob die Funktion überhaupt aufgerufen wird (setz eine TRACE()-Anweisung oder einen Breakpoint in die Methode und starte das Programm)?

    Ansonsten solltest du natürlich die ID's deiner Buttons dort verwenden.



  • also, er ruft bei mir komischerweise die funktion nicht auf..habe dort nen breakpoint gemacht, aber da hält das programm nicht an..ist da irgendwie ein verweis nicht eingebunden??



  • Erstens: Ist CLLTScannenDlg überhaupt der Hauptdialog deines Projektes?
    Zweitens: Schau mal nach, ob in der Message-Map des Dialogs ein ON_SIZE() Eintrag steht.



  • also, CLLTScannen ist mein HD..das ist die erstellte mfc-oberfläche, wo die buttons drauf sind.Habe s gerade auch bemerkt, dass in der Messagge-Map die funktion gar nicht auftaucht..macht der assistent dies nicht automatisch??



  • Wenn du die Methode über den Klassenassistenten anlegst, kümmert er sich auch um solche Kleinigkeiten. Wenn du sie von Hand in die Klasse reinschreibst, bekommt der Assistent naturgemäß nichts davon mit.



  • also, ich habe s hinbekommen, dass mir die funktion angesprungen wird und ausgeführt..leider bekomme ich einen fehler mit dem ich nix anfangen kann..wieso ist dies so schwierig, einfach den vorhandenen button an eine andere position zu setzen??!!

    hier der fehler:der springt mir immer nur bis zu der zeile

    OK_Button->GetClientRect(r);
    

    und dann springt er mir in die afxwin2.inl und zeigt mir den fehler, dass eine zugriffsverletzung aufgetrete nist beim lesen..
    leider kann man hier keine .bmp einfügen, sonst würde ich die reinmachen..


Log in to reply