Hallo alle zusammen,
ich habe ein Problem und hoffe ihr könnt mir helfen.
Also Grundproblem:
Ich soll mit der WinAPi ein von einer externen Software berechnetes 3D - Wellenbild grafisch darstellen. Dafür baue ich mir eine 2dimensionale Matrix auf die dann dann über eine 2D-Array die Höheninformationen erhält die anschließend dann als Farbiges Feld ausgegeben werden sollen, wobei die Farbe abhängig von der Höhe ist.
Aktuell arbeite ich an der optischen Aufbau der Matrix. Ich habe für Testwecken mir ein Feld von 100x100 Rechtecken aufgebaut sowie eine Funktion die dynamisch die Farbe ändert. Den Quellcode findet ihr im Anhang.
Ich hab dabei nun 2 Probleme.
1. Wie kann ich von den Rechtecken den Rand entfernen, so das es am Ende bei gleicher Farbe wie ein großes Rechteck aussieht?
2. Das Bild flackert ziemlich. Ich hab gelesen das man das durch oppelbuffering verhindern kann, aber kein Vernünftiges Material dazu gefunden, vielleicht könnte mir das jemand ganz kurz erklären.
Und achja ich MUSS es mit WinAPI machen, klare Aneisung von oben, gibts kein drumrum.
Mein Code:
ich habe ein Problem und hoffe ihr könnt mir helfen.
Also Grundproblem:
Ich soll mit der WinAPi ein von einer externen Software berechnetes 3D - Wellenbild grafisch darstellen. Dafür baue ich mir eine 2dimensionale Matrix auf die dann dann über eine 2D-Array die Höheninformationen erhält die anschließend dann als Farbiges Feld ausgegeben werden sollen, wobei die Farbe abhängig von der Höhe ist.
Aktuell arbeite ich an der optischen Aufbau der Matrix. Ich habe für Testwecken mir ein Feld von 100x100 Rechtecken aufgebaut sowie eine Funktion die dynamisch die Farbe ändert. Den Quellcode findet ihr im Anhang.
Ich hab dabei nun 2 Probleme.
1. Wie kann ich von den Rechtecken den Rand entfernen, so das es am Ende bei gleicher Farbe wie ein großes Rechteck aussieht?
2. Das Bild flackert ziemlich. Ich hab gelesen das man das durch oppelbuffering verhindern kann, aber kein Vernünftiges Material dazu gefunden, vielleicht könnte mir das jemand ganz kurz erklären.

Und achja ich MUSS es mit WinAPI machen, klare Aneisung von oben, gibts kein drumrum.

Mein Code:
Code:
#define STRICT
#include <Windows.h>
#include <math.h>
const char szAppName[] = "drawObect";
#define ID_TIMER_COLOR 1
const double pi = 3.14159;
int ifarbe = 255;
bool bchange = true;
LRESULT CALLBACK WndProc(
HWND,
UINT,
WPARAM,
LPARAM);
int WINAPI WinMain (
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName = szAppName;
wc.lpszMenuName = NULL;
RegisterClass(&wc);
hWnd = CreateWindow(
szAppName,
"DrawObject",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
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 RECT rect;
static double dGrad;
switch (message)
{
case WM_CREATE:
{
SetTimer(hWnd, ID_TIMER_COLOR, 30, NULL);
return 0;
}
case WM_SIZE:
{
rect.right = LOWORD(lParam);
rect.bottom = HIWORD(lParam);
return 0;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC;
hDC = BeginPaint(hWnd, &ps);
{
HBRUSH hOldBrush;
for (int j = 0; j <=100; j++) {
for (int i = 0; i <=100; i++) {
hOldBrush = (HBRUSH)SelectObject(hDC,
CreateSolidBrush(RGB(ifarbe,ifarbe,225)));
RoundRect(hDC, rect.left + rect.right / 100 *i , rect.top + rect.bottom/5 + rect.bottom / 100 *j ,
rect.left + rect.right / 100 + rect.right / 100 *i , rect.top + rect.bottom / 100 + rect.bottom/5 + rect.bottom / 100 *j , 0, 0);
DeleteObject(SelectObject(hDC, hOldBrush));
}
}
}
EndPaint(hWnd, &ps);
return 0;
}
case WM_TIMER:
{
switch (wParam)
{
case ID_TIMER_COLOR:
{
if (ifarbe == 0)
bchange = false;
if (ifarbe == 255)
bchange = true;
if (bchange == true)
ifarbe--;
else
ifarbe++;
InvalidateRect(
hWnd,
NULL,
TRUE);
break;
}
}
return 0;
}
case WM_DESTROY:
{
KillTimer(hWnd, ID_TIMER_COLOR);
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hWnd, message, wParam, lParam);
}