|
|||
SetTextColor(hDC, c);. SetBkColor(hDC, c);. Функция TextOut. Функция DrawText. Функция sprintf. sprintf(S,”%6.1f %4d”,a,b); ⇐ ПредыдущаяСтр 2 из 2 SetTextColor(hDC, c); SetBkColor(hDC, c); Функция TextOut Описание: BOOL TextOut(HDC, X, Y, Str, Count) Рисует стpоку текста, используя выбpанный шpифт. Параметры: DC: Идентификатоp контекста устpойства. Возв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; }
|
|||
|