Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [C++ win32 API] Domande varie

    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!

  2. #2
    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:
    codice:
     
    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 maggiori informazioni

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [C++ win32 API] Domande varie

    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, 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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    grazie mille! molto esaurienti entrambi! di grande aiuto!
    Ho capito tutto.

    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?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da MRj92
    grazie mille! molto esaurienti entrambi! di grande aiuto!
    Ho capito tutto.

    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
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Allora pirma di tutto ricorda di includere commctrl.h e linkare comctl32.lib, dopo di che nel main prima di creare i controlli:
    codice:
    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
    InitCommonControlsEx Function

  7. #7
    mi da tantissimi errori, sembra che non trovi i typedef di DWORD ad esempio!! uso DevC++ 4.9...non so più che fare!

  8. #8
    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!

  9. #9
    ho aggiunto prima del main la definizione (MSDN) della funzione e della struct però:
    codice:
      [Linker error] undefined reference to `InitCommonControlsEx(tagINITCOMMONCONTROLSEX*)'
    HELP ME!

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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
    codice:
      [Linker error] undefined reference to `InitCommonControlsEx(tagINITCOMMONCONTROLSEX*)'
    Linkare con comctl32.lib
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.