1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
//header, l'inizio della fine
#include <windows.h>
#include <tchar.h>
//definizioni di costanti per le funzioni
#define FILE_MENU_NEW 1
#define FILE_MENU_OPEN 2
#define FILE_MENU_EXIT 3
#define CHANGE_TITLE 4
//handler unsigned int, parametri
//window procedure riferimento, per usarlo dopo
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
//funzione per aggiungere i menu, riferimento
void AddMenus(HWND);
//funzione per aggiungere i controlli, riferimento
void AddControls(HWND);
//funzione per aggiungere le immagini, riferimento
void LoadImages();
//variabile globale, handler per i menu
HMENU hmenu;
//variabili globali, bitmap per le immagini
HBITMAP hLogoImage;
//variabile globale, handler per i controlli
HWND hedit;
//variabile globale, handler per le immagini
HWND hLogo;
//come un int main, ma per l'header windows.h
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow) {
WNDCLASSW wc = {0}; //window class w (tipo di window class)
wc.hbrBackground = (HBRUSH)COLOR_WINDOW; //sfondo della finestra
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //cursore del mouse, IDC_qualcosa è la forma del cursore
wc.hInstance = hInst; //istanza per la finestra
wc.lpszClassName = L"WinClass"; //la classe registrata per la finestra
wc.lpfnWndProc = WinProc; //si occupa degli eventi della finestra
if(!RegisterClassW(&wc)) { //registra la finestra (Class W, come prima)
return -1; //controlla se la finestra si è registrata, altrimenti ritorna -1 e chiude il programma
}
//crea window W da che classe, nome fin, stile soprapposto e visibile, top left, larg, lung, handler, menu, instance, parametri
CreateWindowW(L"WinClass", L"Iea boi", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500, NULL, NULL, NULL, NULL);
//struttura per i messaggi
MSG msg = {0};
// loop per tenere aperta la finestra
// GetMessage, usa struttura, handler, filterMIN, filterMAX
while( GetMessage(&msg, NULL, NULL, NULL))
/*lo stesso messaggio "la finestra è aperta", viene mandato avanti e indietro,
tradotto e dispatchato, finchè GetMessage = false*/
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//window procedure definizione; handler, messaggio, parametri; definisce tutti gli eventi
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
switch(msg) {
case WM_COMMAND: //tipo di Windows message, quando un item viene cliccato
switch(wp){ //controlla quale item viene cliccato
case FILE_MENU_EXIT: // se l'id è FILE_MENU_EXIT
DestroyWindow(hwnd); //Distrugge la finestra con hwnd come handler
break;
case FILE_MENU_NEW: //se l'id è FILE_MENU_NEW
MessageBox(hwnd, "HIII", "New", MB_OK); //crea un box e lo attacca alla finestra quando viene cliccato
MessageBeep(MB_ICONQUESTION); //produce un suono
break;
case CHANGE_TITLE: //se l'id è CHANGE_TITLE
wchar_t text[100]; //variabile per prendere i wchar
GetWindowTextW(hedit, text, 100); //prende i wchar
SetWindowTextW(hwnd, text); //setta i wchar presi come nome della finestra
break;
}
break;
case WM_CREATE: // tipo di Windows message, quando si crea la finestra
LoadImages(); //aggiunge le immagini
AddMenus(hwnd); // aggiunge i menu
AddControls(hwnd); // aggiunge i controlli
break;
case WM_DESTROY: // tipo di window message, quando si clicca sulla X
PostQuitMessage(0); //GetMessage = false
break;
default: //tutti i messaggi non dei tipi sopracitati
return DefWindowProcW(hwnd, msg, wp, lp); // ritornano un valore al window procedure
}
}
//aggiungere i menu, definizione, usa un handler per sapere dove attaccarsi
void AddMenus(HWND hwnd) {
hmenu = CreateMenu(); //crea un menu e lo assegna alla vaariabile globale
HMENU hFileMenu = CreateMenu(); //nuovo menu
HMENU hSubMenu = CreateMenu(); //nuovo menu
//aggiunge un item al menu
//menu, tipo di menu, id, nome
AppendMenu(hSubMenu, MF_STRING, NULL, "SubMenu Item"); //appende Change Title Item a hSubMenu
AppendMenu(hFileMenu, MF_STRING, FILE_MENU_NEW, "New"); //appende Nuovo a hFileMenu
AppendMenu(hFileMenu, MF_POPUP, (UINT_PTR)hSubMenu, "Open SubMenu"); //appende Open SubMenu a hFileMenu
AppendMenu(hFileMenu, MF_SEPARATOR, NULL, NULL); //separatore
AppendMenu(hFileMenu, MF_STRING, FILE_MENU_EXIT, "Exit"); //appende Exit a hFileMenu
AppendMenu(hmenu, MF_POPUP, (UINT_PTR)hFileMenu, "File"); //appende hFileMenu a hmenu
AppendMenu(hmenu, MF_STRING, NULL, "Help"); //appende Toto a hmenu
SetMenu(hwnd, hmenu); //hmenu è aggiunto a hwnd
}
void AddControls(HWND hwnd){
//definisce un controllo statico, di rango inferiore alla finestra iniziale, con un bordo, e allineato a sinistra
CreateWindowW(L"Static", L"Inserisci testo: ", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_LEFT, 200, 100, 100, 25, hwnd, NULL, NULL, NULL);
//definisce un controllo dinamico di rango inferiore alla finestra iniziale, con un bordo e allineato a sinistra, che può essere scritto in più righe
hedit = CreateWindowW(L"Edit", L"", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL , 200, 130, 100, 50, hwnd, NULL, NULL, NULL);
//definisce un bottone, nella finestra iniziale, con la funzione CHANGE_TITLE
CreateWindowW(L"Button", L"Change Title", WS_VISIBLE | WS_CHILD, 200, 185, 100, 25, hwnd, (HMENU)CHANGE_TITLE, NULL, NULL);
//controllo statico, ma con uno stile in più SS_BITMAP, pronto per ricevere un immagine
hLogo = CreateWindowW(L"Static", NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 350, 60, 100, 100, hwnd, NULL, NULL, NULL);
//manda un messaggi a hLogo, per settare l'immagine, wp contiene il tipo, lp contiene l'handler
SendMessageW(hLogo, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hLogoImage);
}
void LoadImages(){
// LoadImage ritorna un handler, che noi forziamo essere un HBITMAP
// il primo argomento è hInstance, che nel caso stiamo prendende immagini da file, sarà NULL
// il secondo argomento è il percorso, o il nome nel caso il file i trovi nella directory
// tipo di immagine, scala delle coordinate (0 è default)
// come si carica l'immagine
hLogoImage = (HBITMAP)LoadImageW(NULL, L"C:/Users/Vitiello/Desktop/PEPPE/PROGRAMMAZIONE/C++/WINAPI/logo.bmp", IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE);
}
|