ВОПРОС · Q&A

Win Api Рисование

1 ответов 3,7 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор вопроса
Не могу разобраться как сделать что бы при рисовании фигуры изменение размера фигур прорисовывалось, знаю что делается это посредством WM_MOUSEMOVE но как именно не пойму.
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++;
};
 
чето я непонял что ты хочешь
WM_MOUSEMOVE - Это событие перемещения мыши, скорее всего.
Что значит "изменение размера прорисовывалось" ?