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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2009, 18:38   #1
Pr.AvivA
Новичок
Джуниор
 
Регистрация: 03.11.2009
Сообщений: 1
Радость Построение графика функции по данным из файла

Всем добрый день! Мой к вам вопрос: нужно брать данные для построения функции из файла, в котором содержится массив этих самых данных. Я написала программу, которая работает с файлом данных и в окне строит график функции. Но строит она его неправильно.
Код:

#include <windows.h>
#include <math.h>
#include "KWnd.h"
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include "stdafx.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void DrawDiagram (HWND, HDC);
#define Pi 3.14159265
HANDLE Fp;
OFSTRUCT ofs;
char filename[80];
unsigned long numbytes_ok;
unsigned long size;
unsigned int u[40];//буфер
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{   	Fp=CreateFile("Данные1.bin", GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
	if (Fp==INVALID_HANDLE_VALUE)
		{ exit (1);	return(1);} 
	MSG msg;
	KWnd mainWnd("Врем. диагр. напряжения", hInstance, nCmdShow, WndProc);
	while (GetMessage(&msg, NULL, 0, 0))
       {	TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
	CloseHandle(Fp);}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{	HDC hDC;
	PAINTSTRUCT ps;
		switch (uMsg)
	{	case WM_PAINT://перерис.клиентскую область
		hDC=BeginPaint(hWnd, &ps);	
		DrawDiagram(hWnd, hDC);
		EndPaint(hWnd, &ps);//освоб. контекст устройства
		break;
	case WM_DESTROY://разруш. окна
		PostQuitMessage(0);
		break;
	default:
	    return DefWindowProc(hWnd, uMsg, wParam, lParam);
	} return 0;}
void DrawDiagram (HWND hwnd, HDC hdc)
{	RECT rect;
	GetClientRect (hwnd, &rect);//размеры клиентской области окна
	const int xVE=rect.right-rect.left;//горизонт. габариты области просмотра
	const int yVE=rect.bottom-rect.top;//вертик.
	const int xWE=xVE;//горизонтальные габариты окна
	const int yWE=yVE;//вертик.
	double nPixPerVolt = yVE / 1000.0;//масшт.коэффициент
	double nPixPerMs = xVE / 60.0; //n Pixels Per Millisec // масшт. коэффициент
	SetMapMode (hdc, MM_ISOTROPIC); 
	SetWindowExtEx(hdc, xWE, yWE, NULL);
	SetViewportExtEx(hdc, xVE, -yVE, NULL);//значение по оси у возрастает снизу вверх
	   SetViewportOrgEx(hdc, 10 * nPixPerMs, yVE/2, NULL);//уст. начала координат
	const int tMin=0;  //ms    
	const int tMax=40;  //ms
	const int uMin=-400;  //V
	const int uMax=400;  //V
	const int tGridStep=5;
	const int uGridStep=100;
	int x, y;
	char* xMark[]={"0", "5", "10", "15", "20", "25", "30", "35", "40"};
    char* yMark[]={"-400", "-300", "-200", "-100", "0", "100", "200", "300", "400"};
	//Сетка
	HPEN hPen0=CreatePen(PS_SOLID, 1, RGB(0, 160, 0));
	HPEN hOldPen=(HPEN)SelectObject(hdc, hPen0);
	int v=uMin;//построение сетки по напряжению
	int xMin=tMin * nPixPerMs;
        int xMax=tMax * nPixPerMs;
	for (int i=0; i<9; ++i) 
	{	y = v * nPixPerVolt;
		MoveToEx(hdc, xMin, y, NULL);
		LineTo(hdc, xMax, y);
		TextOut(hdc, xMin-40, y+8, yMark[i], strlen(yMark[i]));
	v+=uGridStep;	}
	int t = tMin;//сетка по времени
	int yMin = uMin * nPixPerVolt;
	int yMax = uMax * nPixPerVolt;
	for (i=0; i<9; ++i)
	{	x = t * nPixPerMs;
		MoveToEx (hdc, x, yMin, NULL);
		LineTo(hdc, x, yMax);
		TextOut(hdc, x-6, yMin-10, xMark[i], strlen(xMark[i]));
		t+=tGridStep;	}
	//Ось "х"
	HPEN hPen1=CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
	SelectObject(hdc, hPen1);
	MoveToEx(hdc, 0, 0, NULL);
	LineTo(hdc, xMax, 0);
	static LOGFONT lf;
	lf.lfPitchAndFamily=FIXED_PITCH | FF_MODERN;//шаг и семейство шрифта
	lf.lfItalic=TRUE;//закрашиваем курсивный шрифт
	lf.lfWeight=FW_BOLD;//жирность шрифта
	lf.lfHeight=20;//высота шрифта в логич. ед.
	lf.lfCharSet=DEFAULT_CHARSET;//код набора символа=1
	lstrcpy ((LPSTR)&lf.lfFaceName, "Arial");
    HFONT hFont0=CreateFontIndirect(&lf);
	HFONT hOldFont=(HFONT) SelectObject(hdc, hFont0);
	SetTextColor(hdc, RGB(0, 0, 200));
	TextOut(hdc, xMax+10, 10, "t (ms)", 6);
	//Ось "у"
	MoveToEx(hdc, 0, yMin, NULL);
	LineTo(hdc, 0, yMax);
	TextOut(hdc, -10, yMax+30, "u (V)", 5);
	//График
	HPEN hPen2=CreatePen(PS_SOLID, 5, RGB(200, 0, 100));
	SelectObject(hdc, hPen2);
	int tStep=1;
	double radianPerMs = 2 * Pi / 20;//масштабный коэффициент
	const double uAmplit=311.17;  //volt
	t = tMin;
	MoveToEx(hdc, 0, 0, NULL);
	 while (t<=tMax) //кусочно-линейная аппрокс. sin(x)
	 {ReadFile(Fp, &u, 1, &numbytes_ok, NULL);
	   v = uAmplit * sin(u[t] * radianPerMs);
		 LineTo(hdc, t * nPixPerMs, u[t] * nPixPerVolt);//соединяем предыд. и текущее знач.
         t+=tStep; }
	//Заголовок
	char* title="Диагр. напряж. перем. тока";
	lf.lfItalic=FALSE;
        lf.lfWeight=FW_BOLD;
        lf.lfHeight=35;
	HFONT hFont1=CreateFontIndirect(&lf);
	SelectObject(hdc, hFont1);
	SetTextColor(hdc, RGB(0, 200, 0));
	TextOut(hdc, 0, yMax+70, title, strlen(title));
	SelectObject(hdc, hOldPen);
        SelectObject(hdc, hOldFont);
}
Помогите, пожалуйста, разобраться!

Последний раз редактировалось Pr.AvivA; 04.11.2009 в 18:05.
Pr.AvivA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение графика разрывнойй функции DAV88 Помощь студентам 5 08.05.2009 09:40
Построение графика функции Java Folly Общие вопросы по Java, Java SE, Kotlin 3 19.03.2009 11:16
Построение графика функции (Паскаль) Scream of the soul Помощь студентам 4 16.03.2009 02:57
Построение графика функции Жека:) Общие вопросы C/C++ 5 11.11.2008 19:05
Графика. Построение функции AngelOfDeath Общие вопросы Delphi 2 14.10.2008 13:44