powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / win api
4 сообщений из 4, страница 1 из 1
win api
    #38007449
jacky22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу разобраться как сделать что бы при рисовании фигуры изменение размера фигур прорисовывалось, знаю что делается это посредством WM_MOUSEMOVE но как именно не пойму.
main.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
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
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
#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++;
};
...
Рейтинг: 0 / 0
win api
    #38007461
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не будет вычитывать ваши 100500 строк. Соберите минимальный проект, в котором будет воспроизводиться ваша проблема и запостите.

jacky22что бы при рисовании фигуры изменение размера фигур прорисовывалось
лично мне не понятен смысл этой фразы. Вы хотите, чтобы фигура изменяла свой масштаб в динамике при движении мышки или что? Если первое, то алгоритм должен быть такой:

1. Рисуем фигуру в первоначальном состоянии.
2. Таймаут
3. while (не достигнут нужный масштаб)
4. Стираем фигуру в первоначальном состоянии.
5. Рисуем фигуру в следующем состоянии, в большем или меньшем масштабе, в сравнении с предыдущим состоянием
6. Таймаут
7. goto 3

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
		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);
			}
		}



Зачем здесь LineTo, если она не двигается дальше MoveTo?
...
Рейтинг: 0 / 0
win api
    #38007468
jacky22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, жмешь на левую кнопку мыши фиксируется нач точка затем тянем и допустим круг прорисовывался при перемещении мышки. Ну как в paint, а у меня жму кнопку перемещаю и ничего не происходит отпускаю и только тогда рисуется круг.
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;
}
}
...
Рейтинг: 0 / 0
win api
    #38007473
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / win api
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]