Sl-Alex домашняя лаборатория

Руководство по WxWidgets: 1. Вспомогательные классы

Просмотров: 3805Комментарии: 0
Статьи
Руководство по WxWidgets: 1. Вспомогательные классы

wxWidgets содержит большую группу вспомогательных классов, облегчающих работу программистам. Есть классы для работы со строками, файлами, xml документами, потоками, базами данных и сетью. Здесь мы рассмотрим лишь крошечную капельку из этого огромного озера.

Библиотека wxWidgets может быть использована для создания как консольных, так и GUI приложений. В этой главе будет продемонстрировано использование некоторых вспомогательных классов в консольных приложениях. В конце главы, как обычно, ссылки на остальные материалы курса.

Консоль

Итак, напишем небольшую консольную программу, которая помещает некоторый текст в окно консоли. Внимание: в Unix/Linux нужно воспользоваться следующими операторами, чтобы скомпилировать программу:

g++ file_name.cpp -o hworld `wx-config --cxxflags --libs`
console.cpp:
#include <wx/string.h>
int main(int argc, char **argv)
{
	wxPuts(wxT("A wxWidgets console application"));
}
Результат:
A wxWidgets console application

wxString

Это, вероятно, наиболее полезный класс. wxString — класс, отвечающий за отображение символьных строк.

В следующем примере мы определим три строки wxString. Затем мы объединим их в одну строку, используя операцию сложения.

addition.cpp:
#include <wx/string.h>
int main(int argc, char **argv)
{
	wxString str1 = wxT("Linux");
	wxString str2 = wxT("Operating");
	wxString str3 = wxT("System");
	wxString str = str1 + wxT(" ") + str2 + wxT(" ") + str3;
	wxPuts(str);
}
Результат:
Linux Operating System

Метод Printf() используется для форматирования строк.

formatted.cpp:
#include <wx/string.h>
int main(int argc, char **argv)
{
	int flowers = 21;
	
	wxString str;
	str.Printf(wxT("There are %d red roses."), flowers);
	
	wxPuts(str);
}
Результат:
There are 21 red roses.

В следующем примере мы проверяем строку на наличие в ней другой строки. Для этого мы используем метод Contains().

contains.cpp:
#include <wx/string.h>
int main(int argc, char **argv)
{
	wxString str = wxT("The history of my life");
	if (str.Contains(wxT("history"))) {
		wxPuts(wxT("Contains!"));
	}
	
	if (!str.Contains(wxT("plain"))) {
		wxPuts(wxT("Does not contain!"));
	}
}
Результат:
Contains!
Does not contain!

Метод Len() возвращает количество символов в строке.

length.cpp:
#include <wx/string.h>
int main(int argc, char **argv)
{
	wxString str = wxT("The history of my life");
	wxPrintf(wxT("The string has %d characters\n"), str.Len());
}
Результат:
The string has 22 characters

Методы MakeLower() и MakeUpper() преобразуют все символы строки в строчные и прописные соответственно.

cases.cpp:
#include <wx/string.h>
int main(int argc, char **argv)
{
	wxString str = wxT("The history of my life");
	
	wxPuts(str.MakeLower());
	wxPuts(str.MakeUpper());
}
Результат:
the history of my life
THE HISTORY OF MY LIFE

Вспомогательные функции

wxWidgets содержит несколько удобных вспомогательных функций для выполнения системных команд, получения домашней директории пользователя или названия операционной системы.

В следующем примере мы выполним команду ls (только для Unix/Linux). Для этого нам понадобится функция wxShell().

shell.cpp:
#include <wx/string.h>
#include <wx/utils.h>
int main(int argc, char **argv)
{
	wxShell(wxT("ls -l"));
}
Результат:
total 40
-rwxr-xr-x 1 vronskij vronskij 9028 2007-09-06 22:10 basic
-rw-r--r-- 1 vronskij vronskij 95 2007-09-06 22:09 basic.cpp
-rw-r--r-- 1 vronskij vronskij 430 2007-09-06 00:07 basic.cpp~
-rwxr-xr-x 1 vronskij vronskij 11080 2007-09-05 23:17 console
-rw-r--r-- 1 vronskij vronskij 500 2007-09-05 23:17 console.cpp
-rw-r--r-- 1 vronskij vronskij 485 2007-09-05 23:16 console.cpp~

Далее мы получим домашнюю директорию пользователя, имя ОС, имя пользователя, имя хоста и общее количество свободной памяти.

system.cpp:
#include <wx/string.h>
#include <wx/utils.h>
int main(int argc, char **argv)
{
	wxPuts(wxGetHomeDir());
	wxPuts(wxGetOsDescription());
	wxPuts(wxGetUserName());
	wxPuts(wxGetFullHostName());
	long mem = wxGetFreeMemory().ToLong();
	wxPrintf(wxT("Memory: %d\n"), mem);
}
Результат:
/home/vronskij
Linux 2.6.20-16-generic i686
jan bodnar
spartan
Memory: 741244928

Время и дата

В wxWidgets есть несколько классов для работы с датой и временем.

Следующий пример показывает системную дату и время в различных форматах.

datetime.cpp:
#include <wx/datetime.h>
int main(int argc, char **argv)
{
	wxDateTime now = wxDateTime::Now();
	wxString date1 = now.Formant();
	wxString date2 = now.Format(wxT("%X"));
	wxString date3 = now.Format(wxT("%x"));
	
	wxPuts(date1);
	wxPuts(date2);
	wxPuts(date3);
}
Результат:
Fri Sep 7 21:28:38 2007
21:28:38
09/07/07

Теперь покажем текущее время в разных городах.

datetime.cpp:
#include <wx/datetime.h>
int main(int argc, char **argv)
{
	wxDateTime now = wxDateTime::Now();
	
	wxPrintf(wxT(" Tokyo: %s\n"), now.Format(wxT("%a %T"), 
		wxDateTime::GMT9).c_str());
	wxPrintf(wxT(" Moscow: %s\n"), now.Format(wxT("%a %T"), 
		wxDateTime::MSD).c_str());
	wxPrintf(wxT("Budapest: %s\n"), now.Format(wxT("%a %T"), 
		wxDateTime::CEST).c_str());
	wxPrintf(wxT(" London: %s\n"), now.Format(wxT("%a %T"), 
		wxDateTime::WEST).c_str());
	wxPrintf(wxT("New York: %s\n"), now.Format(wxT("%a %T"), 
		wxDateTime::EDT).c_str());
}
Результат:
Tokyo: Sat 05:42:24
Moscow: Sat 00:42:24
Budapest: Fri 22:42:24
London: Fri 22:42:24
New York: Fri 16:42:24

Следующий пример показывает как можно увеличить время/дату на некоторый интервал. Мы добавим один месяц к текущей дате.

datespan.cpp:
#include <wx/datetime.h>
int main(int argc, char **argv)
{
	wxDateTime now = wxDateTime::Now();
	wxString date1 = now.Format(wxT("%B %d %Y"));
	wxPuts(date1);
	
	wxDateSpan span(0, 1);
	wxDateTime then = now.Add(span);
	
	wxString date2 = then.Format(wxT("%B %d %Y"));
	wxPuts(date2);
}
Результат:
September 07 2007
October 07 2007

Файлы

В wxWidgets имеется несколько классов, предназначенных для работы с файлами. В противовес потокам, эти классы обеспечивают низкоуровневый доступ к файлам.

В следующем примере мы воспользуемся классом wxFile, чтобы создать новый файл и запись в него данные. Мы также проверим, является ли файл открытым. Заметим, что при создании файла он автоматически остается открытым.

createfile.cpp:
#include <wx/file.h>
int main(int argc, char **argv)
{
	wxString str = wxT("You make me want to be a better man.\n");
	wxFile file;
	file.Create(wxT("quote"), true);
	
	if (file.IsOpened())
		wxPuts(wxT("the file is opened"));
	
	file.Write(str);
	file.Close();
	
	if (!file.IsOpened())
		wxPuts(wxT("the file is not opened"));
}
Результат:
$ ls quote
ls: qoute: No such file or directory
$ ./createfile 
the file is opened (файл открыт).
the file is not opened (файл не открыт).
$ cat quote
You make me want to be a better man.

wxTextFile — это простой класс, который позволяет работать со строками в текстовых файлах. С этим классом работать проще, чем с классом wxFile.

В следующем примере мы выведем на экран число строк в файле, первую и последнюю строки и, наконец, считаем и выведем все содержимое файла.

readfile.cpp:
#include <wx/textfile.h>
int main(int argc, char **argv)
{
	wxTextFile file(wxT("test.c"));
	file.Open();
	
	wxPrintf(wxT("Number of lines: %d\n"), file.GetLineCount());
	wxPrintf(wxT("First line: %s\n"), file.GetFirstLine().c_str());
	wxPrintf(wxT("Last line: %s\n"), file.GetLastLine().c_str());
	wxPuts(wxT("-------------------------------------"));
	wxString s;
	for ( s = file.GetFirstLine(); !file.Eof(); 
		s = file.GetNextLine() )
	{
		wxPuts(s);
	}
	
	file.Close();
}
Результат:
Number of lines: 8
First line: #include 
Last line: }
#include <glib.h>
#include <glib/gstdio.h>
int main() {
g_mkdir("/home/vronskij/test", S_IRWXU);
}

Класс wxDir позволяет нам перечислять файлы и директории.

В следующем примере мы выведем на экран список всех файлов и директорий, которые находятся в текущей рабочей директории.

dir.cpp:
#include <wx/dir.h>
#include <wx/filefn.h>
int main(int argc, char **argv)
{
	wxDir dir(wxGetCwd());
	
	wxString file;
	
	bool cont = dir.GetFirst(&file, wxEmptyString,
		wxDIR_FILES | wxDIR_DIRS);
	
	while (cont) {
		wxPuts(file);
		cont = dir.GetNext(&file);
	}
}
Результат:
$ ./dir
dir
temp
console
basic.cpp
basic
quote
createfile
console.cpp
basic.cpp~
test.c
console.cpp~

Остальные материалы курса:

Вступление

1. Вспомогательные классы

2. Первые программы

3. Меню и панели инструментов

4. Управление компоновкой

5. События

6. Диалоги

7. Виджеты часть 1

8. Виджеты часть 2

9. Перетаскивание

10. Контексты устройств

11. Самодельные виджеты

12. Тетрис в wxWidgets

Примечание

Оригинал руководства расположен здесь. Автор оригинала - Jan Bodnar.

Перевод (без разметки и картинок) был выполнен пользователем ber113 с сайта translated.by. К сожалению, сайт сейчас не работает.

Данный документ представляет собой компиляцию указанных документов с сохранением оригинальной разметки и иллюстраций.