SL9S9 Δημοσ. 30 Οκτωβρίου 2008 Δημοσ. 30 Οκτωβρίου 2008 Γεια σας, Θελω μια εφαρμογή να έρχεται στο προσκήνιο (πάνω από τα άλλα παραθυρα) σε συγκεκριμένες στιγμές. Οποτε απο ρουτίνα timer ( void __fastcall TFrmMakeKoup::butTimerClick(TObject *Sender) ) καλω διαφορες εντολές αλλα καμιά ΔΕΝ δουλεύει: 1) Application->BringToFront(); 2) BringWindowToTop(FrmXXX->Handle); 3) Application->Active = true; Επίσης δεν λειτουργεί το: if (WindowState == wsMinimized) WindowState = wsNormal; Eπίσης έχω και browser και ενω στο delphi δουλευει σωστά το m_pWebBrowser->OleObject->Document->ParentWindow->ScrollTo(0,0); στη c++ builder 6 δεν! Υποπτευεται κανείς τι συμβαίνει;
fromaz Δημοσ. 30 Οκτωβρίου 2008 Δημοσ. 30 Οκτωβρίου 2008 Τι μου θύμησες... > TFormBorderStyle bs = BorderStyle; BorderStyle = bsToolWindow; SetWindowPos(Handle,HWND_TOPMOST,Left,Top,Width,Height,SWP_NOMOVE|SWP_NOSIZE); SetWindowPos(Handle,HWND_NOTOPMOST,Left,Top,Width,Height,SWP_NOMOVE|SWP_NOSIZE); BorderStyle = bs; Τα παραπάνω ισχύουν με την προϋπόθεση πως μιλάμε για ένα normal παράθυρο minimized από τον χρήστη στο TaskBar. Αν η φόρμα είναι hidden (πχ υπάρχει system tray icon), κλπ, τότε θέλει τα προαπαιτούμενα. Δεν το έχω δοκιμάσει σε Vista. Από XP και πίσω είναι ok.
Directx Δημοσ. 30 Οκτωβρίου 2008 Δημοσ. 30 Οκτωβρίου 2008 Αν θες να επαναφέρεις το βασικό παράθυρο (MainWindow) της εφαρμογής (ουσιαστικά όλη την εφαρμογή), τότε μπορείς απλά να χρησιμοποιήσεις την ρουτίνα «Application->Restore();» και ύστερα να ορίσεις το FormStyle σε «fsStayOnTop» (δεν συνιστάται η τροποποίηση κατά την εκτέλεση από το Documentation του C++ Builder –έχει τους λόγους του άλλα αν δεν παίζεις με customιες στο System Menu της φόρμας σου, είσαι ok..) ώστε το παράθυρο να παραμένει πάντοτε σε «πρώτο πλάνο» (top most) στο desktop. Με την βοήθεια του αντικειμένου (component) TApplicationEvents (βρίσκεται στην καρτέλα “Additionals”) μπορείς να ανιχνεύσεις πολύ εύκολα την κατάσταση της φόρμας σου χρησιμοποιώντας δυο events. Το πρώτο ονομάζεται OnMinimize και καλείται κάθε φορά που το κεντρικό παράθυρο της εφαρμογής σου ελαχιστοποιείται, ενώ το δεύτερο ονομάζεται OnRestore και καλείται κάθε φορά που το κεντρικό παράθυρο της εφαρμογής επανέρχεται (γίνεται Restore) – ανοίγει. Μπορείς με την βοήθεια αυτών των δυο TApplicationEvents να κανείς το εξής, καταρχήν τοποθετείς στην φόρμα σου ένα ανενεργό (όρισε την ιδιότητα Enabled σε false) Timer (πχ. Timer1), προσθέτοντας σε αυτό (το OnTimer event) τον παρακάτω κώδικα, ώστε η εφαρμογή μας να γίνει Restore όταν συμπληρωθεί ο απαιτούμενος χρόνος: > Application->Restore(); // Ask TApplication to do the main-form window restore FormStyle = fsStayOnTop;// Set FormStyle as top-most (not recommended on documentation) Μετά τοποθετείς ένα TApplicationEvents στην φόρμα και στο OnMinimize event του τοποθετείς τον παρακάτω κώδικα, ώστε όταν ελαχιστοποιείται η φόρμα (το πρόγραμμα) να ξεκινά η εκτέλεση του Timer μας: > // We are minimized, enable Timer1 Timer1->Enabled = true; Ύστερα στο OnRestore event του TApplicationEvents τοποθετείς τον παρακάτω κώδικα, ώστε όταν η φόρμα επανέλθει να απενεργοποιείται η εκτέλεση του Timer μας: > // We are restored, shutdown Timer1 Timer1->Enabled = false; Αν όλα πάνε καλά, ο C++ Builder 6 θα δημιουργήσει ένα εκτελέσιμο το οποίο όταν γίνεται minimize θα ενεργοποιεί έναν Timer ο οποίος θα κάνει restore την εφαρμογή ύστερα από το χρονικό διάστημα που επιθυμούμε, ύστερα ούσα η εφαρμογή restored θα κλείνει τον Timer μας. -- Μπορείς φυσικά να κλείσεις τον Timer απευθείας με κώδικα στο ίδιο το OnTimer event αλλά προτιμώ την χρήση του OnRestore event. * Αν ο χρήστης ανοίξει το system menu της φόρμα σου (πχ. δεξί κλικ στο task-bar button της) και ο χρόνος του Timer περάσει, το Timer μπλοκάρει, σταματά οπότε θα πρέπει να το κάνεις μόνος σου Restore και ξανά Minimize για να ξεκινήσει (φαίνεται bug της VCL μάλλον), δεν έχω να προτείνω κάτι (απλά να το έχεις υπόψη σου, είναι μια μικρή πιθανότητα) * Τώρα, η απευθείας χρήση Windows API εντολών που τροποποιούν την οπτική κατάσταση της φόρμας δεν προτείνονται καθώς η διαχείριση του Minimize / Maximize & Restore των VCL forms γίνεται αρκετά διαφορετικά, έτσι μπορείς να βρεθείς περίεργα μπλεγμένος (μια φόρμα που δεν ανταποκρίνονται τα πλήκτρα Ελαχιστοποίησης για παράδειγμα!) κτλ. –γιατί όλα αυτά; Διότι δεσπόζουσα θέση στο Minimize-Maximize-Restore παίζει η TApplication, ουσιαστικά ένα κρυφό παράθυρο που δεν το βλέπει κανένας «χρήστης» και αναλαμβάνει να διαχειρισθεί τα states του βασικού form κάθε VCL εφαρμογής με βάση τα μηνύματα που λαμβάνει από το λειτουργικό (αλλά αυτό είναι μια «άλλη» ιστορία). Καλή τύχη! Υ.Γ Σχετικά με το Browser control .. δεν μπορώ να προτείνω τίποτε, αν θυμάμαι καλά ο νεότερος IE φέρνει κάποιες ασυμβατότητες στο COM object του κτλ.. θα πρέπει να το ψάξεις ή να βρεις κάποια άλλη μέθοδος για Scrolling στο (απόλυτα) επιθυμητό σημείο (0, 0) –για ψάξε το Document interface, μπορεί να κάνει expose κάποιο άλλο procedure που να σε εξυπηρετεί εξίσου καλά..
SL9S9 Δημοσ. 30 Οκτωβρίου 2008 Μέλος Δημοσ. 30 Οκτωβρίου 2008 Λοιπόν η πρώτη λύση ΟΚ: TFormBorderStyle bs = BorderStyle; BorderStyle = bsToolWindow; SetWindowPos(Handle,HWND_TOPMOST,10,10,990,865, SWP_NOMOVE|SWP_NOSIZE); BorderStyle = bs; δουλεύει και μεσα από το event του timer, και κανει και restore οταν η εφαρμογή είναι minimized ενω αν δεν είναι παλι την βγαζει μπροστα. Αν βγαλω τα BorderStyle δεν κάνει restore οταν minimized. --- Παρατηρησα επίσης οτι τα XP λιγο μπερδεύονται: Πχ αν έχω notepad και η εφαρμογη μου βγει από πανω, το notepad βγαινει μπροστα αν το κανω κλικ στο caption ενω αν στο κειμενο ΔΕΝ κουνιέται! Αν ήταν Εxplorer ούτε με κλικ στο caption (σπανια πετυχε) δεν βγαινει μπροστα αλλα δεν με πειραζει καθολου. Απο το taskbar αν τα κανεις κλικ αλλαζουν. Του directx δεν τα δοκιμασα (σε κουρασα, πολλα εγραψες ) Ευχαριστω
fromaz Δημοσ. 30 Οκτωβρίου 2008 Δημοσ. 30 Οκτωβρίου 2008 Στον κώδικα που σου έδωσα είχα δύο γραμμές SetWindowPos. Αν εσύ έβαλες τη μία (αυτή που δείχνεις), εξηγούνται τα προβλήματα που αναφέρεις.
SL9S9 Δημοσ. 3 Νοεμβρίου 2008 Μέλος Δημοσ. 3 Νοεμβρίου 2008 Και με τις δύο γραμμες παλι το ιδιο συμβαινει ( το SP3 θα φταίει ) αλλα δεν με πειραζει καθολου. Αυτό οτι πρεπει να εχεις και τις δύο γραμμες το διαβασες ή είναι από δική σου εμπειρία;
fromaz Δημοσ. 3 Νοεμβρίου 2008 Δημοσ. 3 Νοεμβρίου 2008 Η λύση είναι δική μου πατέντα. Την είχα φτιάξει όταν χρειαζόμουν το ίδιο πράγμα και οτιδήποτε άλλο είχε αποτύχει. Γι αυτό σου έγραψα "τι μου θύμησες". Οι δυο γραμμές μη σου φαίνονται παράξενες, γιατί αν προσέξεις δεν είναι ίδιες. Με την πρώτη (TOPMOST), κάνουμε το παράθυρο sticky πάνω απ' όλα. Με τη δεύτερη το κάνουμε ξε-sticky (NOTOPMOST). Βασικά, οι 4 γραμμές κάνουν ότι πρέπει για να ξεγελάσουν το σύστημα, και μετά το ξεκάνουν, επαναφέρουν δηλαδή τη φόρμα ως ήταν.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.