Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2010, 09:18   #1
ExPeL
 
Регистрация: 21.10.2010
Сообщений: 5
По умолчанию Ошибка в дебаге cxx0030

Код удачно компилится, но не отрисовывает фигуры. В дебаге значения hdc, hWnd, hdcClient - "unused CXX0030: Error: expression cannot be evaluated". Из гуглов стало известно что такая ошибка часто происходит из-за настроек оптимизации. Пробовал отключать их, но проблема осталась. Прошу помочь разобраться с этим, вот код программы :

Код:
class Figure
{
protected:
	int nVert;
	TRIVERTEX* vertice;
public:
	Figure(TRIVERTEX* v, int n)
	{
		vertice = new TRIVERTEX[n];
		for(int i = 0; i < nVert; i++)
			vertice[i] = v[i];
	}
	void Move(int dx, int dy)
	{
		for (int i=0; i < nVert; i++)
		{
			vertice[i].x += dx;
			vertice[i].y += dy;
		}
	}

	virtual void Draw(HDC hdc) = 0;
	virtual bool IsCursorIn(POINT p) = 0;
};

class FigureTria : public Figure
{
	GRADIENT_TRIANGLE tria;
public:
	FigureTria(TRIVERTEX* v, int n) : Figure(v, n)
	{
		tria.Vertex1 = 0;
		tria.Vertex2 = 1;
		tria.Vertex3 = 2;
	}
	void Draw(HDC hdc) 
	{ 
		GradientFill(hdc, vertice, 4, &tria, 1, GRADIENT_FILL_TRIANGLE); 
	}		
	bool IsCursorIn(POINT p)
	{
		POINT pts[] = 
		{
			{ vertice[0].x, vertice[0].y },
			{ vertice[1].x, vertice[1].y },
			{ vertice[2].x, vertice[2].y }
		};
		return PtInRegion(CreatePolygonRgn(pts, 3, WINDING), p.x, p.y) == TRUE;
	}
};

class FigureRect : public Figure
{
	GRADIENT_RECT rect;
public:
	FigureRect(TRIVERTEX* v, int n) : Figure(v, n)
	{
		rect.UpperLeft = 0;
		rect.LowerRight = 1;
	}
	void Draw(HDC hdc) 	//Рисуем градиент
	{
		GradientFill(hdc, vertice, 2, &rect, 1, GRADIENT_FILL_RECT_H);
	}		

	bool IsCursorIn(POINT p) 
	{ 
		RECT r = { vertice[0].x, vertice[0].y, vertice[1].x, vertice[1].y }; 
		return PtInRect(&r, p)==TRUE; 
	}
};

class Figures
{
	vector<Figure*> figures;
public:
	void Add(Figure* f) { figures.push_back(f); }
	void Draw(HDC hdc)
	{
		for (int i = 0; i < (int)figures.size(); i++)
			figures[i]->Draw(hdc);
	}
	Figure* GetDragged(POINT p)
	{
		for (int i = figures.size() - 1; i >= 0; i--)
		{
			if (figures[i]->IsCursorIn(p))
			{
				Figure* dragged = figures[i];
				figures[i] = figures[0];
				figures[0] = dragged;
				return dragged;
			}
		}
		return 0;
	}
};
ExPeL вне форума Ответить с цитированием
Старый 14.11.2010, 09:19   #2
ExPeL
 
Регистрация: 21.10.2010
Сообщений: 5
По умолчанию

Вторая часть:
Код:
LRESULT WINAPI WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;				
	HDC hdc;					//Контекст окна

	static HDC hdcClient;		//Контекст в памяти
	static HBRUSH hbrBkgnd;		//Кисть для закраски фона
	static POINT pOld;			//Точка в которой находится курсор при нажатии на кнопку
	static RECT rClient;		//Клиентская область экрана
	static SIZE szClient;		//Размер клиентской области экрана
	static bool bDrag;			//Тоскаем ли мы фигуру в настоящий момент
	static Figures figures;		//Фигуры 
	static Figure* dragged;
	static TRIVERTEX
		t1[] = 
	{
		{ 400, 320,  0xff00, 0xff00, 0, 0 },
		{ 700, 320,  0, 0xff00, 0xff00, 0 },
		{ 700, 450, 0, 0, 0xff00, 0 }
	},
		t2[] = 
	{
		{ 400, 200, 0x3300, 0x3300, 0, 0 },
		{ 700, 300, 0xff00, 0, 0, 0 },
		{ 500, 350, 0, 0xaa00, 0xaa00, 0 }
	},
		rect[] =
	{
		{ 20, 20,  0xff00, 0, 0, 0 },
		{ 300,300, 0, 0, 0xff00, 0 }
	};


	switch(msg)
	{
	case WM_CREATE:
		{
			hdc = GetDC(hWnd);
			hdcClient = CreateCompatibleDC(hdc);
			ReleaseDC(hWnd, hdc); 
			DeleteDC(hdc);
			hbrBkgnd = CreateSolidBrush(RGB(255, 235, 205));

			//Инициализция фигур

			//Добавление фигур в коллекцию фигур
			figures.Add(new FigureTria(t1, 3));
			figures.Add(new FigureTria(t2, 3));
			figures.Add(new FigureTria(rect, 2));
			break;
		}
	case WM_PAINT:
		{			
			hdc = BeginPaint(hWnd, &ps);
			HBITMAP hBmp = CreateCompatibleBitmap(hdc, szClient.cx, szClient.cy);
			SelectObject(hdcClient, hBmp);
			HBRUSH hOld = (HBRUSH)SelectObject(hdcClient, hbrBkgnd);
			PatBlt(hdcClient, 0, 0, szClient.cx, szClient.cy, PATCOPY);

			figures.Draw(hdcClient);
			BitBlt(hdc, 0, 0, szClient.cx, szClient.cy, hdcClient, 0, 0, SRCCOPY);

			SelectObject(hdcClient, hOld);
			DeleteObject(hBmp);
			EndPaint(hWnd, &ps);
			break;
		}

	case WM_ERASEBKGND: return TRUE;

	case WM_LBUTTONDOWN:
		ClipCursor(&rClient);
		pOld.x = LOWORD(lParam);
		pOld.y = HIWORD(lParam);
		dragged = figures.GetDragged(pOld);
		break;

	case WM_MOUSEMOVE:
		{
			if (!(wParam & MK_LBUTTON))
				return 0;
			if(dragged)
			{
				POINT p;
				p.x = LOWORD(lParam);
				p.y = HIWORD(lParam); 
				dragged->Move(p.x - pOld.x, p.y - pOld.y);
				InvalidateRect(hWnd, 0, TRUE);
			}
			break;
		}

	case WM_LBUTTONUP:
		ClipCursor(0);
		dragged = 0;
		break;
	case WM_MOVE:
	case WM_SIZE:	
		{
			GetClientRect(hWnd, &rClient); 
			POINT ptLT = { rClient.left, rClient.top };
			POINT ptRB = { rClient.right, rClient.bottom };
			ClientToScreen(hWnd, &ptLT); 
			ClientToScreen(hWnd, &ptRB); 
			SetRect (&rClient, ptLT.x, ptLT.y, ptRB.x, ptRB.y);
			szClient.cx = rClient.right - rClient.left;
			szClient.cy = rClient.bottom - rClient.top;
			break;
		}

	case WM_DESTROY:
		DeleteObject(hbrBkgnd);
		DeleteDC(hdcClient);
		PostQuitMessage(0);
		break;

	default:				
		return DefWindowProc(hWnd,msg,wParam,lParam);
	}
	return 0L;
}

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
{
	WNDCLASS w;
	ZeroMemory(&w, sizeof(w));

	w.lpszClassName = ("My Class");
	w.hInstance = hInst;
	w.lpfnWndProc = WndProc;
	w.style	= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;

	if (!RegisterClass (&w))
		return FALSE;
	HWND hWnd = CreateWindow(w.lpszClassName, "Gradient Brushes", 
WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInst, 0);

	MSG msg;
	while (GetMessage(&msg, 0, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

Последний раз редактировалось rpy3uH; 15.11.2010 в 13:07.
ExPeL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
Посмотреть значения элементов линейного списка в дебаге Rusl92 Помощь студентам 0 15.05.2010 22:36
Это ошибка Delphi или моя ошибка??? bloodeagle Общие вопросы Delphi 3 12.11.2009 15:26
Ошибка в Аfor i:=1 to SI do. Пишит что ошибка в SI Алексей_xXx Помощь студентам 2 29.05.2009 00:09
...Ошибка 101 (net::ERR_CONNECTION_RESET): Неизвестная ошибка... infrared Помощь студентам 0 16.04.2009 17:44