Προς το περιεχόμενο

MS VC++


Dvs

Προτεινόμενες αναρτήσεις

Δημοσ.

Psaxno ena tutorial pou na exigei pos mporo na dimiourgiso mia forma kai genikotera resources xoris tin xrisi ton WinAPI (me WinAPI to kano alla thelo na matho kai xoris oste na to kano pio grigora :> )

 

thx

Δημοσ.
Exeis kana tutorial/source pou an deixnei pos mporo na fortoso ena resource (to exo sxediasei me to resource editor kai thelo na to fortoso meso WinAPI )???

oxi giati exo paratisei edo kai kero ta windows :twisted:

sigoura sto net tha vreis info gia afto pou psaxneis :)

Δημοσ.
Exeis kana tutorial/source pou an deixnei pos mporo na fortoso ena resource (to exo sxediasei me to resource editor kai thelo na to fortoso meso WinAPI )???

 

Τι resource είναι ; (Dialog box για παράδειγμα)

Δημοσ.

1) DialogBox αν το θες modal

2) CreateDialog αν θες modeless

 

Αν θες να είναι modeless (δηλ στην δεύτερη περίπτωση) τότε πρέπει να τροποποιήσεις και το message loop σου και να καλέσεις την ShowWindow μετά την εκτέλεση της CreateDialog:

 

while (GetMessage (&msg, NULL, 0 ,0))

{

..if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg)) {

.....TranslateMessage (&msg);

.....DispatchMessage (&msg);

....}

}

 

όπου hDlgModeless το handle του dialog σου (ουσιαστικά προωθείς τα messages από το κύριο πρόγραμμά σου στο modeless dialog). Τέσπα, αν θες να το κάνεις modeless πες μου να σου γράψω παραπάνω πάνω σε αυτό.

 

Πάμε για την πρώτη περίπτωση που είναι η πιο συνηθισμένη. Οι παράμετροι είναι (από MSDN):

 

int DialogBox(

HINSTANCE hInstance, // handle to application instance

LPCTSTR lpTemplate, // identifies dialog box template

HWND hWndParent, // handle to owner window

DLGPROC lpDialogFunc // pointer to dialog box procedure

);

 

Επομένως:

 

α) στην πρώτη παράμετρο θα πρέπει να στείλεις το application instance. Άρα θα πρέπει να το έχεις αποθηκεύσει από πριν. To application instance υπάρχει ως member μίας structure LPCREATESTRUCT η οποία αποθηκεύεται στο lparam όταν λαμβάνεις WM_CREATE message. Αυτό εξάλλου είναι και το πρώτο που έρχεται στο app σου. Άρα

 

βήμα 1ο:

θα πρέπει δηλώσεις μία μεταβλητή στην WndProc σαν static HINSTANCE:

eg:

static HINSTANCE hMyAppInstance;

 

βήμα 2ο:

μόλις δημιουργηθεί το app όταν λάβεις το WM_CREATE μήνυμα αποθηκεύεις το hInstance της δομής, που υπάρχει στο lparam, στην δική σου μεταβλητή. Δεν σε ενδιαφέρει τι τιμή έχει η LPCREATESTRUCT->hinstance. Απλά σε ενδιαφέρει να την αποθηκεύσεις. Φυσικά θα χρειαστείς το ανάλογο type casting:

 

// μέσα στην wndproc σου

hMyAppInstance= ((LPCREATESTRUCT) lParam)->hInstance;

 

Περισσότερα για την LPCREATESTRUCT και το WM_CREATE στην MSDN.

 

Μπορείς να φανταστείς ότι όταν εκτελείται μία CreateWindow[Ex], το πρόγραμμά σου ζητάει την «άδεια» από τα windows να δημιουργηθεί μία οντότητα. Αν τα windows θεωρήσουν ότι υπάρχουν τα απαραίτητα resources (που συνήθως αυτό ισχύει) τότε πριν επιστρέψει η συνάρτηση CreateWindow[Ex], τα windows αντιστοιχίζουν στην οντότητα ένα μοναδικό hinstance (=instance handle), παραχωρούν την απαραίτητη διαθέσιμη μνήμη και τέλος στέλνουν το WM_CREATE μήνυμα σε αυτήν όπου στην lparam εμπεριέχεται όσες πληροφορίες χρειάζεται να ξέρει η εφαμοργή για την ταυτότητα της. (μπέρδεμα;; :shock: :roll: ). Μετά από όλα αυτά επιστρέφει η CreateWindow με την τιμή του window handle. Φυσικά ένα instance μπορεί να έχει πολλά windows κοκ.

 

 

β) η δεύτερη παράμετρος είναι το όνομα του resource. Αν π.χ.:

 

//RESOURCE.H

MYDIAG DIALOG DISCARDABLE BLA BLA.

BEGIN

..

END

 

Τότε η δεύτερη παράμετρος θα είναι TEXT("MYDIAG")

 

 

γ) η τρίτη παράμετρος είναι το handle του parent app σου και ουσιαστικά είναι η τιμή που σου επιστρέφει η CreateWindow κατά την δημιουργία της εφαρμογής. Συνήθως είναι η hwnd. Κοίτα το source code και βρες την πρώτη CreateWindow που εκτελείται. Δες σε ποια μεταβλητή αποθηκεύεται η επιστρεφόμενη τιμή.

 

δ) η τελευταία παράμετρος είναι η συνάρτηση η οποία θα αναλαμβάνει να επεξεργάζεται τα μηνύματα του dialog σου από την στιγμή που θα δημιουργηθεί o dialog. Στην ουσία δεν διαφέρει καθόλου από την wndproc και συντάσσεται με τον ίδιο ακριβώς τρόπο. Απλά αντί να επεξεργάζεσαι τα μηνύματα του βασικού app επεξεργάζεσαι τα μηνύματα του dialog σου. Η πιο ουσιαστική διαφορά που πρέπει να ξέρεις είναι ότι δεν επιτρέφει LRESULT αλλά int. Για την ακρίβεια επιστρέφει true αν το μήνυμα που έλαβε το επεξεργάστηκε ή false αν το μήνυμα που έλαβε δεν χρειάζστηκε να το επεξεργαστεί. Αυτά χρησιμεύουν για το message loop. Προς το παρόν απλά στέλνε σωστά τις τιμές true/false .

 

Το header επομένως αντί για:

 

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )

 

θα είναι:

 

BOOL CALLBACK mycallbackfunc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )

 

Επομένως τελικά:

 

DialogBox (hMyInstance, TEXT("MYDIAG)", hwnd, mycallbackFunc);

 

Αυτά... Κάποια σελίδα δεν έχω υπόψη μου.

 

 

 

btw resource dialog box δεν υπάρχει... υπάρχει resource dialog. Το πώς θα το χρησιμοποιήσεις εξαρτάται από την συνάρτηση με την οποία θα το δημιουργήσεις. (π.χ. το ίδιο resource μπορείς να το χρησιμοποιήσεις είτε ως modal είτε ως modeless)

Δημοσ.

 

β) η δεύτερη παράμετρος είναι το όνομα του resource. Αν π.χ.:

 

//RESOURCE.H

MYDIAG DIALOG DISCARDABLE BLA BLA.

BEGIN

..

END

 

Τότε η δεύτερη παράμετρος θα είναι TEXT("MYDIAG")

 

 

Auto arkouse :)

Auto epsaxna toso kairo kai den to evlepa pouthena (i den anoiga ta matia mou na to do)!!!

tha to koitaxo aurio to proi giati me exei talaiporisei poli i oli istoria :)

nasai kala

Δημοσ.

btw resource dialog box δεν υπάρχει... υπάρχει resource dialog. Το πώς θα το χρησιμοποιήσεις εξαρτάται από την συνάρτηση με την οποία θα το δημιουργήσεις.

 

Από συνήθεια το λέω dialog-box μιας και χρησιμοποιώ αρκετά το ομώνυμο macro .. :idea: :idea: :idea:

Δημοσ.

k ;) no prob ...ας είναι λοιπόν τα υπόλοιπα αναφορά για άλλους (;;;).

 

Όσον αφορά το api για δική μου ευκολία έκανα μία μικρή περίληψη των messages και των winapi συναρτήσεων σε δύο αρχεία pdf. Παρόλα αυτά εννοείται ότι η σύνταξη δεν εξηγείται. Προϋποθέτει δηλαδή ότι ξέρει κάποιος να χρησιμοποιεί το msdn καθώς και ότι ξέρει πώς λειτουργούν τα messages loops από parents σε childs

 

Τέσπα, αν θέλετε να του ρίξετε καμία ματιά μπορείτε στο briefcase.pathfinder.gr/view/pagedown. Όχι ότι είναι και τόσο ιδιαίτερα προσεγμένο ούτε και ότι μπορεί κανείς να καλύψει το api. Απλά έχει τα βασικά.

 

Μπορεί και να θέλει και κάνα δίμηνο ..debbuging:)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...