Добавил:
sergun
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
//Каркас приложения для Windows'95/98/2000
//Поле системы
#include <windows.h>
//#include <sysutils.h>
#include "resource.h"
#include <tchar.h>
#include <math.h>
#define IDH_1 1
#define IDH_2 2
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
int E(int,int);
double ex,ey;
char szWinName[] = "Поле системы электрических зарядов v1.0";
HWND hwnd;
HDC memdc;
PAINTSTRUCT paintstruct;
HINSTANCE moio;
TCHAR Text[3];
char str1[80];
char str2[80];
char str3[80];
char str4[7];
char si[20];
double xm,xm1;
double ym,ym1;
float xk,yk;
int qs=0;
float al;
float qzs[255][4];
BYTE timerstates[25];
float time = 0.;//время задержки
BYTE num = 0;//число индикаторов
int i,q,q1;
int k=1;
double x,y;
double p;
UINT numTimer, id;
LOGBRUSH logBrush;//создается кисть
COLORREF RedColor, GreenColor;
HBRUSH hRedBrush, hGreenBrush;
int WINAPI WinMain (HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
{
MSG msg;
WNDCLASS wcl;
// Определить класс окна
wcl.hInstance=hThisInst;
wcl.lpszClassName=szWinName; //имя класса окна
wcl.lpfnWndProc=WindowFunc; //функция окна
wcl.style=0; // стиль по умолчанию
wcl.hIcon=LoadIcon (NULL,IDI_ICON1); //иконка
wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
wcl.lpszMenuName= (LPSTR)MYMENU; //NULL; //без меню
wcl.cbClsExtra=0;
wcl.cbWndExtra=0;
// Заполнить окно цветом
wcl.hbrBackground=(HBRUSH) GetStockObject(LTGRAY_BRUSH);
if (!RegisterClass (&wcl)) return 0;
// Создать окно
hwnd = CreateWindow(szWinName,"Поле системы электрических зарядов v1.0",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, // горизонтальное положение окна
CW_USEDEFAULT, // вертикальное положение окна
CW_USEDEFAULT, // ширина окна
CW_USEDEFAULT, // высота окна
HWND_DESKTOP,
NULL,
hThisInst,
NULL);
// Показать окно и нарисовать содержимое
ShowWindow(hwnd,nWinMode);
// UpdateWindow (hwnd);
// Цикл обработки сообщений
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
DeleteDC (memdc);
return msg.wParam;
}
// for (i=1;i<=10;i++) {for (q=1;q<=3;q++) {qzs[i][q]=0};};
LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
HDC hdc;
HBITMAP hbit;
HBRUSH hbrush;
static int maxX, maxY;
switch (message)
{
case WM_CREATE: // событие, возникающее при создании окна
maxX = GetSystemMetrics (SM_CXSCREEN); //размер экрана
maxY = GetSystemMetrics (SM_CYSCREEN);
hdc = GetDC(hwnd); //получить контекст устройства
memdc = CreateCompatibleDC(hdc); //совместимый контекст в ОЗУ
hbit = CreateCompatibleBitmap (hdc,maxX,maxY); //место в памяти
// для содержимого окна
SelectObject (memdc, hbit); // выбрать bitmap
hbrush = GetStockObject (LTGRAY_BRUSH); //получить кисть
SelectObject (memdc, hbrush); // выбрать кисть
PatBlt (memdc, 0,0, maxX,maxY,PATCOPY); //закрасить кистью копию окна в ОЗУ
ReleaseDC (hwnd, hdc); //освободить контекст
// TextOut(memdc,50,40,"Вывод текста",12); //ВЫВОД "..." В ОКНЕ
// MoveToEx (memdc,100,300, NULL); //передвинуть перо
SelectObject (memdc, CreatePen (PS_SOLID,2 /*ширина пера*/,RGB(55,20,50)));
// LineTo(memdc, 500, 300); // прочертить линию
// hbrush = GetStockObject (WHITE_BRUSH);//получить кисть белого цвета
// SelectObject (memdc,hbrush);// выбрать кисть
// SelectObject (memdc, CreatePen (PS_SOLID,1 /*ширина пера*/,RGB(255,0,0)));
// Ellipse(memdc,1,2,50,300); //координаты прямоугольника
//SetPixel(memdc,250,150, RGB(255,255,0));//поставить точку желтого цвета цвета
//nTimer =SetTimer(hWnd, 1d, Delay, NULL);
break;
hbrush = GetStockObject (BLACK_BRUSH);
case WM_LBUTTONDOWN:
xm=LOWORD(lParam);
ym=HIWORD(lParam);
//LineTo(memdc,xm,ym);
//UpdateWindow (hwnd);
DialogBox(moio, MAKEINTRESOURCE(IDD_Dialog1), hwnd, DialogProc);
qs++;
qzs[qs][1]=xm;
qzs[qs][2]=ym;
qzs[qs][3]=time;
if (time==0)qs--;
InvalidateRect(hwnd, NULL, FALSE);
UpdateWindow(hwnd);
break;
case WM_PAINT: //отображение в окне на экране
//InvalidateRect(hwnd, NULL, FALSE/*TRUE*/);
hdc = BeginPaint(hwnd,&paintstruct);
hbrush = GetStockObject (LTGRAY_BRUSH);
SelectObject (memdc, hbrush);
PatBlt (memdc, 0, 0, maxX, maxY, PATCOPY);
SelectObject (memdc, CreatePen (PS_SOLID,2 /*ширина пера*/,RGB(255,255,255)));
// x=100;
// y=100;
p=0;
for (i=1;i<=qs;i++) p=p+abs(qzs[i][3]);
for (i=1;i<=qs;i++) qzs[i][4]=qzs[i][3]*qs*3/p;
//time=(0.4488/abs(qzs[i][4]));
for (i=1;i<=qs;i++) for (al=0;al<=6.2831;al+=0.7857/abs(qzs[i][4]))
{
xm1=10*cos(al);
ym1=10*sin(al);
x=xm1+qzs[i][1];
y=ym1+qzs[i][2];
if((xm1*xm1+ym1*ym1)*qzs[i][3]>0)
{
MoveToEx(memdc,x,y,NULL);
for(q1=1;q1<=4000;q1++)
{
//while(){
E(x,y);
x=x+ex;
y=y+ey;
if(x!=0 && y!=0) LineTo(memdc,(int)x,(int)y);
}
}
if((xm1*xm1+ym1*ym1)*qzs[i][3]<0)
{
MoveToEx(memdc,x,y,NULL);
for(q1=1;q1<=4000;q1++) {
E(x,y);
x=x-ex;
y=y-ey;
if(x!=0 && y!=0) LineTo(memdc,(int)x,(int)y);}
} }
//нарисовать заряды
for (i=1;i<=qs;i++) {
if(qzs[i][3]>0)SelectObject (memdc, CreatePen (PS_SOLID,4/*ширина пера*/,RGB(150,0,0)));
if(qzs[i][3]<0)SelectObject (memdc, CreatePen (PS_SOLID,4/*ширина пера*/,RGB(55,130,200)));
if(qzs[i][3]!=0) Ellipse(memdc,qzs[i][1]-3,qzs[i][2]-3,qzs[i][1]+3,qzs[i][2]+3);}
BitBlt (hdc, 0, 0, maxX,maxY, memdc,0,0,SRCCOPY);
//SetMapMode(hdc, MM_LOMETRIC);
//SetViewportOrgEx(hdc,0,maxY,NULL);
EndPaint(hwnd,&paintstruct);
break;
case WM_CLOSE:
if (MessageBox(hwnd, "Вы действительльно хотите выйти?",
"Выход",MB_YESNO | MB_ICONQUESTION) == IDYES)
DestroyWindow(hwnd);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_EXIT:
if(MessageBox(hwnd, "Вы действительльно хотите выйти?", "Выход",MB_YESNO | MB_ICONQUESTION) == IDYES)
{
DestroyWindow(hwnd);
}
break;
case about:
;
MessageBox(hwnd, "Программа для изображения на плоскости картины силовых линий системы неподвижных электрических зарядов.\n v1.0\n", "О программе",MB_OK| MB_ICONINFORMATION);
break;
case ID_clean:
;
qs=0;
InvalidateRect(hwnd, NULL, FALSE);
UpdateWindow(hwnd);
break;
case undo:
;
if(qs>0) qs--;
InvalidateRect(hwnd, NULL, FALSE);
UpdateWindow(hwnd);
break;
case ggo:
;
if(qzs[qs+1][2]>0 && qzs[qs+1][1] >0)qs++;
InvalidateRect(hwnd, NULL, FALSE);
UpdateWindow(hwnd);
}
break;
case WM_HELP:
WinHelp(hwnd,"help1.hlp",HELP_CONTEXT,IDH_1);
break;
case WM_DESTROY:
PostQuitMessage(0);
ReleaseDC (hwnd, memdc) ;
DeleteDC (memdc) ;
break;
// case WM_TIMER
// draw2(LOWORD(lParam));
default: return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
//Обарботка диалогового окна
BOOL CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//char str1[80];
//char str2[80];
switch (uMsg)
{
case (WM_INITDIALOG):
//sprintf(str1, "%2.0f", time);
xk=xm/1000;
yk=ym/700;
str2[0]='+';
str3[0]='+';
for (i=1;i<=79;i++) {str2[i]=' ';str3[i]=' ';};
SetDlgItemText(hDlg, IDD_EDIT1,str1);
SetDlgItemText(hDlg, EDIT2,str2);
SetDlgItemText(hDlg, EDIT3,str3);
return TRUE;
case WM_CLOSE:
if (MessageBox(hwnd, "Вы уверены?",
"Выход",MB_YESNO | MB_ICONQUESTION) == IDYES)
EndDialog(hDlg, FALSE);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
GetDlgItemText(hDlg, IDD_EDIT1, str1, 80);
time= (float)atof(str1);//перевод
GetDlgItemText(hDlg, EDIT2, str2, 80);
xk= (float)atof(str2);//перевод
GetDlgItemText(hDlg, EDIT3, str3, 80);
yk= (float)atof(str3);//перевод
if(str2[0]!='+') xm=(int)(xk*1000)+12;
if(str3[0]!='+') ym=(int)(yk*700)+20;
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
EndDialog(hDlg, TRUE);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, TRUE);
return TRUE;
}
}
return FALSE;
}
E(x,y)
{double px,py;
px=0;
py=0;
for (q=1;q<=qs;q++){
px=px+k*(x-qzs[q][1])*qzs[q][3]/((x-qzs[q][1])*(x-qzs[q][1])+(y-qzs[q][2])*(y-qzs[q][2]))/sqrt((x-qzs[q][1])*(x-qzs[q][1])+(y-qzs[q][2])*(y-qzs[q][2]));
py=py+k*(y-qzs[q][2])*qzs[q][3]/((x-qzs[q][1])*(x-qzs[q][1])+(y-qzs[q][2])*(y-qzs[q][2]))/sqrt((x-qzs[q][1])*(x-qzs[q][1])+(y-qzs[q][2])*(y-qzs[q][2]));}
p=sqrt(px*px+py*py);
ex=0.7*px/p;
ey=0.7*py/p;
//if (abs(ex)<abs(ey)&&px*py!=0) {ex=2*abs(ex)/ex ; ey=(int)(2*py/abs(px));};
//if (abs(ex)>abs(ey)&&px*py!=0) {ex=(int)(2*px/abs(py)); ey=2*abs(ey)/ey;};
return 1;
}
Соседние файлы в папке Поле системы электростатических зарядов