L
Danke.
Problem:
Wenn ich Weiß in Stärke 1, 3 und 5 px und Schwar in Stärke 1, 3 und 5 px im bild habe,
ein wenig male... und dann paar mal -schneller- hintereinander RECHTSKLICK mache, also bild resetten, verschwinden die Formatiereungen.
Meine Struktur
struct paintHist
{
POINT pointToPaint;
int cRed;
int cYellow;
int cBlue;
int width;
BOOL isBreak;
struct paintHist *next;
};
WndProc
LRESULT CALLBACK WndProc( HWND myWnd, UINT givenMessage, WPARAM wParam, LPARAM lParam )
/*
This function recieves the Messages, wich are given from MS-Windows to the program.
So the program can do message specific actions, if this message is incoming.
*/
{
PAINTSTRUCT myPaint;
//Handle für Gerätekontext(gültiger Zeichenbereich)
BOOL visitMsg = FALSE;
static POINT myPoint,
mousePointForPaint;
static RECT myRect,
parent;
static COORD mouseKoord;
HANDLE backUp;
char version[50];
struct paintHist *akt;
if( LOWORD(lParam) != 0 || HIWORD(lParam) != 0)
{
mouseKoord.X = LOWORD(lParam); //took the mouse-coordinates into a COORD variable (perfomance)
mouseKoord.Y = HIWORD(lParam);
}
switch( givenMessage )
{
case WM_CREATE:
myPoint.x = -1;
myPoint.y = -1;
GetClientRect( myAppWnd, &parent );
bClose = CreateWindow( "BUTTON", "Close", WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top, 50, 20, myWnd, (HMENU)CLOSE, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
bBlack = CreateWindow( "BUTTON", "black", WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top+30, 50, 20, myWnd, (HMENU)cBLACK, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
bWhite = CreateWindow( "BUTTON", "white", SS_NOTIFY | WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top+50, 50, 20, myWnd, (HMENU)cWHITE, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
strcpy( version, "Version: " );
strcat( version, VERSION );
versionWnd = CreateWindow( "STATIC", version, WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left+630, parent.bottom+555, 165, 20, myWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
bSmall = CreateWindow( "BUTTON", " 1px", WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top+75, 40, 22, myWnd, (HMENU)sSMALL, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
bMiddle = CreateWindow( "BUTTON", " 3px", WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top+97, 40, 22, myWnd, (HMENU)sMIDDLE, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
bBig = CreateWindow( "BUTTON", " 5px", WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top+119, 40, 22, myWnd, (HMENU)sBIG, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
visitMsg = TRUE;
break;
case WM_SIZE:
myRect.left = 0;
myRect.top = 0;
myRect.bottom = HIWORD( lParam );
myRect.right = LOWORD( lParam );
visitMsg = TRUE;
break;
case WM_PAINT:
myHdc = BeginPaint( myWnd, &myPaint ); //open device-context (paintplace)
{
backUp = SelectObject( myHdc, *aktPen );
akt = first;
while( NULL != akt->next )
{
if( akt->isBreak != TRUE )
{
DeleteObject( aktPen );
*aktPen = CreatePen(
PS_SOLID,
akt->width,
RGB(
akt->cRed,
akt->cYellow,
akt->cBlue
)
);
SelectObject( myHdc, *aktPen );
MoveToEx(
myHdc, //Zeichenfläche
akt->pointToPaint.x, //X-Koordinate
akt->pointToPaint.y, //Y-Koordinate
NULL //old-Koordinate
);
LineTo(
myHdc, //Zeichenfläche
akt->next->pointToPaint.x, //X-Koordinate
akt->next->pointToPaint.y //Y-Koordinate
);
}
akt = akt->next;
}
SelectObject( myHdc, backUp );
}
EndPaint( myWnd, &myPaint );
visitMsg = TRUE;
break;
case WM_MOUSEMOVE:
myHdc = GetDC( myWnd ); //open device-context (paintplace)
{
if( wParam == MK_LBUTTON )
{
if( myPoint.x != -1 )
{
myPoint.x = mouseKoord.X; //set new coordinates
myPoint.y = mouseKoord.Y;
akt = last;
if( NULL == first->next )
{
akt = first;
akt->pointToPaint.x = myPoint.x;
akt->pointToPaint.y = myPoint.y;
akt->cRed = R;
akt->cYellow = G;
akt->cBlue = B;
akt->width = aktWidth;
akt->next = NULL;
last = akt;
}
if( NULL != ( akt->next = malloc( sizeof( struct paintHist ) ) ) )
{
if( last->isBreak != TRUE )
{
backUp = SelectObject( myHdc, *aktPen );
MoveToEx(
myHdc, //Zeichenfläche
last->pointToPaint.x, //X-Koordinate
last->pointToPaint.y, //Y-Koordinate
NULL //old-Koordinate
);
LineTo(
myHdc, //Zeichenfläche
myPoint.x, //X-Koordinate
myPoint.y //Y-Koordinate
);
SelectObject( myHdc, backUp );
}
akt = akt->next;
akt->pointToPaint.x = myPoint.x;
akt->pointToPaint.y = myPoint.y;
akt->cRed = R;
akt->cYellow = G;
akt->cBlue = B;
akt->width = aktWidth;
akt->next = NULL;
last = akt;
}
//InvalidateRect( myWnd, NULL, TRUE);
}
else
{
myPoint.x = mouseKoord.X;//The first coordinates
myPoint.y = mouseKoord.Y;
}
}
visitMsg = TRUE;
}
ReleaseDC( myWnd, myHdc );
break;
case WM_LBUTTONUP:
akt = last;
if( NULL != ( akt->next = malloc( sizeof( struct paintHist ) ) ) )
{
akt = akt->next;
akt->pointToPaint.x = myPoint.x;
akt->pointToPaint.y = myPoint.y;
akt->cRed = R;
akt->cYellow = G;
akt->cBlue = B;
akt->width = aktWidth;
akt->next = NULL;
akt->isBreak = TRUE;
last = akt;
}
myPoint.y = -1;
myPoint.x = -1;
visitMsg = TRUE;
break;
case WM_RBUTTONDOWN:
DeleteObject( whitePen );
DeleteObject( blackPen );
setGlobalVars();
InvalidateRect(
myWnd,
NULL,
TRUE
);
visitMsg = TRUE;
break;
case WM_COMMAND:
switch( LOWORD(wParam) )
{
case CLOSE:
SendMessage( myAppWnd, WM_DESTROY, 0, 0 );
visitMsg = TRUE;
break;
case cWHITE:
aktPen = &whitePen;//slect white pen
R = 255;
G = 255;
B = 255;
visitMsg = TRUE;
break;
case cBLACK:
aktPen = &blackPen;//slect white pen
R = 0;
G = 0;
B = 0;
visitMsg = TRUE;
break;
case sSMALL:
DeleteObject( aktPen );
*aktPen = CreatePen( PS_SOLID, 1, RGB( R, G, B ) );
aktWidth = 1;
visitMsg = TRUE;
break;
case sMIDDLE:
DeleteObject( aktPen );
*aktPen = CreatePen( PS_SOLID, 3, RGB( R, G, B ) );
aktWidth = 3;
visitMsg = TRUE;
break;
case sBIG:
DeleteObject( aktPen );
*aktPen = CreatePen( PS_SOLID, 5, RGB( R, G, B ) );
aktWidth = 5;
visitMsg = TRUE;
break;
default:
;
break;
}
break;
case WM_DESTROY:
ShowWindow( myConsole, SW_SHOWNOACTIVATE );
//SendMessage( myConsole, WM_CLOSE, 0, 0 );
PostQuitMessage( 0 );
break;
default:
break;
}
if( visitMsg )
return 0;
else
return DefWindowProc( myWnd, givenMessage, wParam, lParam );
}
Globale Variablen:
//Globale Variablen
HINSTANCE myHandleInst;
HWND myConsole,
myAppWnd,
bClose,
bBlack,
bWhite,
versionWnd,
bSmall,
bMiddle,
bBig;
HPEN whitePen,
blackPen;
HPEN *aktPen;
HDC myHdc;
int R,
G,
B,
aktWidth;
Ich verstehe dass nicht, aber eventuell Ihr...
DANKe für alle bisherigen Posts und die Gedult.