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(); // закрыть форму приложения

}

Наши рекомендации