PDA

Επιστροφή στο Forum : Προβλήματα με MFC/ native GUI programming και μέρος να τα συζητάμε.



petran_18
05-10-13, 21:35
Kαλησπέρα παιδιά, θα ξεκινήσω πρώτος.

Αποφάσισα να ψαχτώ με προγραμματισμό GUI σε Windows και βρήκα ενδιαφέροντα βιβλία και tutorial για MFC οπότε και είπα να διαβάσω και να το προσπαθήσω λίγο. Είναι αρκετά κατανοητός ο προγραμματισμός αν διαβάσω καλά το κομμάτι που πάω να δοκιμάσω.

Ωστόσο σε ένα project και ενώ έχω σωστές ρυθμίσεις (Use MFC in a Shared DLL) το παράθυρο που δημιουργώ εμφανίζεται και εξαφανίζεται εν ριπή οφθαλμού! Κάτι παρόμοιο με αυτο που κανουνε οι κονσόλες όταν εμφανίσουν μήνημα/τελειώσει η εκτέλεσή τους. Πάντως να αναφέρω ότι όταν κάνω debug με breakpoint στο
return 0; και παγώνει η εκτέλεση εκεί βλέπω το παράθυρο, άρα δεν είναι οτι δεν δημιουργείται η κάτι τέτοιο.

Σαν IDE χρησιμοποιώ το Visual Studio 2013 RC και παρακάτω παραθέτω τον κώδικα του project.

main.cpp

#include "Exercise.h"
#include <cstdio>

int APIENTRY _tWinMain(HINSTANCE, HINSTANCE,
LPTSTR, int){
theApp.InitInstance();
return (0);
}

Exercise.h

#include <afxwin.h>
/*#include "ResourceDlg.h"*/

class CResApp : public CWinApp{
public:
BOOL InitInstance();
};

class CResFrame : public CFrameWnd{
public:
CResFrame(){
Create(NULL, L"Resources Fundamenetals");
}
};

CResApp theApp;

BOOL CResApp::InitInstance(){
m_pMainWnd = new CResFrame;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();

return TRUE;
}

Κάθε συμβουλή σχετικά με τον κώδικα/λάθη/παρατυπίες θα ήταν κατι ΠΑΡΑΠΑΝΩ απο καλοδεχούμενη! Είναι ωραίος ο προγραμματισμός αλλά δύσκολος όταν είσαι μόνος και μάλιστα όταν αφορά GUI ή/και διάφορα άλλα toolkit (QT κα). Ευχαριστώ εκ των προτέρων.

Aυτό το tutorial διαβάζω. (ΣΕΛ 79 θα το βρείτε)
https://www.google.gr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CC4QFjAA&url=http%3A%2F%2Fwww.math.hcmuns.edu.vn%2F~tatuana%2FC%2520For%2520Win%2FMFC%2FTai%2520Lieu%2520Tham%2520Khao%2FVisual%2 520C%2B%2B%2520and%2520MFC%2520Programming%25202nd.pdf&ei=o1xQUoH-HYnYtAbTroGgBg&usg=AFQjCNEBchqIS29l3Vgw6zmN7hMI1vgZsQ&sig2=2B5mWGX9WAlVKcEHYcW0Vg&bvm=bv.53537100,d.Yms

A.N.T.
05-10-13, 22:55
Παράτα το MFC και πιάσε την Qt όσο είναι ακόμη νωρίς.
Σου μιλώ εκ πείρας....

petran_18
05-10-13, 23:23
Πως και τι; Θέλω να πω μεταφέρεις τον κώδικα και στην καφετιέρα σου αμα γουστάρεις αλλα τι καλύτερο έχει; Επίσης (εκτός του οτι δεν βρίσκω tutorials και ebook) υπάρχει τρόπος να αναπτύσσω Qt μέσα απο το Visual Studio; Όχι σωνει και ντε να το πιάσω αλλά να ζυγίσω τα υπερ και τα κατά θέλω.

Νομίζω οτι θα το προσπαθήσω ακόμα με την Visual C++

A.N.T.
06-10-13, 00:02
Το γιατί η Qt είναι καλύτερη εξηγείται σε πολλά μέρη, π.χ. εδώ
http://phil.freehackers.org/kde/qt-vs-mfc.html

Επιπλέον, ναι υπάρχει δυνατότητα να δουλεύεις την Qt στο Visual Studio - τουλάχιστον στο VS 2008 & VS 2010.
To έχω κάνει. Εγκαθιστάς ένα plug-in για να μπορεί το VS να "βλέπει" τα αρχεία της.
Το plug-in αυτό είναι διαθέσιμο στην ιστοσελίδα της Qt.
Έτσι είσαι σε γνώριμο περιβάλλον με όλες τις ευκολίες του VS (ο Qt Creator μπροστά στο VS είναι για τα μπάζα).

Είχα ασχοληθεί αρκετά με το MFC στο παρελθόν και είχα πάρει και βιβλία που θεωρούνταν ευαγγέλια, π.χ.
το "Programming Windows with MFC" του Prosise, το "Τhe MFC answer book" κ.α.
(Όπως έγραψα, μιλώ εκ πείρας).
Μετάνιωσα που ασχολήθηκα. Η Qt είναι καλύτερη. Πέραν του καλύτερου σχεδιασμού της, το γεγονός ότι με το MFC
μαθαίνεις κάτι που αφορά μόνον την MS ενώ μπορείς να μάθεις μια πλατφόρμα που λειτουργεί παντού είναι ο πιο
σημαντικός παράγοντας και αργά ή γρήγορα θα σε ενοχλήσει.

Και μόνον για την ευρεία υποστήριξη και τo cross platform χαρακτηριστικό της είναι προτιμότερη επιλογή.
Το μόνο αρνητικό που βρήκα είναι ότι για να κάνεις static building ένα πρόγραμμα της Qt πρέπει να την
έχεις κάνεις compile εσύ (τρέχα γύρευε δηλαδή !), κι όχι να χρησιμοποιήσεις τα έτοιμα binaries.

Πώς δεν βρίσκεις tutorias και e-books; το amazon έχει.
Δεν υπάρχουν αμέτρητα αλλά έχει 2-3 εξαιρετικά - και τα είχα βρει εύκολα σε πονηρά μέρη, χωρίς να πληρώσω τίποτε...

petran_18
06-10-13, 00:23
Τεκμηριωμένη η αποψή σου και ναι έχεις δίκιο σε ότι λες. Λίγο πολύ τα ήξερα (χρήστης Linux) αλλά με ενδιέφερε κάτι πιο κοντά στα Windows, ίσως και λόγω ευκολίας του Visual Studio. Mε την τελευταία σου πρόταση θυμήθηκα κάτι που και εμένα δεν μου είχε αρέσει στην Qt/QtCreator και θέλω να δω αν μιλάμε για το ίδιο. Ενώ έγραφα το προγρμματάκι και έτρεχε μέσα απο το IDE (QTCreator) όταν το έβρισκα στο φάκελο και το αντέγραφα σε εναν σκληρο (έξω δλδ απο τα λοιπά αρχεία και dll π είχε ο φάκελος) πχ δεν έτρεχε παρα ζητούσε διαφορα dll. Για κάποιο λόγο έτρεχε μόνο μέσα απο το IDE! Είχε να κάνει με static και dynamic linking και τα ρέστα; Ρωτάω γιατί είναι ο κύριος λόγος που απέφευγα την Qt στα Windows. Δεν λέει για να μοιράσεις ενα προγραμμα να λες εγκαταστήστε και το Qt-Creator παρέα για να τρέξει!

Πάντως το θέμα με τα tutorial ακόμα το έχω. Πιο πολλά βρίσκω για PyQt παρά για Qt/C++

A.N.T.
06-10-13, 00:39
Μην μπερδεύεσαι. Kαι στο VS το ίδιο θα συνέβαινε.
Το ότι δεν έτρεχε έξω από το IDE (αλλά σε υπολογιστή που έχει την Qt εγκατεστημένη) οφείλεται στο ότι
δεν είχες ενημερώσει τις environment variables (δηλ. πού θα βρει ο υπολογιστής τα αρχεία της Qt).
Aυτό διορθώνεται εύκολα (control panel κλπ). Άπαξ και δώσεις τη θέση της Qt στις enviroment variables,
το πρόγραμμα θα τρέχει όπου κι αν το έχεις.

Όμως σε υπολογιστή που ΔΕΝ έχει την Qt πρέπει να θέσεις στο φάκελο με το exe και όλα τα απαραίτητα dll της.
Εύκολο : τρέχεις το exe και προσθέτεις ότι ζητάει μέχρι να τρέξει. Δεν είναι κομψό βέβαια αλλά λειτουργεί μια χαρά.

Και οι δυο αυτές περιπτώσεις δεν υφίστανται με το static linking.
Aυτό μπορεί να γίνει αλλά όπως έγραψα θα πρέπει κατά την εγκατάσταση της Qt,
αντί να εγκαταστήσεις τα έτοιμα binaries, να την κάνεις εσύ compile και να ορίσεις τις κατάλληλες επιλογές για
να επιτρέπει στο static linking.
Δεν το έχω δοκιμάσει αυτό και είναι διαδικασία όπου πολλά μπορούν να πάνε στραβά.
Ωστόσο, για να την μάθεις, το static linking αρχικά δεν χρειάζετα, τα δε πλεονεκτήματά της αξίζουν κατ' εμέ.

Τέλος, έχε κατά νου ότι το plug-in που ενσωματώνει την Qt στο VS λειτουργεί με την professional έκδοση του VS.
(Παλαιότερες εκδόσεις του δούλευαν και με την δωρεάν αλλά έπρεπε να κάνεις κάποια κόλπα. Για την πρόσφατη δεν ξέρω...)

petran_18
06-10-13, 00:51
Eυχαριστώ πολύ για το χρόνο και τις συμβουλές σου. Θα μου φανουν πολυ χρήσιμες. Φαίνεται να ξέρεις τι λες και κάνεις. Θα συνεχίσω να ψαχνω βοηθήματα για την Qt και απο αύριο θα δω και όσα λες παραπάνω με την εγκατάσταση. Το λέω γιατί ήδη τα έχω εγκαταστήσει τα έτοιμα binaries :oops: Να φανταστώ μέσα απο Cygwin και GCC θα γίνει το compile; Τέσπα θα ψάξω στο google και στο σαιτ της Qt τι παίζει. Να σαι καλά που βοήθησες και εξήγησες ;)

A.N.T.
06-10-13, 01:03
Απλώς έχω βαδίσει το μονοπάτι.

Το compile της Qt γίνεται και στο VS.
Ωστόσο, είναι πολύ χρονοβόρα διαδικασία και γεμίζει τον υπολογιστή με αρκετά (εκατοντάδες ΜΒ !) άχρηστα αρχεία
τα οποία δεν μπορείς να τα σβήσεις διότι δεν ξέρεις αν και ποιά χρειάζονται.
Και το χειρότερο, πολλά μπορεί να πάνει στραβά και να παιδευτείς χωρίς αποτέλεσμα.
Τα έτοιμα binaries απαλλάσουν από πολλούς μπελάδες.
Η γνώμη μου είναι να μην μπλέξεις αφού ο σκοπός είναι καταρχήν διδακτικός.
Αν όμως είσαι τολμηρός ή έχεις εμπειρία και θέλεις σώνει και καλά να κάνεις εσύ compile, δες πρώτα κάποιο video στο youtube.
Αν τελικά βρεις τι ακριβώς απαιτείται για το static linking, μας λες και μας...

Όσο για βιβλία δες τα
"The book of Qt 4 The art of building Qt applications" (έχει κάποιο πρόβλημα ο συνοδευτικός του κώδικας αλλά διορθώνεται) ,
"C++ GUI Programming with Qt4, 2nd ed",
"Foundations of Qt development"
Δεν χρειάζεται κανένα άλλο tutorial....

petran_18
06-10-13, 01:12
To δεύτερο το έχω διαβάσει και το ξαναβρήκα τώρα. Νομιζα είναι το μοναδικό αλλά πάω να τσεκάρω και για τα υπόλοιπα να δω τι παίζει. Αναφορικά με το compile της Qt θα σε ενημερώσω αν καταφέρω κάτι. Για ακόμα μια φορά ευχαριστώ πολύ. Όπως είπα στο πρώτο πόστ, ενώ είναι τόσο δημιουργικός ο προγραμματισμός και ειδικά σε GUI, οτι και να διαβασεις και να ψάξεις η εμπειρία πάντα χρειάζεται...να σε βοηθήσει κάποιος. Φαίνεται να έχεις ψηθεί και αλήθεια είανι πολυ ενδιαφέρον και θα ήθελα να μάθω να κάνω πολλά με προγραμματισμό. Υπομονή και διάβασμα λοιπόν. Και το τόπικ εδω είναι...

Άντε να βγει κανένα για Qt5 μπας και την μάθουμε απο την αρχή. Είναι καινουργια, θα κρατήσει χρόνια και δεν λέει να μαθαίνεις την 4 για να κανεις τις μετατροπές στην 5 αργότερα. Ιδωμεν

Παπι
06-10-13, 18:49
Εγω θα σου ελεγα να παρατησεις και το qt. Αρκετο overhead για το τιποτα. Πιασε winapi να κανεις την δουλεια σου.

petran_18
07-10-13, 13:15
Ειλικρινά θα ήθελα πολύ, αλλά είναι τόσο μακαρόνι ο κώδικας μόνο για ένα μενού ας πούμε. ¨Ηλπιζα
με το MFC να την παλέψω αλλά απο οτι το έψαξα και λίγο παραπάνω είναι και αυτό αρκετά στριφνό.
Ίσως αν μπορούσα τουλάχιστον σε WinApi/MFC να σχεδιάζω οπτικά το παραθυρο και να τοποθετώ μενου/κουμπιά και απλά να έγραφα τον κώδικα για το τι θα κάνουν να ήτανε καλύτερα.

Αλλά απο όσο είδα δεν μπορεί να γίνει με MFC αυτο. Νόμιζα οτι Visual C++ λέγεται γιατι προγραμματίζεις με γραφικό τρόπο (κατα μια έννοια) όπως στην VB.net ή C#. Μάλλον δεν γίνεται και δημιουργώ μόνος στοιχεία/ελέγχους/κουμπιά κτλ. Θέλει διάβασμα και χρόνο το WinApi

Παπι
08-10-13, 14:26
Δεν ειναι στριφνο το winapi... Ειναι καθαρο imperative paradigm, σε αντιθεση με το mfc/qt κλπ oo gui που μονο οο δεν το λες με τοσο metaprogramming που εχει πεσει.

petran_18
08-10-13, 19:23
Μάλιστα... Αν εφαρμόζω αυτά που το Programming Windows 5th Ed λεει, είναι γενικά δεκτό για Windows 8 και 64μπιτα συστήματα; Θέλω να πω, να ψάξω κάτι πιο σύγχρονο
(αν και λεει οτι εισάγει σε 32bit API-ποσο να έχει αλλάξει; ) ή αν και γραμμένο για Win 98 ακόμα οι τεχνικές και οι κλήσεις στο API είναι παρόμοιες;

A.N.T.
08-10-13, 21:05
Το εν λόγω βιβλίο του Petzold εξετάζει τα βασικά χαρακτηριστικά του win32 στα Win 98 τα οποία
όμως είναι γενικώς κοινά σε όλες τις εκδόσεις των Windows. Οι τυχόν διαφορές είναι μικρές.

Περισσότερες λεπτομέρειες με αναλυτικά παραδείγματα για κάθε συνάρτηση (σχεδόν !) του win API δίνονταν
στα "Win32 API Bibles" (3 μεγάλοι τόμοι) και σε άλλα όμοιά τους.
Ο πρώτος τόμος από τα "Bibles" περιλαμβάνει και το GDI, δηλ. τα γραφικά.


Είχα μελετήσει το μεγαλύτερο μέρος από το βιβλίο του Petzold στο παρελθόν και έβλεπα λεπτομέρειες από
τα "Bibles" που δεν περιέχει το πρώτο.
Το τελικό μου συμπέρασμα μετά από δουλειά μηνών είναι ότι το win32 api αποτελεί καθαρά χάσιμο χρόνου
και μαζοχισμό. Κάποια βασικά στοιχεία πρέπει να ξέρει κανείς - αλλά μέχρι εκεί.
Τη σήμερον ημέρα, όποιος επιχειρεί να φτιάξει εκτεταμένο γραφικό interface με το win32 είναι απλά ανόητος.
Αυτό γινόταν πριν από 25 χρόνια όταν δεν υπήρχαν άλλα εργαλεία, τα δε όποια εργαλεία και πλατφόρμες
(MFC, QT, κ.α.) αναπτύχθηκαν έκτοτε, ήταν ακριβώς για να απαλλάξουν τον προγραμματιστή από όλην αυτήν
την ανούσια, κουραστική και χρονοβόρα αγγαροδουλειά.
Η καλύτερη επένδυση χρόνου είναι σε ένα περιβάλλον που έχει ευρεία υποστήριξη, σέβεται τη συμβατότητα,
ει δυνατόν δυνατόν είναι cross platform και δεν εξαρτάται από συγκεκριμένες εταιρίες, έχει καλό σχεδιασμό
και μεγάλες δυνατότητες.
Το win32 api (τουλάχιστον σε ότι αφορά τα γραφικά) χρησιμεύει πλέον μόνον για ιστορικό μάθημα.
Αν προσπαθήσεις, θα μάθεις βέβαια πώς στήνεται ένα παράθυρο αλλά για κάτι συνθετότερο είναι τόση η δουλειά
και η πολυπλοκότητα που ΔΕΝ αξίζει τον κόπο σε καμιά περίπτωση. Ακόμα δε περισσότερο όταν υπάρχουν apis
όπου μπορείς να μάθεις το ίδιο πράγμα που να λειτουργεί σε και στα τρία λειτουργικά (win, linux, mac).

Τα ίδια περίπου ισχύουν και για το openGL έναντι του DX (σε ότι αφορά τα γραφικά).

petran_18
10-10-13, 21:50
Αν όμως είσαι τολμηρός ή έχεις εμπειρία και θέλεις σώνει και καλά να κάνεις εσύ compile, δες πρώτα κάποιο video στο youtube.
Αν τελικά βρεις τι ακριβώς απαιτείται για το static linking, μας λες και μας...




Configure options:

The defaults (*) are usually acceptable. A plus (+) denotes a default value
that needs to be evaluated. If the evaluation succeeds, the feature is
included. Here is a short explanation of each option:

* -release ........... Compile and link Qt with debugging turned off.
-debug ............. Compile and link Qt with debugging turned on.
-debug-and-release . Compile and link two versions of Qt, with and without
debugging turned on (Mac only).

-force-debug-info .. Create symbol files for release builds.

-developer-build ... Compile and link Qt with Qt developer options (including auto-tests exporting)

-opensource ........ Compile and link the Open-Source Edition of Qt.
-commercial ........ Compile and link the Commercial Edition of Qt.

-confirm-license ... Automatically acknowledge the license (use with
either -opensource or -commercial)

-no-c++11 .......... Do not compile Qt with C++11 support enabled.
+ -c++11 ............. Compile Qt with C++11 support enabled.

* -shared ............ Create and use shared Qt libraries.
-static ............ Create and use static Qt libraries.

* -process ........... Generate only a top-level Makefile.
-fully-process ..... Generate Makefiles for the entire Qt tree.
-dont-process ...... Do not generate any Makefiles.

-no-largefile ...... Disables large file support.
+ -largefile ......... Enables Qt to access files larger than 4 GB.

-no-accessibility .. Do not compile Accessibility support.
Disabling accessibility is not recommended, as it will break QStyle
Κάπου οπως βλέπεις λέει για static libs. Τώρα θα δοκιμάσω αν είναι αυτή η επιλογή.
Αν θες να σου πω περισσότερα πες μου εδω ή με π.μ. ;)

http://qt-project.org/wiki/Building-Qt-5-from-Git

petran_18
23-12-13, 14:28
Αν τελικά βρεις τι ακριβώς απαιτείται για το static linking, μας λες και μας...



Γράφω αυτά τα βήματα σε περίπτωση που κάποιος μελλοντικά τα χρειαστεί.

Για αρχή κατέβασα το Qt5, την έκδοση για Windows (.zip) και είναι πηγαίος κώδικας όχι έτοιμα εκτελέσιμα. Στην συνέχεια και αφου το αποσυμπίεσα στο C:\
άνοιξα ένα command prompt του Visual Studio (όχι απλό cmd) και με cd πήγα στον σωστό φάκελο. Θα το βρείτε στην Έναρξη -> Visual Studio 20xx -> Visual Studio Tools -> ....


cd C:\qt-everywhere-opensource-src-5.2.0

Στην συνέχεια (και εδω είναι το όλο θέμα!), δίνω τις δικές μου παραμέτρους για το configuration και φυσικά αυτές για static linking μιας και γιαυτο γίνεται όλη η φασαρία και δεν κατεβάσα τα έτοιμα binaries.


configure.bat -prefix %CD%\qtbase -opensource -nomake tests -release -static

Και φυσικά ότι άλλο θέλει καθένας.

You might also benefit from using jom instead of nmake. It will try to keep all of your cores occupied,
it will certainly build Qt much faster on a multicore machine. Jom is a
drop-in replacement, there's no need to change anything. It's just a parallel reimplementation of nmake.
Yπάρχουν εργαλεία για το compilation και αυτα (που ξέρω εγω δλδ) είναι το

nmake και
jom

Το πρώτο απλά το πληκτρολογείτε και ξεκινάει την δουλειά, αλλά το δεύτερο όπως και ποιο πάνω αναφέρει είναι πιο γρήγορο και χρησιμοποιεί όλους τους πυρήνες. Αν θέλετε το jom, απλά κατεβάστε απο εδώ http://ftp.fau.de/qtproject/official_releases/jom/jom.zip και αποσυμπιέστε το μέσα στον φάκελο του πηγαίου κώδικα της Qt (Σε μένα ειναι -> C:\qt-everywhere-opensource-src-5.2.0).

Μετα απλά τρέξτε
jom ή
nmake αν θέλετε και υπομονή μέχρι να τελειώσει.

Καταλαβαίνω οτι απέχει χιλιόμετρα απο σωστό tutorial ή κατι τέτοιο, είναι όμως μια προσπάθεια να δείξω οσο μπορώ τον δρόμο. Αν κάποιος έχει κάτι να συμπληρώσει ή να διορθώσει, ας το κάνει ελεύθερα.

ΥΓ. Αν περαστει το -static, δίνει προειδοποίηση ότι θα υπάρξει πρόβλημα με κάποια plugins και modules. Πράγματι, μόλις τώρα έσκασε με αυτο μνμ

moc_volumebutton.cpp
link /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /SUBSYSTEM:WINDOWS "
/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' versio
n='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture
='*'" /MANIFEST /MANIFESTFILE:release\musicplayer.exe.embed.manifest /OUT:releas
e\musicplayer.exe @C:\Users\Dell\AppData\Local\Temp\musicplayer.exe.5072.6770.jo
m
Creating library release\musicplayer.lib and object release\musicplayer.exp
mt.exe /nologo /manifest release\musicplayer.exe.embed.manifest /outputr
esource:release\musicplayer.exe;1
jom: C:\qt-everywhere-opensource-src-5.2.0\qtwinextras\examples\Makefile [sub-wi
nextras-make_first] Error 2
jom: C:\qt-everywhere-opensource-src-5.2.0\qtwinextras\Makefile [sub-examples-ma
ke_first] Error 2
jom: C:\qt-everywhere-opensource-src-5.2.0\Makefile [module-qtwinextras-make_fir
st] Error 2

C:\qt-everywhere-opensource-src-5.2.0>

Θα το ψάξω και θα γράψω.

@ ADSLgr.com All rights reserved.