Хелпикс

Главная

Контакты

Случайная статья





SetTextColor(hDC, c);. SetBkColor(hDC, c);. Функция TextOut. Функция DrawText. Функция sprintf. sprintf(S,”%6.1f %4d”,a,b);



SetTextColor(hDC, c);

SetBkColor(hDC, c);

Функция TextOut

Описание:

BOOL TextOut(HDC, X, Y, Str, Count)

Рисует стpоку текста, используя выбpанный шpифт.

Параметры:

DC: Идентификатоp контекста устpойства.
X, Y: Начальная точка стpоки.
Str: Рисуемая стpока.
Count: Размеp Str (в символах).

Возвpащаемое значение:

Не нуль, если наpисована строка; нуль - если нет.

Функция DrawText

DrawText(hdc, lpstring, ncount, * lprect, uformat);

Параметры:

hdc – дескриптор контекста устройства

lpstring – указатель на выводимую строку

ncount – длина строки в символах

* lprect – определяет ограничительный прямоугольник, в рамках которого происходит форматирование текста (тип RECT*).

uformat – флаги, которые управляют процессом форматирования. Могут принимать различные значения, например:

DT_BOTTOM – выравнивает текст по нижнему краю области;

DT_CENTER - выравнивает текст по центру области;

DT_LEFT - выравнивает текст по левому краю области.

Возвращаемое значение – высота отформатированного текста.

Функция sprintf

Выполняет вывод информации в заданном формате в строку

sprintf(S,”%6.1f %4d”,a,b);

S – строковая переменная

”%6.1f %4d” – форматная строка

a,b – список выводимых значений

При компиляции проекта с графическим текстом для получения нужной кодировки символов необходимо выполнить следующее:

1. В программе использовать функцию setlocale(LC_ALL,"Russian");

2. Изменить свойство кодировки символов в проекте:

a. Пункт меню «Проект»-> «Свойства проекта»

b. В появившемся окне выбрать вкладку «Свойства конфигурации» и в ней задать свойство «Character Set”, выбрав Not Set

Построение осей

Ось Y. Для этого необходимо определить координату x, через которую необходимо провести вертикальную линию.

Возможны следующие варианты

1. xmin и xmax имеют разные знаки, тогда ось Y проходит так, как показано на графике, т.е

osy= |xmin|*mx + DX

2. xmin и xmax имеют одинаковый знак и xmin>0, тогда ось Y проходит слева, т.е osy= DX

3. xmin и xmax имеют одинаковый знак и xmin<0, тогда ось Y проходит справа, т.е osy= Right - DX

 

Аналогично для оси Х. Для этого необходимо определить координату y, через которую необходимо провести горизонтальную линию линию. Следует помнить, что координата 0,0 определяет левый верхний угол, поэтому координаты по оси Y следует переворачивать.

1. ymin и ymax имеют разные знаки, тогда ось X проходит так, как показано на графике, т.е.

osх= Bottom - |ymin|*my - DY

2. ymin и ymax имеют одинаковый знак и ymin>0, тогда ось X проходит снизу, т.е.

osх= Bottom - DY

3. ymin и ymax имеют одинаковый знак и ymin<0, тогда ось X проходит сверху, т.е.

osх= DY

 

Пример. Построить график функции в заданном диапазоне.

#include "stdafx.h"

#include "windows.h"

#include "stdio.h"

#include "conio.h"

#include "math.h"

#include "dos.h"

#include "string.h"

#include "locale.h"

#define DX 20

#define DY 20

 

HDC hDC;

HWND hWnd;

RECT Rect;

HPEN hPen, hOldPen;

HBRUSH hBrush, hOldBrush;

HFONT hFont,hOldFont;

LOGFONT Lf={0};

float f(float x)

{

        return 5*sin(3*x)+2*x;

}

 

void clearscreen(int r,int g, int b)

{

  hPen=CreatePen(PS_SOLID,4,RGB(r,g,b));

hOldPen=(HPEN)SelectObject(hDC,hPen);

  hBrush=CreateSolidBrush(RGB(r,g,b));

hOldBrush=(HBRUSH)SelectObject(hDC,hBrush);

Rectangle(hDC,Rect.left,Rect.top,Rect.right,Rect.bottom);

  SelectObject(hDC,hOldPen);

DeleteObject(hPen);

  SelectObject(hDC,hOldBrush);

DeleteObject(hBrush);

}

 

void mashtab(float a,float b,float *mx,float *my,float *miny,float *maxy)

{

  float x,y,dx;

  x=a; dx=(b-a)/100;

  *maxy=-1000; *miny=1000;

  while (x<=b)

  {

        y=f(x);

        if (y>*maxy) *maxy=y;

        if (y<*miny) *miny=y;

        x=x+dx;

  }

//расчет масштабов по оси y и по оси x

*my=(Rect.bottom-2*DY)/(*maxy-*miny);

*mx=(Rect.right-2*DX)/(b-a);

}

 

void osi(float minx, float maxx, float miny, float maxy,float mx,float my, int *osx,int *osy)

  {

        if(minx*maxx<0) *osy=fabs(minx)*mx+DX;

        else if(minx>=0) *osy=DX;

        else *osy=Rect.right-DX;

        if(miny*maxy<0) *osx=Rect.bottom-fabs(miny)*my-DY;

        else if(miny>=0) *osx=Rect.bottom-DY;

        else *osx=DY;

        hPen=CreatePen(PS_SOLID,3,RGB(0,0,0));

        hOldPen=(HPEN)SelectObject(hDC,hPen);

  MoveToEx(hDC,DX,*osx,NULL);

        LineTo(hDC,Rect.right-DX,*osx);

        MoveToEx(hDC,*osy,DY,NULL);

        LineTo(hDC,*osy,Rect.bottom-DY);

        SelectObject(hDC,hOldPen);

        DeleteObject(hPen);

  }

 

void setka(int osx,int osy,float minx, float maxx, float miny, float maxy,float mx, float my)

{

  hPen=CreatePen(PS_DOT,1,RGB(255,0,255));

hOldPen=(HPEN)SelectObject(hDC,hPen);

  Lf.lfHeight=12;

  Lf.lfWeight=900;

  Lf.lfWidth=8;

  CHAR S[20];

  //Lf.lfOrientation=90;

  strcpy((char*)Lf.lfFaceName,"Times New Roman");

  //Lf.lfCharSet=RUSSIAN_CHARSET;

hFont=CreateFontIndirect(&Lf);

  hOldFont=(HFONT)SelectObject(hDC,hFont);

  SetTextColor(hDC,RGB(0,0,0));

  SetBkColor(hDC,RGB(255,255,255));

  TextOut(hDC,osy-20,Rect.top+DY-8,(LPCSTR)"Y",1);

  TextOut(hDC,Rect.right-DX+2,osx-20,(LPCSTR)"X",1);

//построение сетки

  float dx,x,y;

  int xt,yt;

  RECT d;

  dx=(maxx-minx)/10;

  for(x=minx; x<=maxx;x+=dx)

  {

        xt=DX+mx*(x-minx);

        MoveToEx(hDC,xt,Rect.top+DY,NULL);

        LineTo(hDC,xt,Rect.bottom-DY);

        sprintf(S,"%.1f",x);

        TextOut(hDC,xt,osx+8,(LPCSTR)S,strlen(S));

  }

  float dy=(maxy-miny)/10;

  for(y=miny; y<maxy+dy;y+=dy)

  {

        yt=Rect.bottom-my*(y-miny)-DY;

        MoveToEx(hDC,Rect.left+DX,yt,NULL);

        LineTo(hDC,Rect.right+DX,yt);

  sprintf(S,"%.1f",y);

        TextOut(hDC,osy+5,yt,(LPCSTR)S,strlen(S));

  }

SelectObject(hDC,hOldPen);

DeleteObject(hPen);

SelectObject(hDC,hOldFont);

DeleteObject(hFont);

}

 

void grafik(float minx, float maxx, float miny, float mx, float my)

{

  float x,y,dx;

  int xt,yt;

  dx=(maxx-minx)/200;

  //установка цвета и стиля линий для построения функции (красный)

  hPen=CreatePen(PS_SOLID,4,RGB(255,0,0));

hOldPen=(HPEN)SelectObject(hDC,hPen);

  //расчет координат начальной точки функции    

  x=minx;

  y=f(x);

  xt=Rect.left+(x-minx)*mx+DX;

  yt=Rect.bottom-(y-miny)*my-DY;

  MoveToEx(hDC,xt,yt,NULL);

//построение графика

  do

  {

        x=x+dx;

        y=f(x);

        xt=Rect.left+(x-minx)*mx+DX;

        yt=Rect.bottom-(y-miny)*my-DY;

        LineTo(hDC,xt,yt);

  }

  while (x<maxx-dx);

  SelectObject(hDC,hOldPen);

  DeleteObject(hPen);

}

 

 

int _tmain(int argc, _TCHAR* argv[])

{

  float a,b,maxy,miny,mx,my;

  int osx,osy;

  setlocale(LC_ALL,"Russian");

  printf("Введите диапазон по X\n");

  scanf("%f%f",&a,&b);

  hWnd=GetConsoleWindow();

  MoveWindow(hWnd,0,0,800,600,TRUE);

  SetWindowText(hWnd,(LPCSTR)"График функции y=5*sin(3*x)+2*x");

if(!hWnd)

{

   printf("Can't get hWnd of console!\n");

        getch();

   return -1;

}

hDC=GetDC(hWnd);

if(!hDC)

{

   printf("Can't get device context!\n");

        getch();

   return -2;

}

GetClientRect(hWnd,&Rect);

  clearscreen(255,255, 255);

  mashtab(a, b, &mx, &my,&miny,&maxy);

  osi(a, b, miny, maxy, mx, my, &osx, &osy);

  setka(osx,osy,a,b,miny,maxy,mx,my);

  grafik(a,b,miny,mx,my);

  ReleaseDC(hWnd, hDC);

  getch();

  return 0;

}

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.