Новичок
Профиль
Группа: Участник
Сообщений: 47
Регистрация: 27.3.2011
Репутация: нет Всего: нет
|
Не могу разобраться как сделать что бы при рисовании фигуры изменение размера фигур прорисовывалось, знаю что делается это посредством WM_MOUSEMOVE но как именно не пойму. main.cpp Код | 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;ldkfjs;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 Код | #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++; };
|
|