Оглавление
Структура исходника
Программа расчета трансформаторов построена на C++ библиотеке MFC. Класс class CTransApp : public CWinApp
основной класс на котором базируются все остальные оконные классы. Главная форма программы class CTransDlg : public CDialog
представляет собой пустое поле. На поверхности главной формы, по желанию пользователя, показываются интерфейсы расчёта сетевого 50 герц либо импульсного трансформаторов. Соответственно, интерфейсы расчета трансформаторов представляют class CTrans50hertz : public CDialog
и class CTransPulse : public CDialog
. При желании можно добавить любое количество интерфейсов для расчёта других типов трансформаторов.
Визуальный интерфейс MFC
Для наглядного построения интерфейса использовались диалоговые окна. Работа с диалоговыми окнами напоминает работу в визуальных средах программирования C++Builder и Visual Studio на языках .NET. Каждый создаваемый интерфейс связывается с соответствующим классом, наследуемым от
class CDialog
.
Дополнительное окно расчётов, для третьего и более видов трансформаторов, создается в редакторе ресурсов. Далее, с помощью контекстного меню формы нового окна создаётся класс связанный с идентификатором данного оконного ресурса.
Смена интерфейсов
Для смены интерфейсов выбран способ скрытия и показа окон. Данный способ имеет простейшую логику и мгновенное переключение программы на разные типы трансформаторов.
Смена интерфейсов происходит посредством предварительно задекларированных командных сообщений:BEGIN_MESSAGE_MAP(CTransDlg, CDialog)
...
ON_COMMAND(ID_TRANS_50hertz, OnTrans50hertz)
ON_COMMAND(ID_PULSE, OnPulse)
...
END_MESSAGE_MAP()
...
void CTransDlg::OnTrans50hertz()
{
SetWindowText("Расчет сетевого трансформатора (~50 Гц однофазного)");
m_wndTrans50hertz.ShowWindow(SW_SHOW);
m_wndTransPulse.ShowWindow(SW_HIDE);
}
void CTransDlg::OnPulse()
{
SetWindowText("Расчет импульсного трансформатора");
m_wndTransPulse.ShowWindow(SW_SHOW);
m_wndTrans50hertz.ShowWindow(SW_HIDE);
}
Массивы окон
Для управления окнами редактирования и вывода результатов их дескрипторы хранятся в элементах массивов. Это уменьшает количество программного кода для проверки формата вводимых пользователем данных. Для предотвращения утечки памяти, в деструкторе дескрипторы отсоединяются от элементов массива.
BOOL CTrans50hertz::OnInitDialog()
{
...
// Инициализация массива Edit для ввода расчетного
// напряжения на вторичной обмотке
m_EditS_V[0].Attach(GetDlgItem(IDC_EDIT_SV0)->m_hWnd);
...
m_EditS_V[11].Attach(GetDlgItem(IDC_EDIT_SV11)->m_hWnd);
...
// Ввод массива Static для индикации количества витков
// вторичных обмоток.
m_StaticOut_SC[0].Attach(GetDlgItem(IDC_STATIC_SC0)->m_hWnd);
...
m_StaticOut_SC[11].Attach(GetDlgItem(IDC_STATIC_SC11)->m_hWnd);
return TRUE;
}
Файл справки
Файл справки программы - это одна страница HTML. Поскольку в поздних выпусках Windows не поддерживается формат справок .HPL, файл с гипертекстом полноценно заменяет справочную систему MFC. В нашем случае функция ShellExecute
открывает идущий файл HTML программой по умолчанию. Файл справки обязательно должен быть в одном каталоге с файлом приложения расчёта трансформаторов.
void CTransApp::OnHelp()
{
TCHAR Buffer[1024];
DWORD dwRet;
dwRet = GetCurrentDirectory(1024, Buffer);
if (dwRet != 0)
{
CString s = Buffer;
s.Append("\Transformer_Calculation.html");
ShellExecute(NULL, "open", s, NULL, NULL, SW_SHOW);
}
}
Функция печати
Для вывода результатов на бумажный носитель разработана функция печати, которая автоматически вычисляет количество окон CEdit
и CStatic
в которых есть правильные данные. Т.е. пользователь может заполнять окна произвольно, но на печать выйдет только значащие параметры обмоток. Доступ к службам печати получаем посредством class CPrintDialog
. Данный класс представляет собой диалоговый оконный интерфейс и включает в себя множество методов настроек печати. Каждый тип трансформаторов имеет собственные настройки для печати.
void CTransDlg::OnFilePrint()
{
if (m_wndTrans50hertz.IsWindowVisible() == false &&
m_wndTransPulse.IsWindowVisible() == false)
{
AfxMessageBox("Нет данных!");
return;
}
HDC hDC;
DOCINFO di;
// Диалог настройки печати
CPrintDialog dlgPD(TRUE);
// ПРЕДВАРИТЕЛЬНАЯ НАСТРОЙКА ПРИНТЕРА
PRINTDLG pd;
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd) == true)
{
DEVMODE* dm = (DEVMODE*)LocalLock(pd.hDevMode);
dm->dmFields = DM_ORIENTATION | DM_PAPERSIZE;
dm->dmOrientation = DMORIENT_PORTRAIT;
dm->dmPaperSize = DMPAPER_A4;
dlgPD.m_pd.hDevMode = pd.hDevMode;
LocalUnlock(pd.hDevMode);
}
else
{
AfxMessageBox("Возможно, не установлен ни один принтер.");
return;
}
// ВЫВОД НА ПЕЧАТЬ
if (dlgPD.DoModal() == IDOK)
{
// Получаем контекст принтера
hDC = dlgPD.CreatePrinterDC();
// Установка значений DOCINFO структуры.
memset(&di, 0, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "Transformer";
CDC dc;
dc.Attach(hDC);
// Запуск печати
dc.SetMapMode(MM_LOMETRIC);
if (StartDoc(dc.GetSafeHdc(), &di) != SP_ERROR)
{
// Печать страницы 1
StartPage(dc.GetSafeHdc());
if (m_wndTrans50hertz.IsWindowVisible() == true)
PrintTranse50hertz(&dc);
if (m_wndTransPulse.IsWindowVisible() == true)
PrintTransPulse(&dc);
EndPage(dc.GetSafeHdc());
EndDoc(dc.GetSafeHdc());
}
dc.Detach();
DeleteDC(hDC);
}
}
Файлы исходника программы расчета трансформаторов
Требования. Среда программирования Microsoft Visual Studio 2019, установленная библиотека C++ MFC. Если изменить макросы WINVER и _WIN32_WINNT исходники можно открыть другими версиями Visual Studio.
Скачать исходник
transksource_vs16.zip
- Размер: 181 Кбайт
- Загрузки: 8062