Salut,
Sinon tu peux aussi continuer en Win32 sans MFC !
Ca reste le plus performant, polyvalent et portable sous Windows.
Côté productivité, c'est sûr qu'un bon gros RAD genre C++ Builder, Delphi ou VB6, c'est plus rapide pour faire des interfaces simples (Hop, un bouton, hop, un edit...). Mais ça ne facilite en rien les interfaces travaillées telles que celle de outlook.
Et puis les dégradés bleu clair, c'est pas trop dur non plus !
#ifdef UNICODE
#define _T(x) L ## x
typedef unsigned short TCHAR;
#else
#define _T(x) x
typedef char TCHAR;
#endif
#define _WIN32_WINNT 0x0500
#define WINVER 0x0500
#include <windows.h>
HINSTANCE _hThisInstance; /* Handle du module */
HWND _hWnd; /* Handle de la fenêtre */
LPTSTR _lpAppName = _T("Gradient"); /* Nom de l'appli */
TRIVERTEX _lpVertices[2]; /* Les deux coins du rectanles et leurs couleurs */
GRADIENT_RECT _gradientRect; /* Le rectangle de dégradé formé des 2 vertices */
WORD __stdcall Err_ShowLast(TCHAR* lpTitle)
{
DWORD nLastError;
LPTSTR lpMessageBuffer;
nLastError = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(TCHAR*)(void*)&lpMessageBuffer, 0, NULL);
MessageBox(NULL, lpMessageBuffer, lpTitle, MB_OK | MB_ICONERROR);
LocalFree(lpMessageBuffer);
return 1;
}
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
RECT clientRect; /* Zone de la fenêtre à dessiner */
HDC hDc; /* DC de dessin */
int bHandled; /* Pour savoir si le message est traité */
long nResult;
nResult = 0;
bHandled = 0;
switch (nMessage)
{
case WM_SIZE:
InvalidateRect(hWnd, NULL, TRUE);
bHandled = 1;
break;
case WM_ERASEBKGND:
hDc = (HDC)wParam;
GetClientRect(hWnd, &clientRect);
_lpVertices[1].x = clientRect.right;
_lpVertices[1].y = clientRect.bottom;
GradientFill(hDc, _lpVertices, 2, &_gradientRect, 1, GRADIENT_FILL_RECT_V);
nResult = 1;
bHandled = 1;
break;
case WM_DESTROY:
/* On signale que le thread va s'arrêter */
PostQuitMessage(0);
bHandled = 1;
break;
}
if (! bHandled)
nResult = DefWindowProc(hWnd, nMessage, wParam, lParam);
return nResult;
}
BOOL __stdcall CreateMyWindow()
{
WNDCLASSEX wincl; /* Classe de la fenêtre utilisée */
int nResult;
nResult = 0;
/* Création de la classe de fenêtre */
wincl.cbSize = sizeof(WNDCLASSEX);
wincl.style = 0;
wincl.lpfnWndProc = WindowProcedure;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hInstance = _hThisInstance;
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.hbrBackground = NULL;
wincl.lpszMenuName = 0;
wincl.lpszClassName = _lpAppName;
wincl.hIconSm = NULL;
/* Enregistrement de la classe */
if (! RegisterClassEx(&wincl)) goto the_end;
/* Création de la fenêtre */
_hWnd = CreateWindowEx(0, _lpAppName, _lpAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 500, 200,
HWND_DESKTOP, NULL, _hThisInstance, NULL);
if (! _hWnd) goto the_end;
/* Affichage de la fenêtre */
ShowWindow (_hWnd, SW_SHOW);
nResult = 1;
the_end:
return nResult;
}
/**
* Main
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG message; /* Messages envoyés à l'application */
int nResult;
/* Récupération du handle du module */
_hThisInstance = hInstance;
_lpVertices[0].x = 0;
_lpVertices[0].y = 0;
_lpVertices[0].Red = 0xC800;
_lpVertices[0].Green = 0xE100;
_lpVertices[0].Blue = 0xFF00;
_lpVertices[0].Alpha = 0x0000;
_lpVertices[1].x = 0;
_lpVertices[1].y = 0;
_lpVertices[1].Red = 0x7D00;
_lpVertices[1].Green = 0xA500;
_lpVertices[1].Blue = 0xE100;
_lpVertices[1].Alpha = 0x0000;
_gradientRect.UpperLeft = 0;
_gradientRect.LowerRight = 1;
if (! CreateMyWindow())
{
nResult = Err_ShowLast(_T("Cannot create main window"));
goto the_end;
}
/* Boucle de traitement des messages */
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
nResult = message.wParam;
the_end:
return nResult;
}