/*------------------------------------------------------------
Texel (www.texel.fr.fm) 2001
API WIN32
Les bases - Chapitre 3 - Le GDI
Affiche une image bmp et du texte
------------------------------------------------------------*/
#include <windows.h>
#include <stdio.h>
int k=0;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static CHAR szAppName[] ="Salut" ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = NULL;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Problème!"),szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // nom de la classe
"Réalité Virtuelle", // titre de la fenêtre
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
| WS_MINIMIZEBOX | WS_VISIBLE , // style de la fenêtre
CW_USEDEFAULT, // position initiale en x
CW_USEDEFAULT, // position initiale en y
190, // largeur initiale
180, // hauteur initiale
NULL, // handle de la fenêtre mère
NULL, // handle du menu de la fenêtre
hInstance, // handle de l'instance
NULL) ; // paramètres de création
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hbitmap; // pour le bitmap
switch (message)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:
// creation d'un rectangle
RECT rect;
rect.top=0;
rect.left=20;
rect.bottom=115;
rect.right=52;
// maintenant k change la valeur des couleurs des pixels
k+=50;
if(k>250) k=0;
// on demande à redessiner la zone de rect avec un message WM_PAINT
InvalidateRect(hwnd,&rect,FALSE);
// c'est plus beau de ne pas effacer la zone avant de la redessiner
// cela évite les clignotements
break;
case VK_ESCAPE:
DestroyWindow(hwnd);
break;
default:
break;
}
break;
case WM_PAINT:
HDC hdc;HDC hdcMemory;
PAINTSTRUCT ps;
hdc=BeginPaint(hwnd,&ps); // obtient un handle de contexte de périphérique
// un peu de texte
SetBkColor(hdc,RGB(0,0,255));
SetTextColor(hdc,RGB(255,255,0));
TextOut(hdc,10,3,"Texte ->",strlen("Texte ->"));
char tab[20];
SetTextAlign(hdc,TA_RIGHT | TA_TOP );
SetBkColor(hdc,RGB(0,255,200));
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,170,3,tab,sprintf(tab,"<- Texte")); // sprintf renvoit la longueur de la chaîne
SetTextAlign(hdc,TA_LEFT | TA_TOP );
SetBkColor(hdc,RGB(255,0,0));
SetTextColor(hdc,RGB(30,30,30));
TextOut(hdc,20,125,"Pressez flèche haut ",strlen("Pressez flèche haut "));
// un bitmap
BITMAP bm;
hbitmap=(HBITMAP) LoadImage(NULL,"image.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hdcMemory=CreateCompatibleDC(NULL);
SelectObject(hdcMemory,hbitmap);
GetObject(hbitmap,sizeof(bm),&bm);
BitBlt(hdc,20,20,bm.bmWidth,bm.bmHeight,hdcMemory,0,0,SRCCOPY);
// Zoom sur la partie supérieur droite
StretchBlt(hdc,55,20,100,100,hdcMemory,16,16,16,16,SRCCOPY);
DeleteDC(hdcMemory);
// On affiche un petit pixel
int i,j;
for(j=0;j<=32;j++)
for(i=0;i<=60;i++)
SetPixel(hdc,20+j,55+i,RGB(i*4,j*4,k+4));
EndPaint(hwnd,&ps); // libère un handle de contexte de périphérique
break;
case WM_DESTROY:
DeleteObject(hbitmap);
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}