LRESULT CALLBACK GraphWndProc ( HWND hwnd, UINT msg
WPARAM wParam, LPARAM lParam)
{
Switch ( msg )
{ HANDLE_MSG ( hwnd, WM_PAINT, GraphOnPaint );
default:
return DefWindowProc ( hwnd, msg, wParam, lParam );
}
}
/* --- Обработчик сообщения WM_PAINT окна графики */
Void GraphOnPaint ( HWND hwnd )
{
PAINTSTRUCT ps;
HDC hdc=BeginPaint ( hwnd, &ps );
MoveToEx ( hdc, 10, cos ( nFreq * acos((double)-1) +
(double)sinfo.nPos*M_PI/180 )*100 + 110, NULL );
SelectPen ( hdc, hRedPen );
for ( int i=-100; i<100; i++ )
LineTo ( hdc, i+110, cos ( nFreq * acos ( (double)i/100 ) +
(double)sinfo.nPos*M_PI/180 )*100 + 110 );
for ( int i=100; i>=-100; i-- )
LineTo ( hdc, i+110, cos ( -nFreq * acos ( (double)i/100 ) +
(double)sinfo.nPos*M_PI/180 )*100 + 110 );
EndPaint ( hwnd, &ps );
}
/* --- Обработчик сообщения WM_HSCROLL */
Void OnHScroll ( HWND, HWND hwndCtl, UINT code, int pos )
{
char szT[10];
if ( ( hwndCtl==hwndTrack) && ( code==TB_ENDTRACK) )
nFreq = SendMessage ( hwndTrack, TBM_GETPOS, 0, 0 );
if ( hwndCtl==hwndScroll )
{ switch ( code )
{ case SB_LINERIGHT:
sinfo.nPos++;
if ( sinfo.nPos > sinfo.nMax )
sinfo.nPos = sinfo.nMax;
SetScrollInfo ( hwndScroll, SB_CTL, &sinfo, TRUE );
break;
case SB_LINELEFT:
sinfo.nPos--;
if ( sinfo.nPos < sinfo.nMin )
sinfo.nPos = sinfo.nMin;
SetScrollInfo ( hwndScroll, SB_CTL, &sinfo, TRUE );
break;
case SB_PAGERIGHT:
sinfo.nPos+=sinfo.nPage;
if ( sinfo.nPos > sinfo.nMax )
sinfo.nPos = sinfo.nMax;
SetScrollInfo ( hwndScroll, SB_CTL, &sinfo, TRUE );
break;
case SB_PAGELEFT:
sinfo.nPos-=sinfo.nPage;
if ( sinfo.nPos < sinfo.nMin )
sinfo.nPos = sinfo.nMin;
SetScrollInfo ( hwndScroll, SB_CTL, &sinfo, TRUE );
break;
case SB_THUMBTRACK:
sinfo.nPos = pos;
if ( sinfo.nPos > sinfo.nMax )
sinfo.nPos = sinfo.nMax;
if ( sinfo.nPos < sinfo.nMin )
sinfo.nPos = sinfo.nMin;
SetScrollInfo ( hwndScroll, SB_CTL, &sinfo, TRUE );
break;
}
wsprintf ( szT, "%d", sinfo.nPos );
SetWindowText ( hwndStatic, szT );
}
// --- Перерисовать график
InvalidateRect ( hwndGraph, NULL, TRUE );
}
/* --- Обработчик сообщения WM_GETMINMAXINFO */
Void OnGetMinMaxInfo ( HWND, LPMINMAXINFO lpmmi )
{
lpmmi->ptMinTrackSize.x = XSIZE;
lpmmi->ptMinTrackSize.y = YSIZE;
lpmmi->ptMaxTrackSize.x = XSIZE;
lpmmi->ptMaxTrackSize.y = YSIZE;
}
/* --- Обработчик сообщения WM_DESTROY */
Void OnDestroy ( HWND )
{
DeleteObject ( hGreyBrush );
DeleteObject ( hRedPen );
PostQuitMessage(0);
}
// Amper_A.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
USERES("Amper_A.res");
USEFORM("Amper_1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
Try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//---------------------------------------------------------------------------
// Amper_1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Amper_1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double u=10, i, r=5;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//u = StrToFloat ( Edit1->Text );
//r = StrToFloat ( Edit2->Text );
u = atof ( Edit1->Text.c_str() );
r = atof ( Edit2->Text.c_str() );
i = u/r;
Edit1->Text = FloatToStrF ( u, ffFixed, 7, 2 ) + " V";
Edit2->Text = FloatToStrF ( r, ffFixed, 7, 1 ) + " Om";
Label4->Caption = "Ток = " +
FloatToStr ( i ) + " А";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text = FloatToStr ( u ) + " V";
Edit2->Text = FloatToStr ( r ) + " Om";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2Click(TObject *Sender)
{
u = atof ( Edit1->Text.c_str() );
Edit1->Text = FloatToStrF ( u, ffFixed, 7, 2 ) + " V";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Click(TObject *Sender)
{
r = atof ( Edit2->Text.c_str() );
Edit2->Text = FloatToStrF ( r, ffFixed, 7, 1 ) + " Om";
}
//---------------------------------------------------------------------------
// Amper1.cpp
//---------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------
USEFORM("amper1_.cpp", Form1);
//---------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
Try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//---------------------------------------------------------------
/* Amper1_.cpp
Программа вычисляет силу тока в электрической цепи.
Демонстрирует обработку:
- события KeyPress;
- исключения EZerroDevide (деление на ноль)
при помощи инструкции try … catch.
*/
#include <vcl.h>
#pragma hdrstop
#include "amper1_.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
// щелчок на кнопке Вычислить
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Float u; // напряжение
Float r; // сопротивление
Float i; // ток
// проверим, введены ли данные в поля Напряжение и Сопротивление
if ( ((Edit1->Text).Length() == 0) || ((Edit2->Text).Length() == 0))
{
MessageDlg("Надо ввести напряжение и сопротивление",
mtInformation, TMsgDlgButtons() << mbOK, 0);
if ((Edit1->Text).Length() == 0)
Edit1->SetFocus(); // курсор в поле Напряжение
Else
Edit2->SetFocus(); // курсор в поле Сопротивление
return;
};
// получить данные из полей ввода
u = StrToFloat(Edit1->Text);
r = StrToFloat(Edit2->Text);
// вычислить ток
Try
{
i = u/r;
}
catch (EZeroDivide &e)
{
ShowMessage("Величина опротивления не должна быть равна нулю");
Edit2->SetFocus(); // курсор в поле Сопротивление
return;
}
// вывести результат в поле Label4
Label4->Caption = "Ток : " +
FloatToStrF(i,ffGeneral,7,2) + " A";
}
// нажатие клавиши в поле Напряжение
// коды запрещенных клавиш заменим нулем, в результате
// символы этих клавиш в поле редактирования не появятся
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
// Key - код нажатой клавиши
// проверим, является ли символ допустимым
if ( ( Key >= '0') && ( Key <= '9' ) ) // цифра
return;
// Глобальная переменная Decimalseparator
// содержит символ, используемый в качестве разделителя
// при записи дробных чисел
if ( Key == DecimalSeparator)
{
if ( (Edit1->Text).Pos(DecimalSeparator) != 0 )
Key = 0; // разделитель уже введен
return;
}
if (Key == VK_BACK) // клавиша <Backspace>
return;
if ( Key == VK_RETURN) // клавиша <Enter>
{
Edit2->SetFocus();
return;
};
// остальные клавиши запрещены
Key = 0; // не отображать символ
}
// нажатие клавиши в поле Сопротивление
void __fastcall TForm1::Edit2KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if ( ( Key >= '0') && ( Key <= '9' ) ) // цифра
return;
if ( Key == DecimalSeparator) {
if ( (Edit2->Text).Pos(DecimalSeparator) != 0 )
Key = 0; // разделитель уже введен
return;
}
if (Key == VK_BACK) // клавиша <Backspace>
return;
if ( Key == VK_RETURN) // клавиша <Enter>
{
Button1->SetFocus(); // переход к кнопке Вычислить
// повторное нажатие клавиши <Enter>
// активизирует процесс вычисления тока
// см. Button1Click
return;
};
// остальные клавиши запрещены
Key = 0; // не отображать символ
}
// щелчок на кнопке Завершить
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Close(); // закрыть форму приложения
}