Добрый день, пытаюсь нарисовать график данных, все вроде верно рисуется, кроме подписей на оси 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);
}
вероятнее всего ошибка где то в этой функции..