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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2013, 11:44   #1
thornish
 
Регистрация: 11.10.2011
Сообщений: 5
По умолчанию Подпись осей на графиках (bitmap)

Добрый день, пытаюсь нарисовать график данных, все вроде верно рисуется, кроме подписей на оси Y.

Т.е. самым нижним значением должно быть 34, а получается 3.4. И так на всех графиках, которые получаются.

Подскажите как исправить ошибку - код функции ниже:
Также перед вызовом функции вызываю такие комманды:
graph->SetRangeY(0., 0.);
graph->FixScaleY(false);


Код:
void SaveHDCtoFile(LPCWSTR file_name, CGraph *graph, float *data, size_t data_size, uint64_t time_total, CGraph::CG_COLOR *color)
	{
		float data_per_sec = static_cast<float>(data_size)/static_cast<float>(time_total);
		std::vector<float> x;
		for (size_t i = 0; i < data_size; i++)
		{
			x.push_back(static_cast<float>(i)/(3600.f * data_per_sec));
		}
		graph->SetRangeX(0, data_size);
		graph->SetGraph(x.data(), data, data_size, color);
		graph->ShowWindow(SW_HIDE);
		graph->BringWindowToTop();
		graph->Invalidate();
		graph->RedrawWindow();
		Sleep(100);

		CRect rect;
		graph->GetClientRect(&rect);

		//Creating DC and preparing ARGB DIBSection
		HDC hDC = ::CreateCompatibleDC(graph->GetUpdatedDC()->GetSafeHdc());
		BITMAPINFO bmp_info = {0};
		bmp_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
		bmp_info.bmiHeader.biWidth = rect.Width();
		bmp_info.bmiHeader.biHeight = rect.Height();
		bmp_info.bmiHeader.biPlanes = 1;
		bmp_info.bmiHeader.biBitCount = 32;
		bmp_info.bmiHeader.biCompression = BI_RGB;
		HBITMAP hbmp = CreateDIBSection(hDC, &bmp_info, DIB_RGB_COLORS, NULL, NULL, NULL);
		SelectObject(hDC, hbmp);
		BitBlt(hDC, 0, 0, rect.Width(), rect.Height(), graph->GetUpdatedDC()->GetSafeHdc(), 0, 0, SRCCOPY);

		//Getting DSP output bitmap
		Gdiplus::Bitmap gdipulsBmpTmp( hbmp, NULL );

		//Drawing DSP output


		wchar_t locAppData[1000] = L"";
		std::wstring path;
		path += L"C:\\";
		path += file_name;
		

		CLSID pngClsid;
		GetEncoderClsid(L"image/png", &pngClsid);
		gdipulsBmpTmp.Save(path.c_str(), &pngClsid, NULL);
		//Cleaning memory
		graph->ShowWindow(SW_HIDE);
		DeleteObject(hbmp);
		::ReleaseDC(NULL, hDC);
		DeleteDC(hDC);
	}
в функции используется свой класс, в котором вызывается функция drawaxis, эта функция выполняет следующие действия:
Код:
//draw value
	int numX = (rc.right-rc.left)/(2*GRAPH_BORDER);
	int numY = (rc.bottom-rc.top)/(2*GRAPH_BORDER);
	float deltaX = (m_maxXValue - m_minXValue)/numX;
	float deltaY = (m_maxYValue - m_minYValue)/numY;
	m_graphWidth = numX*2*GRAPH_BORDER;
	m_graphHight = numY*2*GRAPH_BORDER;

	//X
	int pos=rc.left;
	wchar_t num[10];
	memset(num,0,10*sizeof(wchar_t));
	RECT numRc={0,rc.bottom+AXIS_MARK,0,rc.bottom+GRAPH_BORDER};
	float value=m_minXValue;
	swprintf(num,10,m_GrapthXFormat.c_str(),value);
	numRc.left=pos-AXIS_MARK;
    numRc.right=pos+11*AXIS_MARK;
	pDC->DrawText(num,(int)wcslen(num),&numRc,DT_CENTER);
	for(int x=0; x<numX; ++x )
	{
		pos = rc.left+(x+1)*2*GRAPH_BORDER;
		pDC->MoveTo(pos,rc.bottom-AXIS_MARK);
		pDC->LineTo(pos,rc.bottom+AXIS_MARK);
        value = m_minXValue+(x+1)*deltaX;
		swprintf(num,10,m_GrapthXFormat.c_str(),value);
		numRc.left=pos-7*AXIS_MARK;
		numRc.right=pos+7*AXIS_MARK;
		pDC->DrawText(num,(int)wcslen(num),&numRc,DT_CENTER);
		
	}
	//Y
	pos=rc.bottom;
	numRc.left=rc.left-GRAPH_BORDER;
	numRc.right=rc.left-AXIS_MARK;
	value=m_minYValue;
	swprintf(num,10,L"%.1f",value);
	numRc.top=pos-7*AXIS_MARK;
	numRc.bottom=pos+AXIS_MARK;
	pDC->DrawText(num,(int)wcslen(num),&numRc,DT_LEFT);
	for(int y=0; y<numY; ++y )
	{
		pos = rc.bottom-(y+1)*2*GRAPH_BORDER;
		pDC->MoveTo(rc.left-AXIS_MARK,pos);
		pDC->LineTo(rc.left+AXIS_MARK,pos);
		value = m_minYValue+(y+1)*deltaY;
		if ( m_degreeY <= 3 && m_degreeY >= -2)
			value *= pow(10.f, m_degreeY);
		swprintf(num,10,L"%.2f",value);
		numRc.top=pos-4*AXIS_MARK;
		numRc.bottom=pos+4*AXIS_MARK;
		pDC->DrawText(num,(int)wcslen(num),&numRc,DT_LEFT);
	}
вероятнее всего ошибка где то в этой функции..
Изображения
Тип файла: jpg temperature--.jpg (28.7 Кб, 80 просмотров)

Последний раз редактировалось thornish; 26.07.2013 в 16:30.
thornish вне форума Ответить с цитированием
Старый 26.07.2013, 18:22   #2
thornish
 
Регистрация: 11.10.2011
Сообщений: 5
По умолчанию

Все, спасибо, разобрался сам.
thornish вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Атоматическая корректировка осей диаграммы Nicolas_46 Microsoft Office Excel 0 04.03.2013 17:17
Построение осей координат lordseko Помощь студентам 4 21.12.2010 06:12
Даты в графиках Madsqui Microsoft Office Excel 0 30.05.2010 23:31
из-за чего появляется полоса (на скрине) при вставке BitMap в TImage? - Проблема с Bitmap Grey@2009 Мультимедиа в Delphi 2 02.01.2010 20:23
Разметка координатных осей LLIypLLIyH Помощь студентам 1 20.06.2008 22:19