вторник, 1 июня 2021 г.

01.00.02 WxWidgets, подготовка к работе. Шаблон приложения WxWidgets с простой формой в MSVS2019.

Создадим проект на основе шаблона "wx base":




Назовем проект template_wx_frame.

Добавим к проекту класс main_frame, наследуясь от wxFrame:

Визард класса в файл main_frame.h автоматически добавил строку:

#include "D:\Cpp\Lib\wx\include\wx\univ\frame.h"

Нам этого добра не нужно: все нужные wzWidgets объявления доступны через файл  прекомпилированных заголовков, поэтому заменяем эту строку на следующую:

#include "pch.h"

Далее, переходим к файлу wxMain.pas. Добавляем строку 
#include "main_frame.h".

Меняем метод OnIni. Создаем экземпляр класса фрейма (окна) и показываем его:
 Содержимое файла после изменения:

#include "pch.h"
#include "main_frame.h"
class wx_main : public wxApp
{
public:
	virtual bool OnInit()
	{
		main_frame* mf = new main_frame("Привет!", wxPoint(50, 50), wxSize(450, 340));
		mf->Show();
		return true;
	};
};

wxIMPLEMENT_APP(wx_main);

Файл main_frame.h - расширяем описание класса main_frame, содержимое файла должен выглядеть так:
#pragma once
#include "pch.h"

class main_frame :   public wxFrame
{
public:

	main_frame(const wxString& title, const wxPoint& pos, const wxSize& size);

private:
	void OnHello(wxCommandEvent& event);
	void OnExit(wxCommandEvent& event);
	void OnAbout(wxCommandEvent& event);
};

enum
{
	ID_Hello = 1
};
В конструктор класса передаются параметры: заголовок окна, координаты центра и размеры.
Также добавляем обработчики событий On*(). 
Enum. В WxWidgets есть стандартные идентификаторы, к ним мы добавим ещё один ID_Hello.

Реализация класса main_frame - в файле main_frame.cpp.
#include "pch.h"
#include "main_frame.h"

main_frame::main_frame(const wxString& title, const wxPoint& pos, const wxSize& size)
	: wxFrame(NULL, wxID_ANY, title, pos, size)
{

	wxMenuBar* menuBar = new wxMenuBar; // Создание главного меню

	wxMenu* menuFile = new wxMenu; // Создание пункта меню "Файл"
	menuBar->Append(menuFile, "&Файл"); // Добавление созданного пункта меню к главному меню

	menuFile->Append(ID_Hello, "П&ривет...\tCtrl-H",// Добавлении строки меню к пункту "Файл"
		"Строка помощи в строке стостояния для данного пункта меню");
	menuFile->AppendSeparator(); // Разделитель списка пунктов меню
	menuFile->Append(wxID_EXIT, "В&ыход", "Завершить приложение"); // Добавление пункта меню к пункту "Файл"

	wxMenu* menuHelp = new wxMenu; // Создание пункта меню "Помощь"
	menuBar->Append(menuHelp, "&Помощь");

	menuHelp->Append(wxID_ABOUT, "О программе", "Показать диалог \"О программе\"" );

	SetMenuBar(menuBar); // 
	CreateStatusBar(); // Создание строки состояния ("статусбар")
	SetStatusText("Привет, это wxWidgets!"); // Текст в строке состояния по умолчанию

	// Привязка идентификаторов событий к обработчикам событий
	Bind(wxEVT_MENU, &main_frame::OnHello, this, ID_Hello);
	Bind(wxEVT_MENU, &main_frame::OnAbout, this, wxID_ABOUT);
	Bind(wxEVT_MENU, &main_frame::OnExit, this, wxID_EXIT);
	
}

void main_frame::OnHello(wxCommandEvent& event)
{
	wxLogMessage("Привет от wxWidgets!");

}

void main_frame::OnExit(wxCommandEvent& event)
{
	Close(true);
}

void main_frame::OnAbout(wxCommandEvent& event)
{
	wxMessageBox("Это пример wxWidget - приложения ' Привет, Мир!",
		"О приложении", wxOK | wxICON_INFORMATION);
}
В конструкторе класса создаются классы-оболочки визардов: меню, пунктов меню и статусбара.
При создании каждого пункта меню указывается идентификатор события, название и вспомогательный текст, который будет отображаться в статусбаре. Например:
menuFile->Append(wxID_EXIT, "В&ыход", "Завершить приложение");
Далее идентификаторы событий связываются с методами-обработчиками. Указывается тип события, ссылка на метод-обработчик, указатель на экземпляр класса обработчика и идентификатор события. Например:
	Bind(wxEVT_MENU, &main_frame::OnHello, this, ID_Hello);

Строим приложение, запускаем:


Красота!

И так, здесь форма создана "вручную", в коде.
Экспортируем шаблон приложения под именем "wx + frame":



Далее научимся использовать wxFormBuilder. 






Комментариев нет:

Отправить комментарий