2.6. Функция ParamDlgProc
Функция, обрабатывающая сообщения, получаемые диалоговым окном (аналогична оконной процедуре).
Блок-схема:
Инициализация
диалогового
окна
WM_COMMAND
Считывание параметров
диалогового окна
Считывание параметров
диалогового окна
2.7. Функция fileread
Функция считывающая исходные значения из файла.
Блок-схема:
pf=fopen(adress,"r");
1
0
fclose(pf);
3. Файлы проекта
3.1. l5.cpp
Файл содержащий исходный код программы.
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include "l5.h"
#include <complex>
using namespace std;
void setka (HDC,int,int,int,int,double,double,double,double,double,double);
double kkp(double);
void graphik (HDC,int,int,int,int,double,double,double,double);
BOOL APIENTRY ParamDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void fileread(char *adress);
double lc[100],u[100],rg,rn,f;
double fmin=0,fmax=70,fstep=10,umin=0,umax=1000,ustep=100;
int n,l,bxshow=1;
char v;
FILE *pf;
LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int hCmdShow)
{
PSTR szName="Test App";
WNDCLASS wc;
HWND hWnd;
MSG msg;
wc.style=CS_VREDRAW|CS_HREDRAW;
wc.lpfnWndProc=WindowProc;
wc.hInstance=hInstance;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hIcon=LoadIcon(hInstance,"MainIcon");
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName="MainMenu";
wc.lpszClassName=szName;
RegisterClass(&wc);
hWnd=CreateWindow(szName,"Простая программа",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,hCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,(HWND)NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static OPENFILENAME ofn;
static char strFileName[MAX_PATH];
static int k=0,i,n;
static HFONT hFont;
static double *a,*b;
HDC hdc;
static HPEN hPen;
static int color;
static int style;
RECT r;
int x,y;
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_CREATE:
style=PS_SOLID;
color=RGB(255,0,0);
hPen=CreatePen(style,1,color);
hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
ZeroMemory (&ofn,sizeof(ofn));
ofn.lStructSize=sizeof(ofn);
ofn.hwndOwner=hWnd;
ofn.lpstrFilter="Текстовый файл(*.txt)\0*.txt\0Все файлы(*.*)\0*.*\0";
ofn.nFilterIndex=1;
ofn.lpstrFile=strFileName;
ofn.nMaxFile=MAX_PATH;
ofn.lpstrInitialDir="";
ofn.Flags=OFN_FILEMUSTEXIST;
ofn.lpstrDefExt="txt";
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case IDM_OP:
DialogBox((HINSTANCE) GetWindowLong (hWnd,GWL_HINSTANCE),"DlgParam",hWnd,(DLGPROC)ParamDlgProc);
break;
case IDM_OPEN:
if (GetOpenFileName(&ofn)!=0)
fileread(strFileName);
break;
}
DeleteObject(hPen);
GetClientRect(hWnd,&r);
InvalidateRect(hWnd,&r,TRUE);
UpdateWindow(hWnd);
return 0;
case WM_PAINT:
color=RGB(0,0,0);
hPen=CreatePen(style,1,color);
hdc=BeginPaint(hWnd,&ps);
GetClientRect(hWnd,&r);
SelectObject (hdc,hPen);
SelectObject(hdc,hFont);
if (bxshow==1)
setka(hdc,100,r.right-100,100,r.bottom-100,fmin,fmax,fstep,umin,umax,ustep);
DeleteObject(hPen);
color=RGB(255,0,0);
hPen=CreatePen(style,1,color);
SelectObject (hdc,hPen);
graphik(hdc,100,r.right-100,100,r.bottom-100,fmin,fmax,umin,umax);
DeleteObject(hPen);
EndPaint;
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc (hWnd,uMsg,wParam,lParam);
}
void setka (HDC hdc,int xmin,int xmax,int ymin,int ymax,double fmin,double fmax,double fstep,double umin,double umax,double ustep)
{
int k;
double xstep,ystep,x,y,k1;
char s [256];
xstep=fstep*(xmax-xmin)/(fmax-fmin);
ystep=ustep*(ymax-ymin)/(umax-umin);
if (xmax>xmin&&fmax>fmin&&ymax>ymin&&umax>umin)
{
k=fmin;
for(x=xmin;x<=xmax+1;x+=xstep)
{
MoveToEx(hdc,x,ymin,NULL);
LineTo(hdc, x,ymax);
wsprintf(s,"%d",k);
TextOut(hdc,x-8,ymax+10,s,strlen(s));
k+=fstep;
}
k1=umax;
for(y=xmin;y<=ymax+1;y+=ystep)
{
MoveToEx(hdc,xmin,y,NULL);
LineTo(hdc,xmax,y);
sprintf(s,"%.1f",k1/1000);
TextOut(hdc,xmin-35,y-10,s,strlen(s));
k1-=ustep;
}
TextOut(hdc,xmin-40,ymin-40,"K", 5);
TextOut(hdc,xmax,ymax+25,"F MGz", 5);
}
else
return;
}
double kkp(double f)
{
int i,j,l,m,h;
complex<double> k,x[2][2]={complex<double>(1,0),complex<double>(0,0),complex<double>(0,0),complex<double>(1,0)},
a[2][2]={complex<double>(1,0),complex<double>(0,0),complex<double>(0,0),complex<double>(1,0)},
b[2][2]={complex<double>(1,0),complex<double>(0,0),complex<double>(0,0),complex<double>(1,0)};
if (v=='L')
h=0;
else
h=1;
for(m=0;m<n;m++)
{
if(((m+h)%2)==0)
{
x[0][1]=complex<double>(0,2*M_PI*f*lc[m]);
x[1][0]=complex<double>(0,0);
}
else
{
x[1][0]=complex<double>(0,2*M_PI*f*lc[m]);
x[0][1]=complex<double>(0,0);
}
for(i=0;i<2;i++)
for(j=0;j<2;j++)
for(l=0;l<2;l++)
b[i][j]+=a[i][l]*x[l][j];
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
a[i][j]=b[i][j];
b[i][j]=complex<double>(0,0);
}
}
k=(sqrt(complex<double>(rg,0)/complex<double>(rn,0))*complex<double>(2,0))/
(a[0][0]+a[0][1]/complex<double>(rn,0)+a[1][0]*complex<double>(rg,0)+a[1][1]);
return sqrt(real(k)*real(k)+imag(k)*imag(k));
}
void graphik (HDC hdc,int xmin,int xmax,int ymin,int ymax,double fmin,double fmax,double umin,double umax)
{
double GZonPIX,PIXonK;
int p;
GZonPIX=(fmax-fmin)/(xmax-xmin);
PIXonK=(ymax-ymin)/(umax-umin);
MoveToEx(hdc,xmin,ymax-(kkp(fmin*1e6)-umin/1000)*PIXonK*1000,NULL);
for(p=xmin+1;p<=xmax;p++)
{
if (((kkp(((p-xmin)*GZonPIX+fmin)*1e6)*1000)>=(umin))&&((kkp(((p-xmin)*GZonPIX+fmin)*1e6)*1000)<=(umax)))
LineTo(hdc,p,ymax-(kkp(((p-xmin)*GZonPIX+fmin)*1e6)*1000-umin)*PIXonK);
else
MoveToEx(hdc,p,ymax-(kkp(((p-xmin)*GZonPIX+fmin)*1e6)*1000-umin)*PIXonK,NULL);
}
}
BOOL APIENTRY ParamDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
char str [128];
switch (uMsg)
{
case WM_INITDIALOG:
if (bxshow==1)
CheckDlgButton(hDlg, IDB_SHOW,BST_CHECKED);
sprintf (str,"%.3f", fmin);
SetDlgItemText (hDlg, IDE_FMIN, str);
sprintf (str,"%.3f", fmax);
SetDlgItemText (hDlg,IDE_FMAX, str);
sprintf (str,"%.3f", fstep);
SetDlgItemText (hDlg, IDE_FSTEP, str);
sprintf (str,"%.3f", umin);
SetDlgItemText (hDlg, IDE_KMIN, str);
sprintf (str,"%.3f", umax);
SetDlgItemText (hDlg,IDE_KMAX, str);
sprintf (str,"%.3f", ustep);
SetDlgItemText (hDlg, IDE_KSTEP, str);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
if (IsDlgButtonChecked(hDlg,IDB_SHOW)==BST_CHECKED)
bxshow=1;
else
bxshow=0;
GetDlgItemText(hDlg,IDE_FMIN,str,128);
fmin=atof(str);
GetDlgItemText(hDlg, IDE_FMAX,str,128);
fmax=atof(str);
GetDlgItemText(hDlg, IDE_FSTEP,str,128);
fstep=atof(str);
GetDlgItemText(hDlg,IDE_KMIN,str,128);
umin=atof(str);
GetDlgItemText(hDlg, IDE_KMAX,str,128);
umax=atof(str);
GetDlgItemText(hDlg, IDE_KSTEP,str,128);
ustep=atof(str);
case IDCANCEL:
EndDialog(hDlg,wParam);
return TRUE;
}
default:
return FALSE;
}
}
void fileread(char *adress)
{
pf=fopen(adress,"r");
if (pf==NULL)
return;
fscanf(pf,"%c",&v);
fscanf(pf,"%lg",&rg);
fscanf(pf,"%lg",&rn);
fscanf(pf,"%d",&n);
for(l=0;l<n;l++)
fscanf(pf,"%lg",&lc[l]);
fclose(pf);
}
3.2. l5.h
Заголовочный файл, может содержать определение некоторых функций и констант, а так же ссылки на другие заголовочные файлы.
#ifndef _L5_H_
#define _L5_H_
#define IDM_EXIT 1001
#define IDM_ABOUT 1002
#define IDM_HELP 1003
#define IDM_OP 1004
#define IDB_SHOW 1005
#define IDE_FMIN 1006
#define IDE_FMAX 1007
#define IDE_FSTEP 1008
#define IDE_KMIN 1009
#define IDE_KMAX 1010
#define IDE_KSTEP 1011
#define IDM_OPEN 1019
#define IDC_STATIC 1020
#endif
3.3. l5.rc
Файл ресурсов, содержит описание некоторых ресурсов программы в виде кода.
#include "l5.h"
#include <windows.h>
MainIcon ICON icon.ico
MainMenu MENU
{
POPUP "&Файл"
{
MENUITEM "&Открыть" IDM_OPEN
MENUITEM "В&ыход" IDM_EXIT
}
POPUP "&Параметры"
{
MENUITEM "&Настройки" IDM_OP
}
POPUP "&Справка"
{
MENUITEM "Справка" IDM_HELP
MENUITEM SEPARATOR
MENUITEM "О программе" IDM_ABOUT
}
}
DlgParam DIALOG DISCARDABLE 10,10,150,150
STYLE DS_MODALFRAME | WS_POPUP | WS_SYSMENU
CAPTION "Параметры"
FONT 8, "MS Sans Serif"
{
GROUPBOX "Опции",IDC_STATIC,4,1,136,118, WS_GROUP
EDITTEXT IDE_FMIN,10,26,30,12
LTEXT "Частота мин МГц", IDC_STATIC,42,26,80,14
EDITTEXT IDE_FMAX, 10,40,30,12
LTEXT "Частота макс МГц", IDC_STATIC,42,40,80,14
EDITTEXT IDE_FSTEP, 10, 54, 30,12
LTEXT "Шаг МГц" IDE_FSTEP, 42, 54,80,14
EDITTEXT IDE_KMIN,10,68,30,12
LTEXT "Коэф мин", IDC_STATIC,42,68,80,14
EDITTEXT IDE_KMAX, 10,82,30,12
LTEXT "Коэф макс", IDC_STATIC,42,82,80,14
EDITTEXT IDE_KSTEP, 10, 96, 30,12
LTEXT "Шаг коэф" IDE_KSTEP, 42, 96,80,14
CONTROL "Отображать сетку", IDB_SHOW,"BUTTON",BS_AUTOCHECKBOX|WS_TABSTOP,10,12,71,10
DEFPUSHBUTTON "Oк",IDOK,4,150-14-8,45,14
PUSHBUTTON "Отмена",IDCANCEL,54,150-14-8,45,14
}