Исходные коды программ и игр

Программирование - работа и хобби

Исходник программы расчета трансформатора

Язык программирования C++

Структура исходника

Программа расчета трансформаторов построена на C++ библиотеке MFC. Класс class CTransApp : public CWinApp основной класс на котором базируются все остальные оконные классы. Главная форма программы class CTransDlg : public CDialog представляет собой пустое поле. На поверхности главной формы, по желанию пользователя, показываются интерфейсы расчёта сетевого 50 герц либо импульсного трансформаторов. Соответственно, интерфейсы расчета трансформаторов представляют class CTrans50hertz : public CDialog и class CTransPulse : public CDialog. При желании можно добавить любое количество интерфейсов для расчёта других типов трансформаторов.

Визуальный интерфейс MFC

Визуальный интерфейс MFC C++Для наглядного построения интерфейса использовались диалоговые окна. Работа с диалоговыми окнами напоминает работу в визуальных средах программирования 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 Кбайт
Загрузки: 7546