Скачиваний:
43
Добавлен:
06.05.2013
Размер:
9.66 Кб
Скачать
//Каркас приложения для 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;
		}
		
Соседние файлы в папке Поле системы электростатических зарядов