?
Hallo ich hab ein problem mit der GDI+:
Wenn ich etwas zeichnen will bleibt der Bildschirm weiß
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <ole2.h>
#include <gdiplus.h>
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdiplus.lib")
#define _T(x) TEXT(x)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
INT CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCommandLine, INT nCmdShow)
{
WNDCLASSEX wndc = {0};
wndc.cbSize = sizeof(wndc);
wndc.lpszClassName = _T("TestClass");
wndc.lpfnWndProc = WndProc;
wndc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wndc.hIcon = LoadIcon(0, IDI_APPLICATION);
wndc.hCursor = LoadCursor (NULL, IDC_ARROW);
ULONG ul1;
Gdiplus::GdiplusStartupInput gsi;
gsi.GdiplusVersion = 1;
Gdiplus::GdiplusStartupOutput gso = {0};
Gdiplus::GdiplusStartup(&ul1, &gsi, &gso);
RegisterClassEx(&wndc);
HWND hWnd = CreateWindowEx(WS_EX_APPWINDOW, _T("TestClass"), _T("TestWindow"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 600, NULL, NULL, NULL, NULL);
ShowWindow(hWnd, SW_NORMAL);
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnregisterClass(wndc.lpszClassName, NULL);
Gdiplus::GdiplusShutdown(ul1);
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
using namespace Gdiplus;
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hWnd);
return 0;
case WM_QUIT:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);
Graphics* gr = new Graphics(hWnd);
SolidBrush* br1 = new SolidBrush(Color::Red);
SolidBrush* br2 = new SolidBrush(Color::Green);
SolidBrush* br3 = new SolidBrush(Color::Yellow);
SolidBrush* br4 = new SolidBrush(Color::Blue);
gr->Clear(Color::White);
// Nummer 1
Rect rects1[] =
{
Rect(25, 25, 25, 150),
Rect(50, 25, 50, 25),
Rect(75, 50, 25, 50),
Rect(50, 75, 25, 25)
};
gr->FillRectangles(br1, rects1, sizeof(rects1) / sizeof(Rect));
// Nummer 2
Rect rects2[] =
{
Rect(125, 25, 25, 25),
Rect(125, 75, 25, 100)
};
gr->FillRectangles(br2, rects2, sizeof(rects2) / sizeof(Rect));
// Nummer 3
Rect rects3[] =
{
Rect(175, 25, 25, 100),
Rect(200, 125, 25, 50),
Rect(225, 25, 25, 100)
};
gr->FillRectangles(br3, rects3, sizeof(rects3) / sizeof(Rect));
// Nummer 4
Rect rects4[] =
{
Rect(275, 25, 25, 150)
};
gr->FillRectangles(br4, rects4, sizeof(rects4) / sizeof(Rect));
PointF pts[] =
{
PointF(300, 75),
PointF(300, 100),
PointF(350, 50),
PointF(350, 25)
};
gr->FillPolygon(br4, pts, sizeof(pts) / sizeof(PointF));
pts[0].Y += 25;
pts[1].Y += 25;
pts[2].Y += 125;
pts[3].Y += 125;
gr->FillPolygon(br4, pts, sizeof(pts) / sizeof(PointF));
// Nummer 5
RectF rects5[] =
{
RectF(375, 25, 25, 150),
RectF(400, 25, 50, 25),
RectF(400, 87.5f, 50, 25),
RectF(400, 150, 50, 25)
};
gr->FillRectangles(br1, rects5, sizeof(rects1) / sizeof(Rect));
// Nummer 6
Rect rects6[] =
{
Rect(25, 200, 25, 150)
};
gr->FillRectangles(br2, rects6, sizeof(rects4) / sizeof(Rect));
for(int i = 0; i < 4; i++)
pts[i].Y += 175, pts[i].X -= 250;
gr->FillPolygon(br2, pts, sizeof(pts) / sizeof(PointF));
pts[0].Y -= 25;
pts[1].Y -= 25;
pts[2].Y -= 125;
pts[3].Y -= 125;
gr->FillPolygon(br2, pts, sizeof(pts) / sizeof(PointF));
// Nummer 7
Rect rects7[] =
{
Rect(125, 200, 25, 150),
Rect(150, 200, 25, 25),
Rect(175, 200, 25, 150),
Rect(150, 250, 25, 25)
};
gr->FillRectangles(br3, rects7, sizeof(rects7) / sizeof(Rect));
// Nummer 8
Rect rects8[] =
{
Rect(225, 200, 25, 150),
Rect(300, 200, 25, 150)
};
gr->FillRectangles(br4, rects8, sizeof(rects8) / sizeof(Rect));
PointF pts1[] =
{
PointF(250, 200),
PointF(300, 300),
PointF(300, 350),
PointF(250, 250)
};
gr->FillPolygon(br4, pts1, sizeof(pts1) / sizeof(PointF));
// Nummer 9
rects8[0].X += 125;
rects8[1].X += 125;
for(int i = 0; i < 4; i++)
pts1[i].X += 125;
gr->FillRectangles(br4, rects8, sizeof(rects8) / sizeof(Rect));
gr->FillPolygon(br4, pts1, sizeof(pts1) / sizeof(PointF));
// Nummer 10
rects8[0].X = 25;
rects8[1].X = 100;
rects8[0].Y += 175;
rects8[1].Y += 175;
for(int i = 0; i < 4; i++)
pts1[i].X -= 325, pts1[i].Y += 175;
gr->FillRectangles(br1, rects8, sizeof(rects8) / sizeof(Rect));
gr->FillPolygon(br1, pts1, sizeof(pts1) / sizeof(PointF));
// Nummer 11
rects2[0].X = 150;
rects2[1].X = 150;
rects2[0].Y += 350;
rects2[1].Y += 350;
gr->FillRectangles(br2, rects2, sizeof(rects2) / sizeof(Rect));
// Nummer 12
RectF rects9[] =
{
RectF(200, 375, 25, 150),
RectF(225, 375, 50, 25),
RectF(225, 500, 50, 25)
};
gr->FillRectangles(br3, rects9, sizeof(rects9) / sizeof(Rect));
// Nummer 13
RectF rects10[] =
{
RectF(300, 375, 25, 150),
RectF(325, 437, 25, 25),
RectF(350, 375, 25, 150)
};
gr->FillRectangles(br4, rects10, sizeof(rects9) / sizeof(Rect));
// Nummer 14
RectF rects11[] =
{
RectF(400, 375, 75, 25),
RectF(425, 375, 25, 150)
};
gr->FillRectangles(br1, rects11, sizeof(rects11) / sizeof(Rect));
// Nummer 15
RectF rects12[] =
{
RectF(500, 375, 75, 25),
RectF(500, 400, 25, 50),
RectF(525, 425, 50, 25),
RectF(550, 450, 25, 50),
RectF(500, 500, 75, 25)
};
gr->FillRectangles(br2, rects12, sizeof(rects12) / sizeof(Rect));
delete gr;
delete br1;
delete br2;
delete br3;
delete br4;
EndPaint(hWnd, &ps);
return 0;
}
default:
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
Ich bin für jede hilfe dankbar