vasgen Δημοσ. 7 Απριλίου 2011 Δημοσ. 7 Απριλίου 2011 Καλησπέρα και πάλι, Έχω μια απορία, έχω δημίουργησει ένα απλό παράθυρο σε MFC C++ με ένα κουμπί και ένα editbox. Θέλω αυτά τα δύο να τα σύνδεσω δήλαδη όταν πατάω το κουμπί να εμφανίζεται στο edit box κάποιο όρισμα το οποίο του έχουμε περάσει μέσα στον κώδικα του κουμπιού. Το κουμπί μου έχει όνομα IDC_BUTTON1 και το edit box έχει όνομα IDC_EDIT1. Έχω προσθέσει έναν event_handler στο κουμπί που είναι για το έλεγχο έαν το κουμπί πατήθηκε! void CAboutDlg::OnBnClickedButton1() { ?????? } Τι θα πρέπει να γράψω μέσα στον Handler ώστε να μπορέσω να περάσω ένα μηνύμα στο edit box?? Ευχαριστώ εκ των προτέρων!!
warchief Δημοσ. 7 Απριλίου 2011 Δημοσ. 7 Απριλίου 2011 Ρίξε μια ματιά στο api της CEdit class στο msdn. Λογικά κάτι τέτοιο χρειάζεσαι
vasgen Δημοσ. 7 Απριλίου 2011 Μέλος Δημοσ. 7 Απριλίου 2011 Καλησπερα. Απο οτι ειδα στο API επρεπε να κανω κατι τετοιο void CEmotFaceDlg::OnBnClickedButton1() { IDC_EDIT1.SetCueBanner(_T("First, enter text here..."), TRUE); } Αν καταλαβα καλα.. Και να δηλωσω ενα header file στην αρχη #include <afxwin.h> .. Κανοντας τα αυτα και τρεχοντας το προγραμμα μου βγαζει το παρακατω μηνυμα λαθους οπου λεει.. c:\users\gennariv\documents\visual studio 2010\projects\emotface\emotface\emotfacedlg.cpp(163): error C2228: left of '.SetCueBanner' must have class/struct/union Εχετε καμια ιδεα..?? Γιατι οπως καταλαβατε παρα ειμαι αρχαριος..!!
warchief Δημοσ. 8 Απριλίου 2011 Δημοσ. 8 Απριλίου 2011 IDC_EDIT1.SetCueBanner(_T("First, enter text here..."), TRUE); Αρχικά προσπάθησε να καταλάβεις ειτε απο το MSDN ειτε απο σχετική βιβλιογραφία πως λειτουργεί το Document-View μοντέλο του MFC. IDC_EDIT1 ειναι το ονομα του View σου, η κλάση που υλοποιεί το View και μεσω της οποιας ελέγχεις και αλληλεπιδράς με αυτό ειναι η CEdit. Αρχικά ζήτα απο το MFC να σου δώσει access στο CEdit instance: > CEdit * editCtrl = reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT1)); editCtrl->SetCueBanner(_T("First, enter text here..."), TRUE); Διαβάζοντας λιγο το API λέει στην τρίτη παράγραφο: To set and retrieve text from a CEdit object, use the CWnd member functions SetWindowText and GetWindowText, which set or get the entire contents of an edit control Και σε παραπέμπει στα αντίστοιχα examples Αρα αυτο που θέλεις γίνεται ως: > CEdit * editCtrl = reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT1)); editCtrl->SetWindowText(_T("First, enter text here..."));
geo1st487 Δημοσ. 8 Απριλίου 2011 Δημοσ. 8 Απριλίου 2011 Αρα αυτο που θέλεις γίνεται ως: > CEdit * editCtrl = reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT1)); editCtrl->SetWindowText(_T("First, enter text here...")); Ολόκληρη ιστορία.
vasgen Δημοσ. 26 Απριλίου 2011 Μέλος Δημοσ. 26 Απριλίου 2011 Καλησπέρα και πάλι και χρόνια πολλά σε όλους!! Γνωρίζει κανείς έαν μπορώ να χρησιμοποιήσω ένα ccombobox μέσα σε ένα ctaskdialog παράθυρο. Δηλαδή όταν πατάω ένα κουμπί σε μια εφάρμογη, θέλω να μου εμφανίζεται ένα ctaskdialog παράθυρο όπου αυτό θα περίεχει ένα combobox με τους χρήστες μιας εφαρμόγης για παράδειγμα και θα μπόρω από εκεί να επιλέξω τον χρήστη που θέλω την κάθε φορά και μετά να πατω το κουμπι ΟΚ. Ευχαριστώ!!
vasgen Δημοσ. 28 Απριλίου 2011 Μέλος Δημοσ. 28 Απριλίου 2011 Επειδη λογικα δεν γνωριζει καποιος και επειδη και γω δεν βρηκα καποια απαντηση ψαχνωντας στο νετ, αποφασισα να χρησιμοποιήσω το combobox μεσα στο dialog based window της εφαρμογης μου και οχι σε ενα ctaskdialog παράθυρο .. Γνωριζει καποιος πως μπορω οταν ανοιγω την εφαρμογη μου να προσθετω στοιχεια μεσα στο combobox και αυτα να παραμενουν αποθηκευμενα μεσα στο combobox. Δηλαδη οταν ανοιγω παλι την εφαρμογη μου να υπαρχουν τα στοιχεια αποθηκευμενα, κατι σαν να αποθηκευω τα ονοματα των users που την χρησιμοποιουν!! Ευχαριστω και παλι!!
παπι Δημοσ. 29 Απριλίου 2011 Δημοσ. 29 Απριλίου 2011 Λογου οτι το MFC ειναι αρκετα περιεργο στη συνταξη (βλ. afx message maps), και δεν ειναι τιποτα αλλο απο εναν wrapper του win api. Θα σου ελεγα να ακολουθησεις ενα απο τα παρακατω: α) Διαβασεις κανα βιβλιο για MFC, κυριος τη φιλοσοφια. Συν msdn/mfc reference. β) Δοκιμασε winapi σκετο ή mixed με ATL
vasgen Δημοσ. 27 Μαΐου 2011 Μέλος Δημοσ. 27 Μαΐου 2011 Καλησπερα μετα απο καιρο παλι!! Εχω την εξης ερωτηση στο ιδιο project, εχω δημιουργησει μια απλη διεπαφη για την συνδεση σε μια συσκευη με connecτ, disconnect και αλλα διαφορα κουμπια χρησιμοποιοντας το SDK της συσκευης. Κανω κανονικα συνδεση με την συσκευη πατωντας το κουμπi connect και λαμβανω το σημα μου, ειναι μια συσκευη με αισθητηρια, αλλα το προβλημα μου ειναι οτι λογο του οτι το σημα λαμβανεται μεσα απο ενα while loop τα υπολοιπα κουμπια ειναι σαν να μην λειτουργουν δηλαδη οταν μπαινει μεσα στον βρογχο δεν μπορω να βγω να κανω για παραδειγμα disconnect απο την συσκευη. Τα κουμπια δεν μου ανταποκρινονται λογο του οτι τρεχει ο βρογχος ασταματητα..!! Γνωριζει καποιος τι θα μπορουσα να αλλαξω? Ευχαριστω..
παπι Δημοσ. 27 Μαΐου 2011 Δημοσ. 27 Μαΐου 2011 http://msdn.microsoft.com/en-us/library/975t8ks0(v=vs.71).aspx
V.I.Smirnov Δημοσ. 28 Μαΐου 2011 Δημοσ. 28 Μαΐου 2011 Yπάρχουν διάφοροι τρόποι να ξεπεράσεις την δυσκολία. O καλύτερος τρόπος είναι με mulithreading. Να κάποια βασικά σημεία που θυμάμαι: Θα βάλεις τον βρόγχο σε μια συνάρτηση, έστω ΤhreadProc() που θα εκτελείται παράλληλα με το υπόλοιπο της εφαρμογής. O class wizzard έχει την ΟnStartthread() γι' αυτήν τη δουλειά. (Βεβαιώσου ότι είναι επιλεγμένη η CThreadView στο Class Name). Εντός της ΟnStartthread() καλείς την AfxBeginThread() για να ξεκινήσει ένα νήμα που θα εκτελεί αυτή την συνάρτηση : AfxBeginThread(ProcName, param, priority); όπου - ProcName είναι το όνομα της συνάρτησης που περιέχει τον βρόγχο, - param είναι οπιαδήποτε 32 bit τιμή που τυχόν θέλεις να διοχετεύσεις στο νήμα - priority είναι η προτεραιότητα του νήματος που αναπαρίσταται από κάποιες προκαθορισμένες σταθερές. Π.χ. HWND hwnd_t=GetSafeHwnd(); AfxBeginThread(ThreadProc, hwnd,THREAD_PRORITY_NORMAL ); Αυτο καλεί την συνάρτηση ThreadProc() μέσα σε ένα νήμα. Όπως είπα, στην ThreadProc() θα υπάρχει ο βρόγχος σου. Το κυρίως πρόγραμμα μπορεί να επικοινωνεί με το νήμα μέσω καθολικών μεταβλητών. Μια καθολική μεταβλητή τίθεται ως διακόπτης : το νήμα την παρακολουθεί και αν π.χ. πατηθεί κάποιο πλήκτρο τερματίζει την λειτουργία του. Με το παραπάνω υπάρχει επικοινωνία από το κύριο πρόγραμμα στο νήμα. Το αντίστροφο, δηλ. από το νήμα στο κύριο πρόγραμμα, μπορεί να γίνει φτιάχνοντας ένα νέο μήνυμα, π.χ. const WM_USERMSG = WM_USER + 10; Η σταθερά WM_USER φέρει τον πρώτο διαθέσιμο αριθμό μηνύματος χρήστη. Aφού οριστεί το μήνυμα, καλείς την PostMessage() από το νήμα για να στείλεις το μήνυμα στο κύριο πρόγραμμα οποτεδήποτε χρειάζεται. Μια τέτοια κλήση είναι κάπως έτσι ::PostMessage( (ΗWND) param, WM_USERMSG , 0,0 ); Υπάρχουν κι' άλλες λετομέρειες πριν λειτουργήσει το όλο πράγμα - δεν τις θυμάμαι απ' έξω κι' έχω χρόνια να δω το MFC. Βρες κάπου ένα πλήρες αλλά απλό παράδειγμα και κάνε όμοια. Για την περίπτωσή σου δεν είναι πολύ δύσκολο. Το μόνο που χρειάζεσαι είναι η λειτουργία ενός νήματος που περιέχει τον βρόγχο και τρέχει παράλληλα με το υπόλοιπο πρόγραμμα. Πάντως με τα παραπάνω θα πάρεις κάποιες ιδέες για το πού να ψάξεις και να κινηθείς (αν το κάνεις έτσι βέβαια).... -
vasgen Δημοσ. 1 Ιουνίου 2011 Μέλος Δημοσ. 1 Ιουνίου 2011 Ευχαριστω για τις απαντησεις σας... Καταφερα να το λυσω το προβλημα μου.. Απο οτι ειδα υπαρχουν δυο ειδων Thread, τα Worker Threads και τα User Interface Threads. Εγω χρησιμοποιησα Worker Threads και εβαλα τον βρογχο που διαβασει το σημα και το γραφει στο αρχειο σε μια συναρτηση που ονομαζεται UINT Rundevice(LPVOID param) και την καλω μεσα απο το EventHandling του κουμπιου μου με το εξης καλεσμα AfxBeginThread(Rundevice,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);.. Αλλα μου προεκυψε ενα αλλο προβλημα και δεν μπορω να χρησιμοποιησω μεσα στην συναρτηση μου εντολες της MFC οπως MessageBox και DialogBox.. Γνωριζει καποιος τον λογο και το πως θα μπορουσα να το λυσω?? Ευχαριστω και παλι!!!
geo1st487 Δημοσ. 1 Ιουνίου 2011 Δημοσ. 1 Ιουνίου 2011 Θα βάλεις τον βρόγχο σε μια συνάρτηση, έστω ΤhreadProc() που θα εκτελείται παράλληλα με το υπόλοιπο της εφαρμογής. Οταν εκτελειται ενας βρογχος while η χρηση της cpu ανεβαινει στο 50% ή περισσότερο;
defacer Δημοσ. 1 Ιουνίου 2011 Δημοσ. 1 Ιουνίου 2011 Καλησπερα μετα απο καιρο παλι!! Εχω την εξης ερωτηση στο ιδιο project, εχω δημιουργησει μια απλη διεπαφη για την συνδεση σε μια συσκευη με connecτ, disconnect και αλλα διαφορα κουμπια χρησιμοποιοντας το SDK της συσκευης. Κανω κανονικα συνδεση με την συσκευη πατωντας το κουμπi connect και λαμβανω το σημα μου, ειναι μια συσκευη με αισθητηρια, αλλα το προβλημα μου ειναι οτι λογο του οτι το σημα λαμβανεται μεσα απο ενα while loop τα υπολοιπα κουμπια ειναι σαν να μην λειτουργουν δηλαδη οταν μπαινει μεσα στον βρογχο δεν μπορω να βγω να κανω για παραδειγμα disconnect απο την συσκευη. Τα κουμπια δεν μου ανταποκρινονται λογο του οτι τρεχει ο βρογχος ασταματητα..!! Γνωριζει καποιος τι θα μπορουσα να αλλαξω? Ευχαριστω.. Φίλε μου διάβασε αυτό από την αρχή μέχρι το τέλος (θα σου πάρει μέρες να το χωνέψεις). Μπορεί να είναι δεκαετίας, αλλά είναι ατόφιο χρυσάφι.
παπι Δημοσ. 2 Ιουνίου 2011 Δημοσ. 2 Ιουνίου 2011 Ευχαριστω για τις απαντησεις σας... Καταφερα να το λυσω το προβλημα μου.. Απο οτι ειδα υπαρχουν δυο ειδων Thread, τα Worker Threads και τα User Interface Threads. Εγω χρησιμοποιησα Worker Threads και εβαλα τον βρογχο που διαβασει το σημα και το γραφει στο αρχειο σε μια συναρτηση που ονομαζεται UINT Rundevice(LPVOID param) και την καλω μεσα απο το EventHandling του κουμπιου μου με το εξης καλεσμα AfxBeginThread(Rundevice,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);.. Αλλα μου προεκυψε ενα αλλο προβλημα και δεν μπορω να χρησιμοποιησω μεσα στην συναρτηση μου εντολες της MFC οπως MessageBox και DialogBox.. Γνωριζει καποιος τον λογο και το πως θα μπορουσα να το λυσω?? Ευχαριστω και παλι!!! Στειλε sms >void AFX_CDECL MyThreadProc(LPVOID lpVoid) { HWND hWnd = static_cast<HWND>(lpVoid); if(!hWnd) return; for(int i = 0; i< 10;i++) { SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),(rand()%2) ? L"Bam":L"Boom"); Sleep(2000); } } void CmfsFooDlg::OnBnClickedButton1() { AfxBeginThread((AFX_THREADPROC)MyThreadProc,this->GetSafeHwnd()); // TODO: Add your control notification handler code here }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.