borisbaski Citation personnelle | Bonjour,
Une bonne âme pourrait elle m'aider ? Je ne comprends pas pourquoi mon code ne marche pas alors que j'ai essayé de suivre les préconisations de la MSDN et de différents forums. Un truc m'échappe...
Pour l'instant, je veux juste écrire un code simple, pour le complexifier par la suite.
Je définis en global : Code :
- #define tailleX 800
- #define tailleY 600
- DWORD tableau[tailleX * tailleY];
|
J'éxécute en premier dans la winmain :
Code :
- for (int i=0;i<tailleX*tailleY;i++) tableau[i]=0x00FF00FF;
|
Et enfin, j'intercepte le message WM_PAINT. Je transforme tableau en hBitmap, puis je le redimensionne pour la fenêtre
Code :
- PAINTSTRUCT ps;
- HDC hdc=BeginPaint(hWnd, &ps);
- RECT tailleFenetre;
- BITMAPINFO bi;
- bi.bmiHeader.biBitCount=32;
- bi.bmiHeader.biClrImportant=0;
- bi.bmiHeader.biClrUsed=0;
- bi.bmiHeader.biCompression=BI_RGB;
- bi.bmiHeader.biHeight=tailleY;
- bi.bmiHeader.biWidth=tailleX;
- bi.bmiHeader.biPlanes=1;
- bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
- bi.bmiHeader.biSizeImage=0;
- bi.bmiHeader.biXPelsPerMeter=0;
- bi.bmiHeader.biYPelsPerMeter=0;
- GetClientRect(hWnd, &tailleFenetre);
- SetStretchBltMode(hdc, HALFTONE);
- HDC hMemDC= CreateCompatibleDC(hdc);
- SetStretchBltMode(hMemDC, HALFTONE);
- HBITMAP hBitmap= CreateDIBitmap(hMemDC, &bi.bmiHeader,CBM_INIT,tableau,&bi,DIB_RGB_COLORS);
- SelectObject(hMemDC, hBitmap);
- StretchBlt(hdc, 0, 0, tailleFenetre.right, tailleFenetre.bottom, hMemDC, 0, 0, tailleX, tailleY, SRCCOPY);
- DeleteObject(hBitmap);
- DeleteDC(hMemDC);
- EndPaint(hWnd, &ps);
- break;
|
J'ai passé 4 heures sur les forums et à reprendre chaque paramétrage un par un pour essayer de comprendre. J'ai essayé d'intercepter les erreurs (aucun appel à une fonction ne renvoie d'erreur). Je m'attends à avoir la zone centrale de ma fenêtre toute violette (0x00ff00ff) et je me retrouve avec une fenêtre toute noire. Code complet :
Code :
- #include "stdafx.h"
- #include "Projet test.h"
- #define MAX_LOADSTRING 100
- #define tailleX 800
- #define tailleY 600
- // Variables globales :
- HINSTANCE hInst; // instance actuelle
- TCHAR szTitle[MAX_LOADSTRING]; // Le texte de la barre de titre
- TCHAR szWindowClass[MAX_LOADSTRING]; // le nom de la classe de fenêtre principale
- DWORD tableau[tailleX * tailleY];
- // Pré-déclarations des fonctions incluses dans ce module de code :
- ATOM MyRegisterClass(HINSTANCE hInstance);
- BOOL InitInstance(HINSTANCE, int);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
- int APIENTRY _tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- UNREFERENCED_PARAMETER(hPrevInstance);
- UNREFERENCED_PARAMETER(lpCmdLine);
- for (int i=0;i<tailleX*tailleY;i++) tableau[i]=0x00FF00FF;
- MSG msg;
- HACCEL hAccelTable;
- // Initialise les chaînes globales
- LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
- LoadString(hInstance, IDC_PROJETTEST, szWindowClass, MAX_LOADSTRING);
- MyRegisterClass(hInstance);
- // Effectue l'initialisation de l'application :
- if (!InitInstance (hInstance, nCmdShow))
- {
- return FALSE;
- }
- hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PROJETTEST));
- // Boucle de messages principale :
- while (GetMessage(&msg, NULL, 0, 0))
- {
- if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- return (int) msg.wParam;
- }
- //
- // FONCTION : MyRegisterClass()
- //
- // BUT : inscrit la classe de fenêtre.
- //
- // COMMENTAIRES :
- //
- // Cette fonction et son utilisation sont nécessaires uniquement si vous souhaitez que ce code
- // soit compatible avec les systèmes Win32 avant la fonction 'RegisterClassEx'
- // qui a été ajoutée à Windows 95. Il est important d'appeler cette fonction
- // afin que l'application dispose des petites icônes correctes qui lui sont
- // associées.
- //
- ATOM MyRegisterClass(HINSTANCE hInstance)
- {
- WNDCLASSEX wcex;
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style = CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc = WndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = hInstance;
- wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PROJETTEST));
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcex.hbrBackground = 0;
- wcex.lpszMenuName = MAKEINTRESOURCE(IDC_PROJETTEST);
- wcex.lpszClassName = szWindowClass;
- wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
- return RegisterClassEx(&wcex);
- }
- //
- // FONCTION : InitInstance(HINSTANCE, int)
- //
- // BUT : enregistre le handle de l'instance et crée une fenêtre principale
- //
- // COMMENTAIRES :
- //
- // Dans cette fonction, nous enregistrons le handle de l'instance dans une variable globale, puis
- // créons et affichons la fenêtre principale du programme.
- //
- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
- {
- HWND hWnd;
- hInst = hInstance; // Stocke le handle d'instance dans la variable globale
- hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
- if (!hWnd)
- {
- return FALSE;
- }
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- return TRUE;
- }
- //
- // FONCTION : WndProc(HWND, UINT, WPARAM, LPARAM)
- //
- // BUT : traite les messages pour la fenêtre principale.
- //
- // WM_COMMAND - traite le menu de l'application
- // WM_PAINT - dessine la fenêtre principale
- // WM_DESTROY - génère un message d'arrêt et retourne
- //
- //
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- case WM_COMMAND:
- int wmId, wmEvent;
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // Analyse les sélections de menu :
- switch (wmId)
- {
- case IDM_ABOUT:
- DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
- break;
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break;
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- HDC hdc=BeginPaint(hWnd, &ps);
- RECT tailleFenetre;
- BITMAPINFO bi;
- bi.bmiHeader.biBitCount=32;
- bi.bmiHeader.biClrImportant=0;
- bi.bmiHeader.biClrUsed=0;
- bi.bmiHeader.biCompression=BI_RGB;
- bi.bmiHeader.biHeight=tailleY;
- bi.bmiHeader.biWidth=tailleX;
- bi.bmiHeader.biPlanes=1;
- bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
- bi.bmiHeader.biSizeImage=0;
- bi.bmiHeader.biXPelsPerMeter=0;
- bi.bmiHeader.biYPelsPerMeter=0;
- GetClientRect(hWnd, &tailleFenetre);
- SetStretchBltMode(hdc, HALFTONE);
- HDC hMemDC= CreateCompatibleDC(hdc);
- SetStretchBltMode(hMemDC, HALFTONE);
- HBITMAP hBitmap= CreateDIBitmap(hMemDC, &bi.bmiHeader,CBM_INIT,tableau,&bi,DIB_RGB_COLORS);
- //HBITMAP hBitmap=CreateCompatibleBitmap(hMemDC, tailleX, tailleY);
- SelectObject(hMemDC, hBitmap);
- SetDIBits(hMemDC, hBitmap, 0, tailleY, tableau, &bi, DIB_RGB_COLORS);
- StretchBlt(hdc, 0, 0, tailleFenetre.right, tailleFenetre.bottom, hMemDC, 0, 0, 15, 15, SRCCOPY);//tailleX, tailleY, SRCCOPY);
- DeleteObject(hBitmap);
- DeleteDC(hMemDC);
- /*
- SetStretchBltMode(hdc, HALFTONE);
- SetBrushOrgEx(hdc, 0, 0, 0);
-
- StretchDIBits(
- hdc,
- 0, 0, 640, 480, //tailleFenetre.right, tailleFenetre.bottom,
- 0, 0, tailleX, tailleY,
- tableau,
- &bi,
- 0,
- 0
- );
- */
- EndPaint(hWnd, &ps);
- break;
- }
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
- // Gestionnaire de messages pour la boîte de dialogue À propos de.
- INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- UNREFERENCED_PARAMETER(lParam);
- switch (message)
- {
- case WM_INITDIALOG:
- return (INT_PTR)TRUE;
- case WM_COMMAND:
- if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
- {
- EndDialog(hDlg, LOWORD(wParam));
- return (INT_PTR)TRUE;
- }
- break;
- }
- return (INT_PTR)FALSE;
- }
|
|