PDA

Visualizza la versione completa : [C++] Significato dei suffissi "Ex" e "A" nei nomi delle funzioni API


MRj92
11-08-2007, 17:55
Salve! eccomi qui con un carico di comande.

[list=1]
Che differenza c'è tra una funzione x() e una funzione xEx()? (ad esempio CreateWindow() e CreateWindowEx())
E xA()? (tipo SendDlgItemMessage() e SendDlgItemMessageA() )
Perchè i miei button hanno uno stile tipo Win98? e non quello bellino e tanto carino di XP?
Come posso cambiare lo sfondo delle mie finestre?
[/list=1]

Grazie delle risposte! :ciauz:

zero85
11-08-2007, 18:52
1) Le funzioni che terminano con Ex sono funzioni che estendono le funzionalità della stessa funzione che non termina con Ex. Nello specifico la CreateWindowEx permette di specificare il parametro dwExStyle che come riporta msdn: "Specifies the extended window style of the window being created".

2) Allora se tu controlli i vari file che vengono tipicamente inclusi in un progetto win32 noterai che in tali file sono specificati i prototipi della maggior parte delle API più comuni, a loro volta la maggior parte dei prototipi delle API (quelle che utilizzano come parametri tipi STR) presentano 2 versioni la xA e la xW, in seguito tali prototipi vengono ridefiniti a seconda che sia definito unicode o no.
Esempio preso da winbase.h di vs:


WINBASEAPI
__out
HANDLE
WINAPI
CreateFileA(
__in LPCSTR lpFileName,
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in_opt HANDLE hTemplateFile
);

WINBASEAPI
__out
HANDLE
WINAPI
CreateFileW(
__in LPCWSTR lpFileName,
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in_opt HANDLE hTemplateFile
);

#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif // !UNICODE


3) Devi inizializzare i common control attraverso la funzione InitCommonControlsEx, dopo di che devi aggiungere al tuo progetto un file manifest, cerca su google e trovi sicuramente le informazioni necessarie

4)Certamente, quando dichiari la struttura WNDCLASSEX, e ne inizializzi i membri basta modificare a piacere il membro hbrBackground. QUI (http://msdn2.microsoft.com/en-us/library/ms633577.aspx) maggiori informazioni

andbin
11-08-2007, 18:56
Originariamente inviato da MRj92
Che differenza c'è tra una funzione x() e una funzione xEx()? (ad esempio CreateWindow() e CreateWindowEx())In genere le funzioni con suffisso Ex hanno un "qualcosa" in più, tipicamente dei parametri aggiuntivi e funzionalità aggiuntive.

Ad esempio CreateWindowEx ha in più rispetto a CreateWindow un parametro DWORD dwExStyle che permette di specificare degli stili di finestra estesi.

Ci sono svariate altre funzioni che hanno una versione Ex.


Originariamente inviato da MRj92
E xA()? (tipo SendDlgItemMessage() e SendDlgItemMessageA() )Qui la questione è diversa e riguarda il charset ANSI/Unicode. Le API di Windows che utilizzano/trattano in qualche modo delle stringhe, sono disponibili in 2 versioni: ANSI e Unicode. Per queste funzioni, esistono quindi 2 versioni nelle relative DLL di sistema dove sono presenti.

Prendiamo la funzione MessageBox(). Nella libreria USER32.DLL ci sono 2 versioni della funzione, che hanno i seguenti prototipi.

WINUSERAPI int WINAPI MessageBoxA (HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);

e

WINUSERAPI int WINAPI MessageBoxW (HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);

La differenza sta nel fatto che la versione A prende dei puntatori LPCSTR (stringhe ANSI) mentre la versione W prende dei puntatori LPCWSTR (stringhe Wide, ovvero Unicode).

Il fatto è che tipicamente è scomodo dover usare nei sorgenti direttamente l'una o l'altra perché se ad un certo punto si decidesse di compilare nell'altro modo, bisognerebbe cambiare tutti i nomi delle funzioni!!

Pertanto nei file di header del Platform SDK ci sono delle macro che sono definite così:

#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA

Se in fase di compilazione la macro UNICODE è definita, allora la compilazione è fatta per la gestione delle stringhe Unicode, altrimenti per stringhe ANSI. In base a questo, la parola MessageBox è semplicemente una define per una o l'altra funzione. La funzione che è "linkata" dall'eseguibile però sarà o MessageBoxA o MessageBoxW.

Grazie ad altre macro (che si trovano in tchar.h) è possibile realizzare un sorgente che senza toccare alcunché nel codice è possibile compilare tranquillamente in ANSI o in Unicode.


Originariamente inviato da MRj92
Perchè i miei button hanno uno stile tipo Win98? e non quello bellino e tanto carino di XP?Perché per default sui sistemi XP lo stile è quello vecchio. Per attivare lo stile nuovo di XP bisogna specificare un "manifesto" che può essere scritto come risorsa dentro l'exe oppure come file esterno che ha lo stesso nome della applicazione più l'estensione .manifest.

Vedi qui (http://www.dotnethell.it/articles/WindowsXPStyles.aspx), ad esempio (è il primo link che ho trovato, anche se parla per .NET il concetto è lo stesso).


Originariamente inviato da MRj92
Come posso cambiare lo sfondo delle mie finestre?Bisogna vedere cosa intendi per sfondo, se un solo colore specifico o una "texture" di sfondo. Poi ti riferisci ad una finestra (CreateWindow) o a una dialog-box (DialogBoxXXX)???

Nel caso di 1 solo colore è abbastanza semplice. Prima di creare la finestra con CreateWindow, si deve registrare la classe. Nella struttura WNDCLASS c'è un campo HBRUSH hbrBackground, basta creare un brush ad esempio con la funzione CreateSolidBrush e assegnarlo al campo (ricordarsi di fare alla fine la free del brush).

Per le dialog è un po' diverso, bisogna rispondere al messaggio WM_CTLCOLORDLG.


P.S.: Oggi avevo tempo ed ho scritto tutta la pappardella ..... ma è bene precisare che tutte queste cose si trovano nella documentazione su MSDN, l'unica e vera "bibbia" per la programmazione in Windows. Quindi è buona, anzi ottima, cosa documentarsi il più possibile.

MRj92
11-08-2007, 19:19
grazie mille! molto esaurienti entrambi! :) di grande aiuto!
Ho capito tutto. :zizi:

per il punto tre ho creato il file .manifest come ho trovato ma l'applicazione non parte! sto googlando su InitCommonControlsEx() ma non trovo molto! mi potete aiutare?

andbin
11-08-2007, 19:29
Originariamente inviato da MRj92
grazie mille! molto esaurienti entrambi! :) di grande aiuto!
Ho capito tutto. :zizi:

per il punto tre ho creato il file .manifest come ho trovato ma l'applicazione non parte! sto googlando su InitCommonControlsEx() ma non trovo molto! mi potete aiutare? Nel sorgente includi <commctrl.h>, nella funzione principale chiama InitCommonControls() (va bene anche l'altra 'Ex' ma c'è da fare qualcosa in più) e linka con la libreria comctl32.lib.
Tutto qua.


P.S. MSDN

zero85
11-08-2007, 19:33
Allora pirma di tutto ricorda di includere commctrl.h e linkare comctl32.lib, dopo di che nel main prima di creare i controlli:


INITCOMMONCONTROLSEX commctr;
commctr.dwsize = sizeof(INITCOMMONCONTROLSEX);
commctr.dwICC = ICC_WIN95_CLASSES; // qui puoi specificare più controlli con un bitwise or

if(InitCommonControlsEx(&commctr){
MessageBox(NULL, "Inizializzazione stile XP fallito", "Attenzione", MB_OK);
}


Cmq per tutte le specifiche msdn è la cosa migliore:
INITCOMMONCONTROLSEX Structure (http://msdn2.microsoft.com/en-us/library/ms672583.aspx)
InitCommonControlsEx Function (http://msdn2.microsoft.com/en-us/library/ms672653.aspx)

MRj92
11-08-2007, 20:56
mi da tantissimi errori, sembra che non trovi i typedef di DWORD ad esempio!! uso DevC++ 4.9...non so più che fare! :dhò: :dhò:

MRj92
12-08-2007, 11:06
mi da tantissimi errori, sembra che non trovi i typedef di DWORD ad esempio!! uso DevC++ 4.9...non so più che fare!

Lasciate stare, ero in trans!
cmq non trova la definizione della struttura e della funzione! :ciauz:

MRj92
12-08-2007, 14:32
ho aggiunto prima del main la definizione (MSDN) della funzione e della struct però:

[Linker error] undefined reference to `InitCommonControlsEx(tagINITCOMMONCONTROLSEX*)'

:dhò: :dhò: HELP ME!

andbin
12-08-2007, 14:45
Originariamente inviato da MRj92
ho aggiunto prima del main la definizione (MSDN) della funzione e della struct però:Cioè hai definito proprio la struttura come riportata su MSDN??? Basta #include <commctrl.h>


Originariamente inviato da MRj92

[Linker error] undefined reference to `InitCommonControlsEx(tagINITCOMMONCONTROLSEX*)' Linkare con comctl32.lib

Loading