kid4computer Δημοσ. 13 Νοεμβρίου 2008 Δημοσ. 13 Νοεμβρίου 2008 Αυτό που ρωτώ είναι αν γίνεται κάπως (με κανένα πρόγραμμα ή με άλλο τρόπο) να ανοίγεις με ένα GUI πρόγραμμα σε οποιδήποτε γλώσσα και μέσα σε αυτό (στο κέντρο εννοώ) να ετελείτε κανονικά ένα console application c++??? Εδώ βάζω μια επεξεργασμένη φωτογραφία (απο εμένα) το πως θελω να είναι αλλα και να σας δώσω να καταλάβετε τι θέλω:
Evgenios1 Δημοσ. 13 Νοεμβρίου 2008 Δημοσ. 13 Νοεμβρίου 2008 cmd.exe ειναι ψευδοDOS τα σιμπερασματα δικα σου
PCharon Δημοσ. 13 Νοεμβρίου 2008 Δημοσ. 13 Νοεμβρίου 2008 Άλλο ζήτησε. (και γίνεται αλλά δεν το έχω ψάξει να απαντήσω, πάντως kid4computer αν το κάνεις νομίζω πως θα γίνεται αλά "read only" και δεν θα μπορείς να γράφεις κιόλας όπως στο cmd.exe)
parsifal Δημοσ. 14 Νοεμβρίου 2008 Δημοσ. 14 Νοεμβρίου 2008 Εξαρτάται από το framework που χρησιμοποιείς. Ίσως να σου παρέχει κάτι έτοιμο γι' αυτήν τη δουλειά. Π.χ. σε GTK+ το οποίο γνωρίζω καλύτερα, γίνεται με GtkTextView και λίγη χαμαλοδουλειά. Η GNOME library έχει έτοιμο ένα widget, το VteTerminal, γλυτώνοντάς σε και από αυτήν τη λίγη χαμαλοδουλειά (και αυξάνοντας τα dependencies συγχρόνως ) Από το screenshot βλέπω ότι θέλεις λύση σε Windows περιβάλλον, οπότε αυτά που αναφέρω παραπάνω λίγο θα σου χρησιμέψουν. Πες μας με ποιο framework/toolkit φτιάχνεις το GUI σου, για να πάρεις πιο συγκεκριμένη απάντηση.
Directx Δημοσ. 14 Νοεμβρίου 2008 Δημοσ. 14 Νοεμβρίου 2008 Αυτό που ζητάς είναι μια ιδιαίτερη περίπτωση, μια γρήγορη σκέψη είναι η δημιουργία ενός Console παραθύρου εντός μιας GUI διεργασίας και ύστερα η επαφή μεταξύ των δυο αυτών κόσμων με την βοήθεια του Console και Windows API ώστε να δώσεις στον χρήστη την εντύπωση της κοινής σχέσης μεταξύ τους. Ο παρακάτω κώδικας είναι γραμμένος σε C++ Builder και βασίζεται στο Windows API και την VCL. Το τρικ που κάνει είναι σχετικά απλό, υπάρχουν φυσικά μειονεκτήματα αλλά μου φάνηκε ένα ενδιαφέρον concept. Τι κάνουμε, λοιπόν. 1ον) Δημιουργούμε μια κονσόλα (AllocConsole) και αποθηκεύουμε το HWND της με την βοήθεια της GetConsoleWindow για μελλοντική χρήση. 2ον) Δημιουργούμε ένα Timer το οποίο κάθε N ms ελέγχει την κατάσταση του παράθυρου της κονσόλας ώστε να προσαρμόζει το GUI μας σε αυτήν. Ακολουθεί κώδικας με αναλυτικά σχόλια κάθε φάσης. Αυτός ο κώδικας μπαίνει στον Constructor της TForm μας: > /* * Ελέγχουμε την κατάσταση του hwndCON: * - Εάν είναι minimized (IsIconic) τότε κρύβουμε την φόρμα μας (Hide) * - Εαν δεν είναι minimized τότε παρουσιάζουμε (Show) την φόρμα μας αν είναι κρυμένη (!Visible) * - Εάν είναι maximized (IsZoomed) τότε επιτρέπουμε την ελεύθερη μετακίνηση της φόρμας μας */ if(IsIconic(hwndCON)) Hide(); else if(!Visible) Show(); if(IsZoomed(hwndCON)) { if(!Visible) Show(); /* * - Σε περίπτωση maximized μετατρέπουμε το παράθυρο πάντα σε πρώτο πλάνο (HWND_TOPMOST) * υπό φυσιολογικές συνθήκες (GUI) είναι αποδεκτή λύση, αλλά για την κονσόλα όπου το * παράθυρο αν και maximized μπορεί να μην καταλαμβάνει την οθόνη είναι λιγότερο * ικανοποιητικό. */ SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW); return; } /* * - Εάν το hwndCON είναι σε πρώτο πλάνο (GetForegroundWindow) τότε εξασφάλισε πως * και η φόρμα μας θα είναι σε πρώτο πλάνο επίσης με την προυπόθεση ότι το παράθυρο * δεν θα γίνεται Focused (για αυτό και η SetWindowPos με SWP_NOACTIVATE αντό της * απλής SetForegroundWindow). */ if(GetForegroundWindow() == hwndCON) SetWindowPos(Handle, hwndCON, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW); /* * - Σε κάθε άλλη περίπτωση τοποθετούμε την φόρμα μας στην πάνω αριστερή πλευρά της Console * (GetWindowRect, Left, Top). */ TRect rcCON; if(GetWindowRect(hwndCON, &rcCON)) { Left = rcCON.Left - Width; Top = rcCON.Top; } Ακολουθεί ένα screenshot για το οπτικό αποτέλεσμα του παραπάνω πειράματος: Φυσικά αν έχεις κέφι μπορείς να δοκιμάσεις ακόμα και in-placement του Console παραθύρου στο GUI της εφαρμογής σου, όμως δεν είναι εύκολη διαδικασία, η Console έχει ιδιαιτερότητες για να πετύχεις κάποια βασικά πράγματα μαζί της (τουλάχιστον από GUI process -> σε Console). Αν τώρα θέλεις απλά να τοποθετείς ένα GUI γύρο από κάποιο (οποιοδήποτε) Console program, τα πράγματα είναι περίπου όπως και παραπάνω, απλά θα πρέπει να βρεις το Console HWND, αντί του GetConsoleWindow μπορείς να δοκιμάσεις την FindWindow (ώστε να βρεις το HWND του console application) για παράδειγμα και ύστερα να προσαρμόζεις το GUI παράθυρο πάνω σε αυτό του Console παραθύρου (η λογική είναι +/- κοινή με τα παραπάνω, ειδικά για το placement του GUI σου προς το Console window). Καλή τύχη! Υ.Γ. Ο κώδικας έχει αδυναμίες επίσης δεν ασχολούμαι με την επαφή από πλευράς GUI προς την κονσόλα, όμως μπορεί να αποτελέσει έναυσμα για κάτι σαφώς καλύτερο και με προοπτικές να δουλέψει σε πραγματικά σενάρια χρήσης. Τέλος το τρικ μπορεί να γίνει και αντίστροφα από Console σε GUI (μάλλον είναι καλύτερη λύση για διάφορους λόγους) αλλά χρειάζεται περισσότερο χρόνο που δεν διαθέτω αυτή την στιγμή.
kid4computer Δημοσ. 14 Νοεμβρίου 2008 Μέλος Δημοσ. 14 Νοεμβρίου 2008 Ευχαριστώ πολύ για τις απαντήσεις σας!! Το θέμα είναι πως δεν θέλω να κάνει edit στο πρόγραμμα. Το μόνο που θέλω είναι ένα εξωτερικό παράθυρο που θα υπάρχει γύρω γύρω απο το console application. Ακόμα ξέρω μόνο c++ console application και δεν έχω χρόνο για να ασχολειθώ με GUI. Ακόμα χρησιμοποιώ το DEV C++.
Directx Δημοσ. 14 Νοεμβρίου 2008 Δημοσ. 14 Νοεμβρίου 2008 Ευχαριστώ πολύ για τις απαντήσεις σας!! Το θέμα είναι πως δεν θέλω να κάνει edit στο πρόγραμμα. Το μόνο που θέλω είναι ένα εξωτερικό παράθυρο που θα υπάρχει γύρω γύρω απο το console application. Ακόμα ξέρω μόνο c++ console application και δεν έχω χρόνο για να ασχολειθώ με GUI. Ακόμα χρησιμοποιώ το DEV C++. Σε αυτή την περίπτωση μπορείς να βρεις το παράθυρο κάθε εφαρμογής με την βοήθεια της FindWindow και ύστερα να προσαρμόσεις το δικό σου παράθυρο επάνω της όπως κρίνεις καλύτερα με την βοήθεια του κώδικα που έχω αναρτήσει ή κάποιου άλλου που κάνει παρόμοια δουλεία. Δεν θα υπεισέλθω σε άλλες λεπτομέρειες σχετικά με τον τρόπο φορτώματος του console προγράμματος που θες (από WinExec ως CreateProcess –καλύτερη η δεύτερη διότι απλοποιεί τον εντοπισμό του console window) διότι όλα αυτά προϋποθέτουν ότι γνωρίζεις Windows API προγραμματισμό με τον οποίο δεν έχεις εξοικείωση ακόμη.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.