giovedì 25 giugno 2009

Introduzione alle API Win32, Parte 2/6 - DevSpy.com

 

Introduzione alle API Win32, Parte 2/6

di Mastersgn, del 21 ottobre 2006 C/C++

Dopo le premesse del primo articolo del tutorial, siamo in grado di creare una piccola e basilare applicazione: visualizziamo un messaggio di "Hello World" in stile WinAPI tramite la funzione MessageBox().

Creare un nuovo progetto

Come detto in precedenza, facciamo riferimento all'IDE della Bloodshed: Dev-C++.

Facciamo click su Progetto, quindi selezioniamo Windows Application e come linguaggio il C. Scegliete il nome del progetto come preferite, premete OK per salvarlo e proseguite. Sarà creato un nuovo progetto al cui interno trovate il solo file main.c: cancellate il suo contenuto.

Ogniqualvolta compilate un progetto saranno compilati (e allo stesso tempo quindi linkati) tutti i file appartenenti ad esso.

Prima semplice applicazione

Iniziamo col creare una piccola applicazione. Per farci un'idea di come sia strutturato un programma WinAPI, scriviamo il codice necessario per visualizzare un messaggio di "Hello World".

Bene, prima di tutto trascrivete (se evitate il Copia&Incolla imparerete più rapidamente) il seguente codice nel vostro file main.c e compilate:

#include <windows.h>
#define WIN32_LEAN_AND_MEAN

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{

  MessageBox(0, "Hello World!!",
"Un messaggio", MB_OK);

return 0;
}


Osserviamo l'inclusione dell'header file  windows.h  e la definizione della macro WIN32_LEAN_AND_MEAN, già descritti nel primo articolo. Poi, al posto della solita funzione int main(int  argc,  char*  argv[])  ne troviamo un'altra:



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)


Dato che questa istruzione Win32 è molto diversa, analizziamola meglio:




  • WINAPI indica una funzione che adotta la convenzione di chiamata standard di Windows.


  • HINSTANCE hInstance indica l'Handle del modulo eseguibile del programma. Di questo parametro torneremo a parlare più avanti, ma per ora non ha molta importanza.


  • HINSTANCE hPrevInstance ha sempre valore NULL nei programmi Win32. Era usato in Win16, mentre con Win32 va ignorato.


  • LPSTR lpCmdLine contiene l'intera riga di comando passata al nostro programma in un'unica stringa. E' l'equivalente dell'intero array argv[] del metodo main dello standard C. Non include il nome del programma. Per ora ignoramo anche questo parametro.


  • int nCmdShow può ricevere un valore intero. Trascuriamo anche quest'ultimo per il momento.



Rimandiamo tutto quanto non descritto in questa sede ad un successivo studio più approfondito.



Funzione MessageBox()


Ora occupiamoci di analizzare la funzione che visualizza il messaggio di Hello World:



int MessageBox(
  HWND hWnd,
  LPCTSTR lpText,
  LPCTSTR lpCaption,
  UINT uType
);



  • Il tipo HWND, handle di Windows, è un tipo opaco. Serve ad identificare una finestra (e non solo). In questo caso viene passato come zero, visto che il messaggio da inviare è visualizzato direttamente dalla finestra corrente. Più difficile da spiegarsi che da applicare, approfondiremo meglio più avanti questo tipo in quanto molto importante.


  • LPCTSTR lpText (come accennato nel primo articolo) prende un stringa costante e si impegna a non modificarla. In questo caso, al parametro passiamo la stringa da visualizzare come corpo del messeggio.


  • Utilizziamo LPCTSTR lpCaption come per il parametro precedente, ma in questo caso la stringa da passare verrà visualizzata come titolo del messaggio.


  • UINT uType, è un tipo unsigned int. Si tratta di un valore intero che indica il tipo di finestra di messaggio da mostrare. Ad esempio, nella nostra macro MB_OK visualizza un semplice messaggio senza icone con un solo bottone di OK.



Potremmo utilizzare molti altri valori per uType, ognuno dei quali determina un tipo di finestra differente. Ad esempio, tramite MB_YESNO potremmo visualizzare i due bottoni "Si" e "No". Queste vatianti sono usate per ottenere l'input dell'utente, ovvero quando l'utente deve fare una scelta. Vedremo più avanti come utilizzare diverse metodologie al riguardo. Per documentarvi sulle altre macro disponibili, consultate la MessageBox function.



Per finire incontriamo l'istruzione return 0, che termina la funzione.



D'ora in poi considereremo la funzione MessageBox() per appresa. Non ci resta che creare qualcosa di più sostanzioso e significativo nel prossimo articolo.




Introduzione alle API Win32, Parte 2/6 - DevSpy.com

Nessun commento:

Posta un commento