Консультация № 174799
02.12.2009, 23:41
35.00 руб.
0 3 1
Доброго времени суток! Друзья,помогите грамотно исправить код программы из приложения таким образом,чтобы вывод всех диагностических сообщений на ряду с результатами расчётов был организован через поле вывода результата на форме.
Примечание : В данный момент сообщения выводятся посредством всплывающих окон.

Приложение:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//Идентификаторы элементов управления
#define PI 3.14
#define CLASSNAME "Class"
#define WIDTH 490
#define HEIGHT 200

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
HWND hWnd;

bool isnumber (const char* s)
{
int len = strlen(s);
for (int i = (*s == '-' || *s == '+') && len > 1; i < len; i++)
if (s[i] < '0' || s[i] > '9') return false;
return true;
}

float func118 (short R, short r)
{ return fabs(PI * R * R - PI * r * r);}

//Функция, которая является входной точкой приложения
int APIENTRY WinMain (HINSTANCE hinst, HINSTANCE, char*, int)
{//Создаём класс окна
WNDCLASSEX wcx =
{
sizeof(WNDCLASSEX),
0,
WndProc,
0,
0,
hinst,
LoadIcon(0, IDI_APPLICATION),
LoadCursor(0, IDC_ARROW),
(HBRUSH)GetStockObject(WHITE_BRUSH),
0,
CLASSNAME,
LoadIcon(0, IDI_APPLICATION)
};
//Регистрация класса
RegisterClassEx(&wcx);
//Создать окно
HWND hwMain = CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW,//Стиль окна
CLASSNAME,//Класс
"Лабораторная работа №1 (Вариант №18)",
(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN) & ~WS_MAXIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
WIDTH,
HEIGHT,
0,
0,
hinst,
0
);
if (hwMain)

{ //Показать окно
ShowWindow(hwMain, SW_SHOW);
MSG mes;
//Цикл обработки сообщений
while (GetMessage(&mes, //Указатель на структуру сообщения
0, 0, 0) > 0)
{
if (!IsDialogMessage(hwMain, &mes))
{
TranslateMessage(&mes);//Преобразование клавиатурного ввода
DispatchMessage(&mes);//Обработка и пересылка сообщений в WinProc
}
}
}
ExitProcess(0);
}
//Процедура окна
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
//Элементы управления
static HWND hwStaticR, hwStaticr, hwStaticS, hwEditR, hwEditr, hwEditS, hwButtonOK, hwButtonClear, hwButtonQuit ;
switch (message) {
case WM_CTLCOLORSTATIC:
return (long)GetStockObject(WHITE_BRUSH);
case WM_GETMINMAXINFO:
((MINMAXINFO*)lParam)->ptMinTrackSize.x = WIDTH;
((MINMAXINFO*)lParam)->ptMinTrackSize.y = HEIGHT;
((MINMAXINFO*)lParam)->ptMaxTrackSize.x = WIDTH;
((MINMAXINFO*)lParam)->ptMaxTrackSize.y = HEIGHT;
return 0;

case WM_CREATE:
//Параметры и координаты расположения сообщения для 1-го поля ввода
hwStaticR = CreateWindowEx(0, "STATIC", "Введите значение радиуса 1-го круга : ",
WS_CHILD | WS_VISIBLE | SS_RIGHT,
0,
10,
350,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Параметры и координаты расположения сообщения для 2-го поля ввода
hwStaticr = CreateWindowEx(0, "STATIC", "Введите значение радиуса 2-го круга : ",
WS_CHILD | WS_VISIBLE | SS_RIGHT,
0,
40,
350,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Элемент декорации
hwStaticR = CreateWindowEx(0, "STATIC", "_____________________________________________________",
WS_CHILD | WS_VISIBLE | SS_RIGHT,
10,
70,
460,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для поля ввода EditR
hwEditR = CreateWindowEx(0, "EDIT", "",
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
355,
10,
100,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для поля ввода Editr
hwEditr = CreateWindowEx(0, "EDIT", "",
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
355,
40,
100,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для EditS
hwEditS = CreateWindowEx(0, "EDIT","" ,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY,
185,
100,
270,
20,
hWnd, 0, GetModuleHandle(0), 0);

//Координаты и параметры для кнопки "Вычислить"
hwButtonOK = CreateWindowEx(0, "BUTTON", "Вычислить",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
10,
130,
100,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для кнопки "Очистить"
hwButtonClear = CreateWindowEx(0, "BUTTON", "Очистить",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
185,
130,
95,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для кнопки "Выход"
hwButtonQuit = CreateWindowEx(0, "BUTTON", "Выход",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
360,
130,
95,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Параметры и координаты расположения сообщения для поля вывода S
hwStaticS = CreateWindowEx(0, "STATIC", "Площадь кольца (S): ",
WS_CHILD | WS_VISIBLE | SS_RIGHT,
10,
100,
170,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для EditS
return 0;
//Данное сообщение посылается,когда окно должно быть закрыто
case WM_DESTROY:
PostQuitMessage(0);
return 0;
//Проверка корректности вводимых данных в соответствии с условием поставленной задачи
case WM_COMMAND:
if (wParam >> 16 == BN_CLICKED)
{
if ((HWND)lParam == hwButtonOK)
{
int lR = GetWindowTextLength(hwEditR);
int lr = GetWindowTextLength(hwEditr);

if (lR && lr)
{
char* sR = new char [lR + 1];
char* sr = new char [lr + 1];
GetWindowText(hwEditR, sR, lR + 1);
GetWindowText(hwEditr, sr, lr + 1);
char* mess = new char [256];

if (!isnumber(sR) && !isnumber(sr)) {
sprintf(mess, "Неверные входные значения 1-го и 2-го круга!\nВведите целочисленное значение в диапазоне от -32768 до 32767.");
MessageBox(0, mess, "Ошибка", MB_ICONERROR | MB_OK);
} else if (!isnumber(sR)) {
sprintf(mess, " (%s) - Неверное значение 1-го круга!\nВведите целочисленное значение в диапазоне от -32768 до 32767.", sR);
MessageBox(0, mess, "Ошибка", MB_ICONERROR | MB_OK);
} else if (!isnumber(sr)) {
sprintf(mess, "(%s) - Неверное значение 2-го круга!\nВведите целочисленное значение в диапазоне от -32768 до 32767.", sr);
MessageBox(0, mess, "Ошибка", MB_ICONERROR | MB_OK);

} else {

int iR = atoi(sR);
int ir = atoi(sr);
short R = iR;
short r = ir;
if (R != iR && r != ir)
{
sprintf(mess, "'Неверные входные значения 1-го и 2-го круга!\nВведите целочисленное значение в диапазоне от -32768 до 32767.", sr);
MessageBox(0, mess, "Ошибка !", MB_ICONERROR | MB_OK);
}
else if (R != iR )
{
sprintf(mess, "(%s) - Неверное значение 1-го круга!\nВведите целочисленное значение в диапазоне от -32768 до 32767.", sR);
MessageBox(0, mess, "Ошибка !", MB_ICONERROR | MB_OK);
}
else if (r != ir)
{
sprintf(mess, "(%s) - Неверное значение 2-го круга!\nВведите целочисленное значение в диапазоне от -32768 до 32767.", sr);
MessageBox(0, mess, "Ошибка !", MB_ICONERROR | MB_OK);
}
else {
char* sResult = new char [256];
sprintf(sResult, "%.2f", func118(R, r));
SetWindowText(hwEditS, sResult);
delete [] sResult;
}
delete [] sR;
delete [] sr;
}
} else {
MessageBox(0, lR ? "Введите значение радиуса 2-го круга" : "Введите значение радиуса 1-го круга", "Ошибка", MB_ICONERROR | MB_OK);
}
} else if ((HWND)lParam == hwButtonClear) {
SetWindowText(hwEditR, "");
SetWindowText(hwEditr, "");
SetWindowText(hwEditS, "");
} else if ((HWND)lParam == hwButtonQuit) {
PostQuitMessage(0);
}
return 0;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}

Обсуждение

давно
Посетитель
7438
7205
03.12.2009, 02:06
общий
это ответ
Здравствуйте, Roma2010.
Примерно так, как в приложении.
Сообщения длиноваты, пришлось сократить.

Приложение:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//Идентификаторы элементов управления
#define PI 3.14
#define CLASSNAME "Class"
#define WIDTH 490
#define HEIGHT 200

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
HWND hWnd;

bool isnumber (const char* s)
{
int len = strlen(s);
for (int i = (*s == '-' || *s == '+') && len > 1; i < len; i++)
if (s[i] < '0' || s[i] > '9') return false;
return true;
}

float func118 (short R, short r)
{ return (float)fabs(PI * R * R - PI * r * r);}

//Функция, которая является входной точкой приложения
int APIENTRY WinMain (HINSTANCE hinst, HINSTANCE, char*, int)
{//Создаём класс окна
WNDCLASSEX wcx =
{
sizeof(WNDCLASSEX),
0,
WndProc,
0,
0,
hinst,
LoadIcon(0, IDI_APPLICATION),
LoadCursor(0, IDC_ARROW),
(HBRUSH)GetStockObject(WHITE_BRUSH),
0,
CLASSNAME,
LoadIcon(0, IDI_APPLICATION)
};
//Регистрация класса
RegisterClassEx(&wcx);
//Создать окно
HWND hwMain = CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW,//Стиль окна
CLASSNAME,//Класс
"Лабораторная работа №1 (Вариант №18)",
(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN) & ~WS_MAXIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
WIDTH,
HEIGHT,
0,
0,
hinst,
0
);
if (hwMain)

{ //Показать окно
ShowWindow(hwMain, SW_SHOW);
MSG mes;
//Цикл обработки сообщений
while (GetMessage(&mes, //Указатель на структуру сообщения
0, 0, 0) > 0)
{
if (!IsDialogMessage(hwMain, &mes))
{
TranslateMessage(&mes);//Преобразование клавиатурного ввода
DispatchMessage(&mes);//Обработка и пересылка сообщений в WinProc
}
}
}
ExitProcess(0);
return 0;
}
//Процедура окна
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
//Элементы управления
static HWND hwStaticR, hwStaticr, hwStaticS, hwEditR, hwEditr, hwEditS, hwButtonOK, hwButtonClear, hwButtonQuit ;
switch (message) {
case WM_CTLCOLORSTATIC:
return (long)GetStockObject(WHITE_BRUSH);
case WM_GETMINMAXINFO:
((MINMAXINFO*)lParam)->ptMinTrackSize.x = WIDTH;
((MINMAXINFO*)lParam)->ptMinTrackSize.y = HEIGHT;
((MINMAXINFO*)lParam)->ptMaxTrackSize.x = WIDTH;
((MINMAXINFO*)lParam)->ptMaxTrackSize.y = HEIGHT;
return 0;

case WM_CREATE:
//Параметры и координаты расположения сообщения для 1-го поля ввода
hwStaticR = CreateWindowEx(0, "STATIC", "Введите значение радиуса 1-го круга : ",
WS_CHILD | WS_VISIBLE | SS_RIGHT,
0,
10,
350,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Параметры и координаты расположения сообщения для 2-го поля ввода
hwStaticr = CreateWindowEx(0, "STATIC", "Введите значение радиуса 2-го круга : ",
WS_CHILD | WS_VISIBLE | SS_RIGHT,
0,
40,
350,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Элемент декорации
hwStaticR = CreateWindowEx(0, "STATIC", "_____________________________________________________",
WS_CHILD | WS_VISIBLE | SS_RIGHT,
10,
70,
460,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для поля ввода EditR
hwEditR = CreateWindowEx(0, "EDIT", "",
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
355,
10,
100,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для поля ввода Editr
hwEditr = CreateWindowEx(0, "EDIT", "",
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
355,
40,
100,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для EditS
hwEditS = CreateWindowEx(0, "EDIT","" ,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY,
185,
100,
270,
20,
hWnd, 0, GetModuleHandle(0), 0);

//Координаты и параметры для кнопки "Вычислить"
hwButtonOK = CreateWindowEx(0, "BUTTON", "Вычислить",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
10,
130,
100,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для кнопки "Очистить"
hwButtonClear = CreateWindowEx(0, "BUTTON", "Очистить",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
185,
130,
95,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для кнопки "Выход"
hwButtonQuit = CreateWindowEx(0, "BUTTON", "Выход",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
360,
130,
95,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Параметры и координаты расположения сообщения для поля вывода S
hwStaticS = CreateWindowEx(0, "STATIC", "Площадь кольца (S): ",
WS_CHILD | WS_VISIBLE | SS_RIGHT,
10,
100,
170,
20,
hWnd, 0, GetModuleHandle(0), 0);
//Координаты и параметры для EditS
return 0;
//Данное сообщение посылается,когда окно должно быть закрыто
case WM_DESTROY:
PostQuitMessage(0);
return 0;
//Проверка корректности вводимых данных в соответствии с условием поставленной задачи
case WM_COMMAND:
if (wParam >> 16 == BN_CLICKED)
{
if ((HWND)lParam == hwButtonOK)
{
int lR = GetWindowTextLength(hwEditR);
int lr = GetWindowTextLength(hwEditr);

char* sResult = new char [256];

if (lR && lr)
{
char* sR = new char [lR + 1];
char* sr = new char [lr + 1];
GetWindowText(hwEditR, sR, lR + 1);
GetWindowText(hwEditr, sr, lr + 1);
char* mess = new char [256];

if (!isnumber(sR) && !isnumber(sr)) {
sprintf(mess, "Введите целые [-32768,32767]");
SetWindowText(hwEditS, mess);
} else if (!isnumber(sR)) {
sprintf(mess, "(%s) - Введите целое [-32768,32767]", sR);
SetWindowText(hwEditS, mess);
} else if (!isnumber(sr)) {
sprintf(mess, "(%s) - Введите целое [-32768,32767]", sr);
SetWindowText(hwEditS, mess);

} else {

int iR = atoi(sR);
int ir = atoi(sr);
short R = iR;
short r = ir;
if (R != iR && r != ir)
{
sprintf(mess, "Введите целые [-32768,32767]");
SetWindowText(hwEditS, mess);
}
else if (R != iR )
{
sprintf(mess, "(%s) - Введите целое [-32768,32767]", sR);
SetWindowText(hwEditS, mess);
}
else if (r != ir)
{
sprintf(mess, "(%s) - Введите целое [-32768,32767]", sr);
SetWindowText(hwEditS, mess);
}
else {
sprintf(sResult, "%.2f", func118(R, r));
SetWindowText(hwEditS, sResult);
}
delete [] sR;
delete [] sr;
}
} else {
SetWindowText(hwEditS, lR ? "Введите радиус 2-го круга" : "Введите радиус 1-го круга");
}
delete [] sResult;
} else if ((HWND)lParam == hwButtonClear) {
SetWindowText(hwEditR, "");
SetWindowText(hwEditr, "");
SetWindowText(hwEditS, "");
} else if ((HWND)lParam == hwButtonQuit) {
PostQuitMessage(0);
}
return 0;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
5
Спасибо за помощь!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
03.12.2009, 12:17
общий
Здравствуйте,Лысков Игорь Витальевич.
Чтобы не укорачивать сообщения,я расширил по высоте поле вывода,но сообщения не переносятся на следующую строку,как это разрешить?
давно
Посетитель
7438
7205
03.12.2009, 12:32
общий
Добавить ему стиль ES_MULTILINE
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа