1
123456789igor
Не могу разобраться как сделать что бы при рисовании фигуры изменение размера фигур прорисовывалось, знаю что делается это посредством WM_MOUSEMOVE но как именно не пойму.
main.cpp
shape.cpp
main.cpp
C++:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
OPENFILENAME ofn;
char szFileName[MAX_PATH];
LPTSTR szFile = L"sdfsjd;lfksjd;flksjdfl;skdjf;sldkfjs;ldkfjs;dlfkjs;dflksdjf;lskdjf;lsdkfjs;l
dkfjs;ldfl";
static HBRUSH hBrush;
static HENHMETAFILE file1 = 0;
static int nextshape = 0;
static vector <Shape *> allshape;
static vector <Shape *> deletedshape;
static int countshape = 0;
//static BOOL mLine=FALSE, mRecttangle=FALSE, Ellips=FALSE, mCircle=FALSE, PAINTING=FALSE;
static Shape *shape = NULL;
POINT xy;
switch (message)
{
case WM_PAINT:
for( int i = 0; i < countshape; i++ )
allshape[i]->draw(hdc);
break;
case WM_LBUTTONDOWN:
if( shape == NULL )
{
deletedshape.clear();
switch (nextshape)
{
case 0: shape = new mRectangle(); break;
case 1: shape = new mCircle(); break;
case 2: shape = new mTriangle(); break;
case 3: shape = new mPolygon();
allshape.push_back(shape);
countshape++; break;
case 4: shape = new mText(); break;
case 5: shape = new mLine(); break;
case 6: shape = new elips(); break;
};
};
xy.x=LOWORD(lParam); //узнаём координаты
xy.y=HIWORD(lParam);
shape->addpoint(xy,1);
break;
case WM_LBUTTONUP:
xy.x=LOWORD(lParam); //узнаём координаты
xy.y=HIWORD(lParam);
shape->addpoint(xy, 1);
if( shape->allow() )
shape->addpoint(xy,1);
else
{
allshape.push_back( shape );
countshape++;
shape = NULL;
};
InvalidateRect(hWnd, NULL, false);
UpdateWindow(hWnd);
break;
case WM_RBUTTONDOWN:
if( (nextshape == 3) && (shape != NULL) )
{
xy.x = 0;
xy.y = 0;
shape->addpoint( xy, 0 );
shape = NULL;
InvalidateRect(hWnd, NULL, false);
UpdateWindow(hWnd);
};
break;
case WM_MOUSEMOVE:
if(MK_LBUTTON==wParam)
{
if (nextshape = 5)
{
xy.x=LOWORD(lParam); //узнаём координаты
xy.y=HIWORD(lParam);
hdc = GetDC(hWnd);
MoveToEx(hdc, xy.x, xy.y, NULL);
LineTo(hdc, xy.x, xy.y);
ReleaseDC(hWnd, hdc);
}
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 1201: nextshape = 1; break;
case 1211: nextshape = 0; break;
case 1202: nextshape = 5; break;
case 1203: nextshape = 6; break;
case 1213: nextshape = 3; break;
case 1103: PostQuitMessage(0); break;
case 1301: if(countshape <= 0 ) break;
deletedshape.push_back(allshape[countshape-1]);
countshape--;
allshape.pop_back();
InvalidateRect(hWnd, NULL, false);
UpdateWindow(hWnd); break;
case 1302: if( deletedshape.size() <= 0 ) break;
allshape.push_back(deletedshape[deletedshape.size()-1]);
countshape++;
deletedshape.pop_back();
InvalidateRect(hWnd, NULL, false);
UpdateWindow(hWnd); break;
case 1104:
RECT rc;
rc.left = 0;
rc.right = GetDeviceCaps(hdc, HORZRES);
rc.top = 0;
rc.bottom = GetDeviceCaps(hdc, VERTRES);
int iWidthMM;
iWidthMM = GetDeviceCaps(hdc, HORZSIZE);
int iHeightMM;
iHeightMM = GetDeviceCaps(hdc, VERTSIZE);
int iWidthPels;
iWidthPels = GetDeviceCaps(hdc, HORZRES);
int iHeightPels;
iHeightPels = GetDeviceCaps(hdc, VERTRES);
rc.left = (rc.left * iWidthMM * 100)/iWidthPels;
rc.top = (rc.top * iHeightMM * 100)/iHeightPels;
rc.right = (rc.right * iWidthMM * 100)/iWidthPels;
rc.bottom = (rc.bottom * iHeightMM * 100)/iHeightPels;
OPENFILENAME ofn;
char szFileName[MAX_PATH];
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = (LPCWSTR)L"EMF (*.emf)\0*.emf\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = (LPWSTR)szFileName;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = (LPCWSTR)L"emf";
GetSaveFileName(&ofn);
filehdc = CreateEnhMetaFile( NULL, ofn.lpstrFile, &rc, NULL);
break;
case 1102:
hBrush = ( HBRUSH ) GetStockObject( HOLLOW_BRUSH );//настройка кисти
SelectObject( filehdc, hBrush );
for( int j = 0; j < countshape; j++ )
{
allshape[j]->draw(filehdc);
}
CloseEnhMetaFile(filehdc);
break;
case 1101:
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = (LPCWSTR)L"EMF (*.emf)\0*.emf\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = (LPWSTR)szFileName;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = (LPCWSTR)L"emf";
GetOpenFileName( &ofn );
file1 = GetEnhMetaFile(ofn.lpstrFile);
RECT newrc;
newrc.left = 0;
newrc.right = GetDeviceCaps(hdc, HORZRES);
newrc.top = 0;
newrc.bottom = GetDeviceCaps(hdc, VERTRES);
PlayEnhMetaFile(hdc, file1, &newrc);
CloseEnhMetaFile(filehdc);
break;
case 5555:
//RECT lpRect;
ENHMFENUMPROC lpEnhMetaFunc;
LPVOID lpData;
EnumEnhMetaFile(hdc, file1, lpEnhMetaFunc, lpData, &rc);
break;
};
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
int CALLBACK EnhMetaFileProc (HDC hdc, HANDLETABLE * lpHTable, const ENHMETARECORD * lpEMFR, int nObj, LPARAM lpData)
{
PostQuitMessage(0);
return 0;
};
void writeEMF(vector <Shape *> allshape, HDC filehdc)
{
}
shape.cpp
C++:
#include "Shape.h"
Shape::Shape(void)
{
countSide = 0;
side.clear();
};
Shape::~Shape(void)
{
side.clear();
};
void Shape::errase(HDC hdc)
{
//HPEN hPen = CreatePen(PS_SOLID, 3, RGB(0,0,0));
//SelectObject(hdc, hPen);
//draw(hdc);
//delete hPen;
//hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
//SelectObject(hdc, hPen);
//delete hPen;
};
int Shape::allow(void)
{
if( countSide < 2 )
return 1;
else
return 0;
};
void Shape:: addpoint(POINT xy, int fin)
{
if( countSide < 2 )
{
countSide ++;
side.push_back(xy);
};
};
mPolygon:: mPolygon(void)
{
h = NULL;
fin = 1;
};
int mPolygon:: allow(void)
{
return fin;
};
void mPolygon:: addpoint(POINT xy, int finish)
{
if( finish == 1 )
{
countSide++;
side.push_back(xy);
}
else
{
h = new POINT[countSide+1];
for( int i = 0; i < countSide; i++ )
{
h[i].x = side[i].x;
h[i].y = side[i].y;
};
h[countSide].x = side[0].x;
h[countSide].y = side[0].y;
countSide++;
side.clear();
fin = 0;
};
};
void mPolygon:: draw(HDC hdc)
{
if( (h != NULL) && (fin == 1) )
{
delete h;
h = NULL;
};
if( fin == 0 )
Polyline(hdc, h, countSide);
else
{
h = new POINT[countSide];
for( int i = 0; i < countSide; i++ )
{
h[i].x = side[i].x;
h[i].y = side[i].y;
};
Polyline(hdc, h, countSide);
};
};
void mRectangle:: draw(HDC hdc)
{
if( countSide > 1 )
Rectangle(hdc, side[0].x, side[0].y, side[1].x, side[1].y);
};
void mCircle:: draw(HDC hdc)
{
Ellipse(hdc, side[0].x, side[0].y, side[1].x, side[1].y);
};
void mTriangle:: draw(HDC hdc)
{
POINT h[4];
for( int i = 0; i < 3; i++ )
{
h[i].x = side[i].x;
h[i].y = side[i].y;
};
h[3].x = side[0].x;
h[3].y = side[0].y;
Polyline(hdc, h, 4);
};
void mTriangle:: addpoint(POINT, int fin)
{
};
void mLine:: draw(HDC hdc)
{
if( countSide == 2 )
Polyline(hdc, h, 2);
};
void mLine:: addpoint(POINT xy, int fin)
{
if( countSide < 2 )
{
h[countSide].x = xy.x;
h[countSide].y = xy.y;
};
countSide++;
};