Глава 2 Привет мир!

«Bahasa Indonesia Book on wxWidgets» Noprianto, перевёл Дмитрий Goodluck(Cema)

Оглавление

Глава 2. Привет мир!
2.1 Структура каталогов приложения
2.2 Пример 1 «Привет мир»
2.2.1 Структура каталогов исходного кода:
2.2.2 Результат
2.2.3 Исходный код
2.2.3.1 SRC / hello.cpp
2.2.4 Компиляция
2.2.4.1 Компиляция на Linux (GTK +)
2.2.4.2 Компиляция на Windows
2.2.5 Необходимые библиотеки
2.2.5.1 Требования для библиотек на Linux
2.2.5.2 Требования к библиотекам в Windows
2.3 Пример 2 «Привет мир»
2.3.1 Структура каталогов исходного кода
2.3.2 Результат
2.3.3 Исходный код
2.3.3.1 SRC / app.h
2.3.3.2 SRC / app.cpp
2.3.3.3 SRC / frame.h
2.3.3.4 SRC / frame.cpp
2.3.4 Компиляция
2.3.4.1 Компиляция на Linux (GTK +)
2.3.4.2 Компиляция на Windows
2.3.5 Необходимые библиотеки
2.4 Пример 3 «Привет мир»
2.4.1 Структура каталогов исходного кода
2.4.2 Результат
2.4.3 Исходный код
2.4.3.1 SRC / app.h
2.4.3.2 SRC / app.cpp
2.4.3.3 SRC / frame.h
2.4.3.4 SRC / frame.cpp
2.4.4 Компиляция
2.4.4.1 Компиляция на Linux (GTK +)
2.4.4.2 Компиляция окна
2.4.5 Необходимые библиотеки
2,5 Пример 4 «Привет мир»
2.5.1 Структура каталогов исходного кода :
2.5.2 Результат
2.5.3 Исходный код
2.5.3.1 SRC / app.h
2.5.3.2 SRC / app.cpp
2.5.3.3 SRC / frame.h
2.5.3.4 SRC / frame.cpp
2.5.4 Компиляция
2.5.4.1 Компиляция на Linux (GTK +)
2.5.4.2 Компиляция на Windows
2.5.5 Необходимые библиотеки
2.6 ID окна представленные wxWidgets
2.7 Установка собственного идентификатора окна

Глава 2. Привет мир!
В этой главе будет обсуждаться, как создать простой пример, используя wxWidgets. В этой главе также представлен процесс составления программ для Windows и Linux платформ. После прочтения этой главы, разработчик сможет понять основные правила разработки приложений с wxWidgets.

2.1 Применяемая структура каталогов.
Эта книга будет использовать следующую структуру каталогов одного приложения:

<краткое_наименование_приложений>/
src/
<source code>
<source code>
<source code>
...
build/
<platform>/
<имя_приложений>
<platform>/
<platform>/
...
makefile.<platform>
makefile.<platform>
makefile.<platform>
...

Например:

minimal/
src/
minimal.cpp
build/
gtk/
minimal
msw/
minimal.exe
makefile.gtk
makefile.msw

2.2 Привет мир пример 1
Программа «Привет мир» будет содержать следующие элементы:
- Главное окно, которое будет называться Hello World!
- Пользователи могут нажать на кнопку «Закрыть» на заголовке окна для выхода из приложения.

Первый вариант программы «Привет мир», использует только один исходный файл с кодом. В нём, разработчик объявляет класс и пишет реализацию класса. Подобный путь написания
исходного кода, поможет в процессе обучения или при написании
небольшого приложения, но не рекомендуется для использования при разработке серьёзных приложений.

2.2.1 Структура каталогов с исходным кодом:

hello1/
build/
gtk/
hello
msw/
hello.exe
src/
hello.cpp
makefile.gtk
makefile.vc

2.2.2 Результат
После выполнения build/gtk/hello:
- Будет отображаться пустой фрейм
- Фрейм будет отображать текст «Hello World!» расположенный в строке заголовка
- Если на заголовке окна нажать кнопку, то окно приложения будет изменять размер или произойдёт выход из программы

2.2.3 Исходный код
2.2.3.1 SRC / hello.cpp
Вот исходный код SRC / hello.cpp:

# include "WX/wx.h"
class App : public wxApp
{
public:
virtual bool OnInit ();
};
class Frame: public wxFrame
{
public:
Frame (const wxString&title);
};
DECLARE_APP (App)
IMPLEMENT_APP (App)
bool App :: OnInit ()
{
Frame * frame = new Frame (_("Hello World!"));
frame -> Show (true);
return true;
}
Frame :: Frame (const wxString& title) : wxFrame (NULL, wxID_ANY, title)
{
}

Расшифровка кода:
- Каждый вызов определяет класс wxWIdgets приложения, которое указывает на wxApp класс. В этом примере имя класса, который используется - класс App.
- Существует только один экземпляр класса, который в настоящее время используется
- Применяемый класс должен определить метод OnInit(), который будет запускать wxWidgets для выполнения кода пользователя. Метод OnInit() эквивалентен функции Main() в C, или WinMain() при использовании Win32.
- Метод OnInit () обычно содержит код для главного окна, он
проверяет аргументы командной строки, предоставленный пользователем, устанавливает структуру данных приложения, и начинает выполнение задачи.
- Метод OnInit () возвращает данные типа BOOL - true или false.
Если возвращаемое значение true, то событие будет проходить цикл (применение будет работать). Если возвращаемое значение false, wxWidgets очищает используемую память, и вызывает завершение.
- В этом случае, OnInit (), выполняет две задачи:
- Создание окна верхнего уровня wxFrame и создание записи «Привет мир!»
- Новый фрейм отобразит созданные элементы.
Окно верхнего уровня будет отображено. В отличие от создания дочернего окна.
- Есть два макроса, IMPLEMENT_APP и DECLARE_APP которые помогают разработчику создавать объекты приложения, и предоставляют возможность разработчику доступ к объекту применения.
- В этом простом приложении, используются два варианта:
- класс App (полученный от общего wxApp)
- Содержит метод OnInit ()
- класс Frame (полученный от общего wxFrame)
- Содержит конструктор Frame (const wxString& title). В App::OnInit(), есть декларация создания Frame объекта для одного аргумента названия фрейма формы. В Frame::Frame(), названия будет не хватать его wxFrame:: wxFrame().
- Frame::Frame() в настоящее время не выполняют конкретные действия.
Вообще, в конструкторе, разработчик создаёт меню,
панели инструментов, состояния, и тому подобное.
- Существующий макроэлемент _() не используется. Используйте этот макрос, когда работаете со строками. Этот макрос может быть определен как:
- Подготовка символов строки и разрешить применение компиляции
в режиме Unicode
- Подготовленная строка будет переведена на другие языки.

2.2.4 Компиляция
2.2.4.1 Компиляция на Linux (GTK +)
Для компиляции в Linux используется Makefile. В этом случае имя файла makefilenya является makefile.gtk. Вот содержание makefile.gtk:

# simple makefile for simple wx project
# (c) Nop, 5 Feb 2006
# variables
WXCONFIG = wxconfig
WXPLAT = gtk
PROGRAM = hello
OBJECTS = src/hello.o
# system
CXX = $(shell $(WXCONFIG) cxx)
# implementation
.SUFFIXES: .o .cpp
.cpp.o :
$(CXX) c
`$(WXCONFIG) cxxflags`
o
$@ $<
all: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(CXX) o
$(PROGRAM) $(OBJECTS) `$(WXCONFIG) libs`
mkdir p
build/$(WXPLAT)
mv $(PROGRAM) build/$(WXPLAT)
rm f
src/*.o
clean:
rm f
src/*.o build/$(WXPLAT)/$(PROGRAM)

Описание Makefile:
- Автор создал простой Makefile, как пример простой
компиляции. Этот Makefile может быть изменён по мере необходимости.
- Makefile состоит из двух задач:
- Все то, что и будет делать компиляцию
- Очистка, которая будет удалять все объекты и исполняемые файлы
- Пользователь может изменять:
- WXCONFIG, имя файла wxconfig.
По умолчанию используется wxconfig.
- WXPLAT, платформа имя / порт. Постарайтесь не оставлять пустым имя файла. Желательно также дать имя wxWidgets порта.
Например, GTK, x11, ТБО и другие.
- Имя исполняемой программы
- Объекты, filefile объект. Когда более чем один файл, отдельно.
Для сборки делают следующее:

$ make f
makefile.gtk
g++ c
`wxconfig
cxxflags`
o
src/hello.o src/hello.cpp
g++ o
hello src/hello.o `wxconfig
libs`
mkdir p
build/gtk
mv hello build/gtk
rm f
src/*.o

Результатом произведённой компиляции станет исполняемый файл с именем Hello в каталоге build/gtk/.
Если вы хотите исключить файлы и произвести очистку, оставьте чистый аргумент.
Например:

$ make f
makefile.gtk clean
rm f
src/*.o build/gtk/hello

После выполнения этой команды все следы компиляции будут удалены.

2.2.4.2 Компиляция на Windows
Для компиляции в этой книге используется Makefile. В этом случае имя makefilenya файл makefile.vc. Данный файл включен в CD-ROM для этой книги.
Вот содержание makefile.vc:

# simple makefile for simple wx project
# (c) Nop, 5 Jul 2006
# adapted from wx sample's makefile.vc
# please edit:
# variables
(below)
# objs
(near EOF)
# variables
PROGRAM_NAME = hello
PROGRAM = $(WXPLAT)\$(PROGRAM_NAME).exe
OBJECTS = src\hello.obj
EXTRA_INCLUDES = /I"C:\Program Files\Microsoft Visual Studio\VC98\Include" \
/Ic:\wx\include\msvc \
/Ic:\wx\include\wx \
/Ic:\wx\include
UNICODE = 1
BUILD = release
WXPLAT = msw
# set if needed
CC = cl
CXX = cl
CFLAGS =
CXXFLAGS =
CPPFLAGS =
LDFLAGS =
CPP = $(CC) /EP /nologo
SHARED = 0
WXUNIV = 0
MSLU = 0
TARGET_CPU = $(CPU)
DEBUG_INFO = default
DEBUG_FLAG = default
DEBUG_RUNTIME_LIBS = default
MONOLITHIC = 0
USE_GUI = 1
USE_HTML = 1
USE_XRC = 1
USE_OPENGL = 0
USE_ODBC = 0
USE_QA = 0
USE_EXCEPTIONS = 1
USE_RTTI = 1
USE_THREADS = 1
OFFICIAL_BUILD = 0
VENDOR = custom
WX_FLAVOUR =
WX_LIB_FLAVOUR =
CFG =
CPPUNIT_CFLAGS =
CPPUNIT_LIBS =
RUNTIME_LIBS = dynamic
WX_RELEASE_NODOT = 26
LIBDIRNAME = c:\wx\lib\vc$(DIR_SUFFIX_CPU)_$(LIBTYPE_SUFFIX)$(CFG)
SETUPHDIR = \
$(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$
(WXDEBUGFLAG)
APP_CXXFLAGS = /M$(__RUNTIME_LIBS_8)$(__DEBUGRUNTIME_3) /DWIN32 \
$(__DEBUGINFO_0) /Fd$(WXPLAT)\$(PROGRAM_NAME).pdb $
(____DEBUGRUNTIME_2_p) \
$(__OPTIMIZEFLAG_4) $(__NO_VC_CRTDBG_p) /D__WXMSW__ $
(__WXUNIV_DEFINE_p) \
$(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \
$(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__MSLU_DEFINE_p) \
/I$(SETUPHDIR) $(EXTRA_INCLUDES) /W4 /I. $(__DLLFLAG_p) /D_WINDOWS \
/DNOPCH $(__RTTIFLAG_9) $(__EXCEPTIONSFLAG_10) $(CPPFLAGS) \
$(CXXFLAGS)
# system, please do not edit
### Conditionally set variables: ###
WXPLAT = build\$(WXPLAT)
!if "$(USE_GUI)" == "0"
PORTNAME = base
!endif
!if "$(USE_GUI)" == "1"
PORTNAME = msw
!endif
!if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default"
WXDEBUGFLAG = d
!endif
!if "$(DEBUG_FLAG)" == "1"
WXDEBUGFLAG = d
!endif
!if "$(UNICODE)" == "1"
WXUNICODEFLAG = u
!endif
!if "$(WXUNIV)" == "1"
WXUNIVNAME = univ
!endif
!if "$(TARGET_CPU)" == "amd64"
DIR_SUFFIX_CPU = _amd64
!endif
!if "$(TARGET_CPU)" == "amd64"
DIR_SUFFIX_CPU = _amd64
!endif
!if "$(TARGET_CPU)" == "ia64"
DIR_SUFFIX_CPU = _ia64
!endif
!if "$(TARGET_CPU)" == "ia64"
DIR_SUFFIX_CPU = _ia64
!endif
!if "$(SHARED)" == "1"
WXDLLFLAG = dll
!endif
!if "$(SHARED)" == "0"
LIBTYPE_SUFFIX = lib
!endif
!if "$(SHARED)" == "1"
LIBTYPE_SUFFIX = dll
!endif
!if "$(TARGET_CPU)" == "amd64"
LINK_TARGET_CPU = /MACHINE:AMD64
!endif
!if "$(TARGET_CPU)" == "amd64"
LINK_TARGET_CPU = /MACHINE:AMD64
!endif
!if "$(TARGET_CPU)" == "ia64"
LINK_TARGET_CPU = /MACHINE:IA64
!endif
!if "$(TARGET_CPU)" == "ia64"
LINK_TARGET_CPU = /MACHINE:IA64
!endif
!if "$(MONOLITHIC)" == "0"
EXTRALIBS_FOR_BASE =
!endif
!if "$(MONOLITHIC)" == "1"
EXTRALIBS_FOR_BASE =
!endif
!if "$(BUILD)" == "debug" && "$(DEBUG_INFO)" == "default"
__DEBUGINFO_0 = /Zi
!endif
!if "$(BUILD)" == "release" && "$(DEBUG_INFO)" == "default"
__DEBUGINFO_0 =
!endif
!if "$(DEBUG_INFO)" == "0"
__DEBUGINFO_0 =
!endif
!if "$(DEBUG_INFO)" == "1"
__DEBUGINFO_0 = /Zi
!endif
!if "$(BUILD)" == "debug" && "$(DEBUG_INFO)" == "default"
__DEBUGINFO_1 = /DEBUG
!endif
!if "$(BUILD)" == "release" && "$(DEBUG_INFO)" == "default"
__DEBUGINFO_1 =
!endif
!if "$(DEBUG_INFO)" == "0"
__DEBUGINFO_1 =
!endif
!if "$(DEBUG_INFO)" == "1"
__DEBUGINFO_1 = /DEBUG
!endif
!if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default"
____DEBUGRUNTIME_2_p = /D_DEBUG
!endif
!if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default"
____DEBUGRUNTIME_2_p =
!endif
!if "$(DEBUG_RUNTIME_LIBS)" == "0"
____DEBUGRUNTIME_2_p =
!endif
!if "$(DEBUG_RUNTIME_LIBS)" == "1"
____DEBUGRUNTIME_2_p = /D_DEBUG
!endif
!if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default"
____DEBUGRUNTIME_2_p_1 = /d _DEBUG
!endif
!if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default"
____DEBUGRUNTIME_2_p_1 =
!endif
!if "$(DEBUG_RUNTIME_LIBS)" == "0"
____DEBUGRUNTIME_2_p_1 =
!endif
!if "$(DEBUG_RUNTIME_LIBS)" == "1"
____DEBUGRUNTIME_2_p_1 = /d _DEBUG
!endif
!if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default"
__DEBUGRUNTIME_3 = d
!endif
!if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default"
__DEBUGRUNTIME_3 =
!endif
!if "$(DEBUG_RUNTIME_LIBS)" == "0"
__DEBUGRUNTIME_3 =
!endif
!if "$(DEBUG_RUNTIME_LIBS)" == "1"
__DEBUGRUNTIME_3 = d
!endif
!if "$(BUILD)" == "debug"
__OPTIMIZEFLAG_4 = /Od
!endif
!if "$(BUILD)" == "release"
__OPTIMIZEFLAG_4 = /O2
!endif
!if "$(USE_THREADS)" == "0"
__THREADSFLAG_7 = L
!endif
!if "$(USE_THREADS)" == "1"
__THREADSFLAG_7 = T
!endif
!if "$(RUNTIME_LIBS)" == "dynamic"
__RUNTIME_LIBS_8 = D
!endif
!if "$(RUNTIME_LIBS)" == "static"
__RUNTIME_LIBS_8 = $(__THREADSFLAG_7)
!endif
!if "$(USE_RTTI)" == "0"
__RTTIFLAG_9 =
!endif
!if "$(USE_RTTI)" == "1"
__RTTIFLAG_9 = /GR
!endif
!if "$(USE_EXCEPTIONS)" == "0"
__EXCEPTIONSFLAG_10 =
!endif
!if "$(USE_EXCEPTIONS)" == "1"
__EXCEPTIONSFLAG_10 = /EHsc
!endif
!if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "0"
__NO_VC_CRTDBG_p = /D__NO_VC_CRTDBG__
!endif
!if "$(BUILD)" == "release" && "$(DEBUG_FLAG)" == "1"
__NO_VC_CRTDBG_p = /D__NO_VC_CRTDBG__
!endif
!if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "0"
__NO_VC_CRTDBG_p_1 = /d __NO_VC_CRTDBG__
!endif
!if "$(BUILD)" == "release" && "$(DEBUG_FLAG)" == "1"
__NO_VC_CRTDBG_p_1 = /d __NO_VC_CRTDBG__
!endif
!if "$(WXUNIV)" == "1"
__WXUNIV_DEFINE_p = /D__WXUNIVERSAL__
!endif
!if "$(WXUNIV)" == "1"
__WXUNIV_DEFINE_p_1 = /d __WXUNIVERSAL__
!endif
!if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default"
__DEBUG_DEFINE_p = /D__WXDEBUG__
!endif
!if "$(DEBUG_FLAG)" == "1"
__DEBUG_DEFINE_p = /D__WXDEBUG__
!endif
!if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default"
__DEBUG_DEFINE_p_1 = /d __WXDEBUG__
!endif
!if "$(DEBUG_FLAG)" == "1"
__DEBUG_DEFINE_p_1 = /d __WXDEBUG__
!endif
!if "$(USE_EXCEPTIONS)" == "0"
__EXCEPTIONS_DEFINE_p = /DwxNO_EXCEPTIONS
!endif
!if "$(USE_EXCEPTIONS)" == "0"
__EXCEPTIONS_DEFINE_p_1 = /d wxNO_EXCEPTIONS
!endif
!if "$(USE_RTTI)" == "0"
__RTTI_DEFINE_p = /DwxNO_RTTI
!endif
!if "$(USE_RTTI)" == "0"
__RTTI_DEFINE_p_1 = /d wxNO_RTTI
!endif
!if "$(USE_THREADS)" == "0"
__THREAD_DEFINE_p = /DwxNO_THREADS
!endif
!if "$(USE_THREADS)" == "0"
__THREAD_DEFINE_p_1 = /d wxNO_THREADS
!endif
!if "$(UNICODE)" == "1"
__UNICODE_DEFINE_p = /D_UNICODE
!endif
!if "$(UNICODE)" == "1"
__UNICODE_DEFINE_p_1 = /d _UNICODE
!endif
!if "$(MSLU)" == "1"
__MSLU_DEFINE_p = /DwxUSE_UNICODE_MSLU=1
!endif
!if "$(MSLU)" == "1"
__MSLU_DEFINE_p_1 = /d wxUSE_UNICODE_MSLU=1
!endif
!if "$(SHARED)" == "1"
__DLLFLAG_p = /DWXUSINGDLL
!endif
!if "$(SHARED)" == "1"
__DLLFLAG_p_1 = /d WXUSINGDLL
!endif
!if "$(MONOLITHIC)" == "0"
__WXLIB_CORE_p = \
wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$
(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib
!endif
!if "$(MONOLITHIC)" == "0"
__WXLIB_BASE_p = \
wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$
(WX_LIB_FLAVOUR).lib
!endif
!if "$(MONOLITHIC)" == "1"
__WXLIB_MONO_p = \
wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$
(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib
!endif
!if "$(USE_GUI)" == "1"
__LIB_TIFF_p = wxtiff$(WXDEBUGFLAG).lib
!endif
!if "$(USE_GUI)" == "1"
__LIB_JPEG_p = wxjpeg$(WXDEBUGFLAG).lib
!endif
!if "$(USE_GUI)" == "1"
__LIB_PNG_p = wxpng$(WXDEBUGFLAG).lib
!endif
!if "$(MSLU)" == "1"
__UNICOWS_LIB_p = unicows.lib
!endif
all: $(WXPLAT)
$(WXPLAT):
if
not exist $(WXPLAT) mkdir $(WXPLAT)
### Targets: ###
all: $(PROGRAM)
clean:
if
exist $(WXPLAT)\*.obj del $(WXPLAT)\*.obj
if
exist $(WXPLAT)\*.res del $(WXPLAT)\*.res
if
exist $(WXPLAT)\*.pch del $(WXPLAT)\*.pch
if
exist $(WXPLAT)\$(PROGRAM_NAME).exe del $(WXPLAT)\$
(PROGRAM_NAME).exe
if
exist $(WXPLAT)\$(PROGRAM_NAME).ilk del $(WXPLAT)\$(PROGRAM_NAME).ilk
if
exist $(WXPLAT)\$(PROGRAM_NAME).pdb del $(WXPLAT)\$
(PROGRAM_NAME).pdb
$(PROGRAM): $(OBJECTS)
link /NOLOGO /OUT:$@ $(LDFLAGS) $(__DEBUGINFO_1) $
(LINK_TARGET_CPU) /LIBPATH:$(LIBDIRNAME) /SUBSYSTEM:WINDOWS @<<
$(OBJECTS) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $
(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$
(W
XUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $
(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) kernel32.lib user32.lib gdi32.lib
comdlg32.lib winspool.lib
winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib
wsock32.lib odbc32.lib
<<
if
exist src\*.obj del src\*.obj
if
exist src\*.res del src\*.res
# objs
src\hello.obj: src\hello.cpp
$(CXX) /c /nologo /TP /Fo$@ $(APP_CXXFLAGS) $**

Описание Makefile:
- Makefile может быть изменён по мере необходимости.
- Makefile состоит из двух задач:
- Все, то, что будет делать компиляцию
- Очистка, которая будет удалять все объекты и исполняемые файлы
- Изменения величин переменных, когда это необходимо.
Для сборки делают следующее:

> nmake f
makefile.vc
Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
Copyright (C) Microsoft Corp 19881998.
All rights reserved.
cl /c /nologo /TP /Fosrc\hello.obj /MD /DWIN32 /Fdbuild\msw\hello.pdb
/O2 /D__WXMSW__ /D_UNICODE /Ic:\wx\lib\vc_lib\mswu /I"C:\Program Fil
es\Microsoft Visual Studio\VC98\Include" /Ic:\wx\include\msvc /Ic:\wx\include
\wx /Ic:\wx\include /W4 /I. /D_WINDOWS /DNOPCH /GR /EHsc src\hello.cpp
hello.cpp
link /NOLOGO /OUT:build\msw\hello.exe /LIBPATH:c:\wx\lib\vc_lib /SUB
SYSTEM:WINDOWS @C:\DOCUME~1\nop\LOCALS~1\Temp\nma00480.
LINK : warning LNK4089: all references to "ADVAPI32.dll" discarded by /OPT:REF
LINK : warning LNK4089: all references to "OLEAUT32.dll" discarded by /OPT:REF
if exist src\*.obj del src\*.obj
if exist src\*.res del src\*.res

После компиляции, имя исполняемого файла hello.exe помещается в каталоге build/msw/.
Если вы хотите исключить файлы и произвести очистку, оставьте чистый аргумент.
Например:

>nmake f
makefile.vc clean
Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
Copyright (C) Microsoft Corp 19881998.
All rights reserved.
if exist build\msw\*.obj del build\msw\*.obj
if exist build\msw\*.res del build\msw\*.res
if exist build\msw\*.pch del build\msw\*.pch
if exist build\msw\hello.exe del build\msw\hello.exe
if exist build\msw\hello.ilk del build\msw\hello.ilk
if exist build\msw\hello.pdb del build\msw\hello.pdb

После выполнения все следы компиляции будут удалены.

2.2.5 Необходимые библиотеки
2.2.5.1 Требования к библиотекам на Linux.
Чтобы посмотреть, какие библиотеки нужны приложению Hello, перейдите на страницу каталог build/gtk/ и сделайте следующие:

$ ldd hello
libwx_gtk2u_xrc2.6.
so.0 => /home/nop/wxgtk/lib/libwx_gtk2u_xrc2.6.
so.0
(0x40018000)
libwx_gtk2u_qa2.6.
so.0 => /home/nop/wxgtk/lib/libwx_gtk2u_qa2.6.
so.0
(0x4009d000)
libwx_gtk2u_html2.6.
so.0 => /home/nop/wxgtk/lib/libwx_gtk2u_html2.6.
so.0
(0x400bc000)
libwx_gtk2u_adv2.6.
so.0 => /home/nop/wxgtk/lib/libwx_gtk2u_adv2.6.
so.0
(0x4014e000)
libwx_gtk2u_core2.6.
so.0 => /home/nop/wxgtk/lib/libwx_gtk2u_core2.6.
so.0
(0x401f3000)
libwx_baseu_xml2.6.
so.0 => /home/nop/wxgtk/lib/libwx_baseu_xml2.6.
so.0
(0x40560000)
libwx_baseu_net2.6.
so.0 => /home/nop/wxgtk/lib/libwx_baseu_net2.6.
so.0
(0x40569000)
libwx_baseu2.6.
so.0 => /home/nop/wxgtk/lib/libwx_baseu2.6.
so.0 (0x40597000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40734000)
libm.so.6 => /lib/tls/libm.so.6 (0x407ee000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40810000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x40819000)
libc.so.6 => /lib/tls/libc.so.6 (0x40828000)
libz.so.1 => /usr/lib/libz.so.1 (0x4095e000)
libdl.so.2 => /lib/tls/libdl.so.2 (0x40970000)
libgtkx112.0.
so.0 => /usr/lib/libgtkx112.0.
so.0 (0x40973000)
libgdkx112.0.
so.0 => /usr/lib/libgdkx112.0.
so.0 (0x40c51000)
libatk1.0.
so.0 => /usr/lib/libatk1.0.
so.0 (0x40cd0000)
libgdk_pixbuf2.0.
so.0 => /usr/lib/libgdk_pixbuf2.0.
so.0 (0x40cee000)
libpangoxft1.0.
so.0 => /usr/lib/libpangoxft1.0.
so.0 (0x40d05000)
libpangox1.0.
so.0 => /usr/lib/libpangox1.0.
so.0 (0x40d0c000)
libpango1.0.
so.0 => /usr/lib/libpango1.0.
so.0 (0x40d17000)
libgobject2.0.
so.0 => /usr/lib/libgobject2.0.
so.0 (0x40d50000)
libgmodule2.0.
so.0 => /usr/lib/libgmodule2.0.
so.0 (0x40d84000)
libgthread2.0.
so.0 => /usr/lib/libgthread2.0.
so.0 (0x40d88000)
libglib2.0.
so.0 => /usr/lib/libglib2.0.
so.0 (0x40d8e000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0x40e0e000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x40e33000)
libtiff.so.4 => /usr/lib/libtiff.so.4 (0x40e51000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0x40ea2000)
/lib/ldlinux.
so.2 => /lib/ldlinux.
so.2 (0x40000000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40ec2000)
libXrandr.so.2 => /usr/X11R6/lib/libXrandr.so.2 (0x40f89000)
libXi.so.6 => /usr/X11R6/lib/libXi.so.6 (0x40f8d000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40f95000)
libXft.so.2 => /usr/lib/libXft.so.2 (0x40fa4000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x40fb7000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x41024000)
libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0x41053000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0x4105c000)
libpangoft21.0.
so.0 => /usr/lib/libpangoft21.0.
so.0 (0x41065000)

Результат после предыдущей команды может быть различными для каждого компьютера. При распространении приложения в виде двоичного кода, для выполнения задач для системы есть все необходимые библиотеки.

2.2.5.2 Требования к библиотекам в Windows.
Чтобы посмотреть, какие вызываются библиотеки для программы hello.exe, автор использовал программу Dependency Walker, которую можно загрузить на http://www.dependencywalker.com/.

2.3 Привет мир пример 2
Программа «Привет мир» будет содержать следующие элементы:
- Главное окно, имеющее название Hello World!
- Пользователи смогут нажать на кнопку «Закрыть» на заголовке окна для выхода из приложения.
Второй вариант приложения «Привет мир» это вариант, когда разработчик создаёт отдельно заголовочный и файл реализации. Так записывать исходный код рекомендуется для использования при разработке больших приложений.
2.3.1 Структура каталогов исходного кода:

hello2/
build/
gtk/
hello
msw/
hello.exe
src/
app.h
app.cpp
frame.h
frame.cpp
makefile.gtk
makefile.vc

2.3.2 Результат
После выполнения build/gtk/hello:
- Будет отображаться пустой фрейм
- Фрейм будет отображать текст «Hello World!» расположенный в строке заголовка
- Когда кнопка на заголовке окна нажата, то окно приложения будет изменять размер или произойдёт выход из программы

2.3.3 Исходный код
В данном примере, по сравнению с примером 1 «Привет мир», файл
hello.cpp заменяется четырьмя файлами:
- App.h: заголовок класса App
- App.cpp: реализация класса App
- Frame.h: заголовок класса фрейма
- Frame.cpp: реализация класса Frame
Для получения исходного кода, см. также разъяснения о примере 1 «Привет мир».

2.3.3.1 SRC / app.h
Вот исходный код SRC / app.h:

#ifndef _APP_H_
#define _APP_H
class App : public wxApp
{
public:
virtual bool OnInit ();
};
#endif // _APP_H_

2.3.3.2 src/app.cpp

#include "wx/wx.h"
#include "frame.h"
#include "app.h"
DECLARE_APP (App)
IMPLEMENT_APP (App)
bool App :: OnInit ()
{
Frame * frame = new Frame (_("Hello World!"));
frame ->Show (true);
return true;
}

Расшифровка кода:
- Объявить о классе файлов, хранящихся в объявлении app.h. В файле app.cpp, необходимо вызвать app.h.
- Что бы, что-то сделать в окне (класс окна), разработчик должен
подключить файл frame.h

2.3.3.3 SRC / frame.h

#ifndef _FRAME_H_
#define _FRAME_H_
class Frame: public wxFrame
{
public:
Frame (const wxString& title);
};
#endif // _FRAME_H_
2.3.3.4 SRC / frame.cpp
#include "wx/wx.h"
#include "frame.h"
Frame :: Frame (const wxString& title) : wxFrame (NULL, wxID_ANY, title)
{
}

Расшифровка кода:
- Декларация класса фрейма в файле frame.h. Необходимо подключить frame.h в файле frame.cpp.

2.3.4 Компиляция
2.3.4.1 Компиляция на Linux (GTK +)
Для компиляции в Linux используется Makefile. В этом случае имя файла makefilenya является makefile.gtk. Вот содержание makefile.gtk:

# simple makefile for simple wx project
# (c) Nop, 5 Feb 2006
# variables
WXCONFIG = wxconfig
WXPLAT = gtk
PROGRAM = hello
OBJECTS = src/app.o src/frame.o
# system
CXX = $(shell $(WXCONFIG) cxx)
# implementation
.SUFFIXES: .o .cpp
.cpp.o :
$(CXX) c
`$(WXCONFIG) cxxflags`
o
$@ $<
all: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(CXX) o
$(PROGRAM) $(OBJECTS) `$(WXCONFIG) libs`
mkdir p
build/$(WXPLAT)
mv $(PROGRAM) build/$(WXPLAT)
rm f
src/*.o
clean:
rm f
src/*.o build/$(WXPLAT)/$(PROGRAM)

Описание Makefile:
- См. также обсуждение Makefile в примере 1 «Привет мир»
- Различия в Makefile обсуждались на примере 1 «Привет мир»,
добавить файл объекта. Добавить необходимо явно. В данном примере файлов объекта два: app.o (от app.h и app.cpp) и frame.o (от frame.h и frame.cpp).
Для сборки делают следующее:

$ make f
makefile.gtk
g++ c
`wxconfig
cxxflags`
o
src/app.o src/app.cpp
g++ c
`wxconfig
cxxflags`
o
src/frame.o src/frame.cpp
g++ o
hello src/app.o src/frame.o `wxconfig
libs`
mkdir p
build/gtk
mv hello build/gtk
rm f
src/*.o

После компиляции, исполняемый файл с именем Hello разместится в каталоге build/gtk/.
Разница в процессе компиляции от примера 1 «Привет мир» будет в информации о том, что файл составлен.
Если вы хотите исключить файлы и произвести очистку, оставьте чистый аргумент. Например:

$ make f
makefile.gtk clean
rm f
src/*.o build/gtk/hello

После выполнения все следы компиляции будут удалены.

2.3.4.2 Компиляция на Windows
Для компиляции в этой книге использовался Makefile. В этом случае имя makefilenya файл makefile.vc. Содержимое файлов makefile.vc, не указанных в подпункте главы смотреть в предыдущем примере, или посмотреть на CDROM сопровождающем эту книгу.

2.3.5 Необходимые библиотеки.
Нет существенной разницы между требуемыми библиотеками в примере 1 «Привет мир» и примере 2 «Привет мир». Ознакомьтесь с разъяснением о необходимых библиотеках на примере 1 «Привет мир».

2.4 Привет мир пример 3
Программа «Привет мир» будет содержать следующие элементы:
- Главное окно, которые будут иметь название Hello World!
- Пользователи могут нажать на кнопку «Закрыть» на заголовке окна для выхода из приложения
- Будет добавлена кнопка «Здравствуйте» на фрейме. Кнопка
только одна, размер которой не изменяется. При нажатии на кнопку действие пока будет отсутствовать. Цель примера 3 «Привет мир» - научится добавлять объекты на фрейме.
Как уже упоминалось в предыдущем разделе, мы будем записывать код в отдельные файлы заголовка и реализации.

2.4.1 Структура каталогов исходного кода:

hello3/
build/
gtk/
hello
msw/
hello.exe
src/
app.h
app.cpp
frame.h
frame.cpp
makefile.gtk
makefile.vc

2.4.2 Результат
После выполнения build/gtk/hello:
- Будет отображаться пустой фрейм
- Фрейм будет отображать текст «Hello World!» расположенный в строке заголовка
- Когда нажата кнопка на заголовке окна, то окно приложения будет изменять размер или произойдёт выход из программы
- Появится кнопка во фрейме «Здравствуйте». Кнопка не делает
какие-либо действий при нажатии.

2.4.3 Исходный код
Исходный код будет включать следующие четыре файла:
- App.h: заголовок класса App
- App.cpp: реализация класса App
- Frame.h: заголовок класса фрейма
- Frame.cpp: реализация класса Frame
Для получения исходного кода, см. также разъяснения о примере 1 «Привет мир».

2.4.3.1 SRC / app.h
Вот исходный код SRC / app.h:

#ifndef _APP_H_
#define _APP_H
class App : public wxApp
{
public:
virtual bool OnInit ();
};
#endif // _APP_H_

2.4.3.2 src/app.cpp

#include "wx/wx.h"
#include "frame.h"
#include "app.h"
DECLARE_APP (App)
IMPLEMENT_APP (App)
bool App::OnInit ()
{
Frame * frame = new Frame (_("Hello World!"));
frame ->Show (true);
return true;
}

Расшифровка кода:
- Объявление о классе файлов, хранящихся в App app.h. В файле app.cpp, разработчик подключает необходимый файл app.h.
- Чтобы что-то сделать во фрейме (класс фрейма), разработчик должен подключить файл frame.h

2.4.3.3 SRC / frame.h

#ifndef _FRAME_H_
#define _FRAME_H_
class Frame: public wxFrame
{
public:
Frame (const wxString& title);
};
#endif // _FRAME_H_

2.4.3.4 src/frame.cpp

#include "wx/wx.h"
#include "wx/button.h"
#include "frame.h"

Frame :: Frame (const wxString& title) : wxFrame (NULL, wxID_ANY, title)
{
wxButton * button1 = new wxButton (this, wxID_ANY, _("hello"));
}

Расшифровка кода:
- Декларацию класса фрейма в файле frame.h. Разработчики должны подключить файл frame.h.
- Создать wxButton. Используется дополнительный заголовок, а именно:
WX / button.h.
- На момент создания wxButton, разработчик предоставляет, по крайней мере, три параметра, а именно:
- Родителя. В этом случае родитель wxButton - фрейм. Путь создаётся автоматически, wxButton создаётся во фрейме.
- Код кнопки. Код кнопки - программа обработки. На данный момент, пока кнопка не используется (например, не реагирует на нажатие кнопки мыши), объявление ID необязательно.
WxID_ANY diassign и wxWidgets автоматически определяет ID как отрицательное число. WxWidgets представляет некоторый код, который может быть использован. Подробнее об ID можно прочитать в конце этой главы.
- Название кнопки.

2.4.4 Компиляция

2.4.4.1 Компиляция на Linux (GTK +)
Для компиляции в Linux используется Makefile. В этом случае имя файла makefilenya является makefile.gtk. Вот содержание makefile.gtk:

# simple makefile for simple wx project
# (c) Nop, 5 Feb 2006
# variables
WXCONFIG = wxconfig
WXPLAT = gtk
PROGRAM = hello
OBJECTS = src/app.o src/frame.o
# system
CXX = $(shell $(WXCONFIG) cxx)
# implementation
.SUFFIXES: .o .cpp
.cpp.o :
$(CXX) c
`$(WXCONFIG) cxxflags`
o
$@ $<
all: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(CXX) o
$(PROGRAM) $(OBJECTS) `$(WXCONFIG) libs`
mkdir p
build/$(WXPLAT)
mv $(PROGRAM) build/$(WXPLAT)
rm f
src/*.o
clean:
rm f
src/*.o build/$(WXPLAT)/$(PROGRAM)

Описание Makefile:
- См. также обсуждение Makefile в примере 2 «Привет мир»
Для сборки делают следующее:

$ make f
makefile.gtk
g++ c
`wxconfig
cxxflags`
o
src/app.o src/app.cpp
g++ c
`wxconfig
cxxflags`
o
src/frame.o src/frame.cpp
g++ o
hello src/app.o src/frame.o `wxconfig
libs`
mkdir p
build/gtk
mv hello build/gtk
rm f
src/*.o

Если вы хотите исключить файлы и произвести очистку, оставьте чистый аргумент.
Например:

$ make f
makefile.gtk clean
rm f
src/*.o build/gtk/hello

После выполнения все следы компиляции будут удалены.

2.4.4.2 Компиляция в Windows
Для компиляция в этой книге используется Makefile. В этом случае имя makefilenya файл makefile.vc. Содержимое файлов makefile.vc, не указанных в подпункте главы смотреть в предыдущем примере, или посмотреть на CDROM сопровождающем эту книгу.

2.4.5 Необходимые библиотеки
Нет никакой разницы между используемыми библиотеками примеров «Привет мир» пример 3, «Привет мир» пример 2, «Привет мир» пример 1. Пожалуйста, обратитесь к пояснению об используемых библиотеках примера 1 «Привет мир».

2,5 Привет мир пример 4
Программа «Привет мир» будет содержать следующие элементы:
- Главное окно, которое будет иметь название Hello World!
- Пользователи могут нажать на кнопку «Закрыть» на заголовке окна для выхода из приложения
- Будет добавлено меню "Файл". Меню "Файл", содержащий подпункт
меню, «Quit» (с быстрыми клавишами CTRL-Q; и подсказкой «Quit application»). При нажатии на эту кнопку произойдёт закрытие меню.
- Будет создана строка состояния. Будет выведено на экран сообщение "Welcome to Hello World!". Также, если указатель мыши навести на пункт меню File | Quit, строка состояния будет отображать подсказку из меню File | Quit - "Quit application".

Как уже упоминалось в предыдущем разделе, мы будем записывать код в отдельные файлы заголовка и реализации.

2.5.1 Структура каталогов исходного кода:

hello4/
build/
gtk/
hello
msw/
hello.exe
src/
app.h
app.cpp
frame.h
frame.cpp
makefile.gtk
makefile.vc

2.5.2 Результат
После выполнения build/gtk/hello:
- Будет отображаться пустой фрейм
- Фрейм будет отображать текст Hello World! расположенный в строке заголовка
- Когда нажата кнопка на заголовке окна, то окно приложения будет изменять размер или произойдёт выход из программы
- Отобразится фрейм состояния
- Создастся меню "File" во фрейме. В файле меню появится подпункт меню «Quit».

2.5.3 Исходный код
Исходный код будет включать следующие четыре файла:
- App.h: объявление класса заголовка
- App.cpp: реализация объявленного класса Арр
- Frame.h: заголовок класса фрейма
- Frame.cpp: реализация класса Frame
Для получения исходного кода, см. также разъяснения о примере 1 «Привет мир».

2.5.3.1 SRC / app.h
Вот исходный код SRC / app.h:

#ifndef _APP_H_
#define _APP_H
class App : public wxApp
{
public:
virtual bool OnInit ();
};
#endif // _APP_H_

2.5.3.2 src/app.cpp
#include "wx/wx.h"
#include "frame.h"
#include "app.h"
DECLARE_APP (App)
IMPLEMENT_APP (App)
bool App :: OnInit ()
{
Frame * frame = new Frame (_("Hello World!"));
frame ->Show (true);
return true;
}

Расшифровка кода:
- Объявление о классе файлов, хранящихся в файле app.h. В файле app.cpp, разработчик подключает необходимый файл app.h.
- Чтобы что-то сделать во фрейме (класс фрейма), разработчик должен подключить файл frame.h

2.5.3.3 SRC / frame.h

#ifndef _FRAME_H_
#define _FRAME_H_
class Frame: public wxFrame
{
public:
Frame (const wxString& title);
};
#endif // _FRAME_H_

2.5.3.4 src/frame.cpp

#include "wx/wx.h"
#include "wx/menu.h"
#include "frame.h"
Frame :: Frame (const wxString& title) : wxFrame (NULL, wxID_ANY, title)
{
CreateStatusBar ();
SetStatusText (_("Welcome to Hello World!"), 0);
wxMenu * fileMenu = new wxMenu;
fileMenu ->Append (wxID_ANY, _("&Quit \tCTRLQ"), _("Quit application"));
wxMenuBar * menuBar = new wxMenuBar;
menuBar ->Append (fileMenu, _("&File"));
SetMenuBar (menuBar);
}

Расшифровка кода:
- Декларация класса фрейма в файл frame.h. Разработчики должны подключать файл frame.h.
- Используется WxMenu и wxMenuBar. Подключаем дополнительный заголовок WX / menu.h.
- Фрейм может содержать меню, панели инструментов и строку состояния. Фрейм также может содержать или нет рамку окна диалога.
Простой пример «Привет мир» демонстрирует 3 фрейма, которые содержат ещё одно окно, то есть wxButton.
- Отображение строки состояния может быть сделано в ответ на вызов CreateStatusBar().
Текст строки состояния может быть сделан в ответ на вызов SetStatusText():

virtual void SetStatusText(const wxString& text, int number = 0)
SetStatusText ( _( "Welcome to Hello World!"), 0);

Первым параметром является текст, который вы хотите отобразить. Вторым параметром является номер состояния. Состояния можно разделить на части.
У строки состояния в примере 4 «Привет мир», существует только одна часть, которая выводится.
- Меню можно сделать так:
- Создать первый пункт меню (wxMenu). В этом случае, в меню
создан первый пункт «File»:

wxMenu * fileMenu = = new wxMenu;

- После того как меню создано, разработчики будут добавлять в нём подпункты меню. В этом примере, добавлен подпункт «Закройте меню».

ДОПОЛНЕНИЕ
Append() в этом примере требует трех параметров:
- Идентификационный номер. На данный момент, поскольку он не был использован, нужно использовать wxID_ANY.
- Заголовок меню. Используйте знак & для определения клавиши быстрого вызова, которая будет подчёркиваться сразу после этого значка. Также необходим разделитель \t между названием команды и определяемой клавишей. Наконец, также устанавливается Help String, которая будет автоматически отображается в строке состояния (если таковая имеется).

wxMenuItem* Append(int id, const wxString& item, const wxString& helpString = "",
wxItemKind kind = wxITEM_NORMAL)
fileMenu ->Append (wxID_ANY, _( "&Quit \tCTRLQ"), _("Quit application"));

- После создания меню одной конструкции, разработчики будут создавать wxMenuBar, который будет учитывать различные конструкции меню которые являются сингулярной.

wxMenuBar * menuBar = new wxMenuBar;

- После wxMenuBar, разработчик должен добавить в меню «Файл» пункты которые были сделаны раньше

bool Append(wxMenu *menu, const wxString& title)
menuBar -> Append (fileMenu, _("&File"));

- Теперь разработчик может установить меню в Frame:

SetMenuBar (menuBar);

2.5.4 Компиляция
2.5.4.1 Компиляция на Linux (GTK +)
Для компиляции в Linux используется Makefile. В этом случае имя файла makefilenya является makefile.gtk. Вот содержание makefile.gtk:

# simple makefile for simple wx project
# (c) Nop, 5 Feb 2006
# variables
WXCONFIG = wxconfig
WXPLAT = gtk
PROGRAM = hello
OBJECTS = src/app.o src/frame.o
# system
CXX = $(shell $(WXCONFIG) cxx)
# implementation
.SUFFIXES: .o .cpp
.cpp.o :
$(CXX) c
`$(WXCONFIG) cxxflags`
o
$@ $<
all: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(CXX) o
$(PROGRAM) $(OBJECTS) `$(WXCONFIG) libs`
mkdir p
build/$(WXPLAT)
mv $(PROGRAM) build/$(WXPLAT)
rm f
src/*.o
clean:
rm f
src/*.o build/$(WXPLAT)/$(PROGRAM)

Описание Makefile :
- См. также обсуждение Makefile в примере 2 «Привет мир»
Для сборки делают следующее:

$ make f
makefile.gtk
g++ c
`wxconfig
cxxflags`
o
src/app.o src/app.cpp
g++ c
`wxconfig
cxxflags`
o
src/frame.o src/frame.cpp
g++ o
hello src/app.o src/frame.o `wxconfig
libs`
mkdir p
build/gtk
mv hello build/gtk
rm f
src/*.o

Если вы хотите исключить файлы и произвести очистку, оставьте чистый аргумент.
Например:

$ make f
makefile.gtk clean
rm f
src/*.o build/gtk/hello

После выполнения все следы компиляции будут удалены.

2.5.4.2 Компиляция на Windows
При компиляции в этой книге используется Makefile. В этом случае имя makefilenya файл makefile.vc. Содержимое файлов makefile.vc, не указанных в подпункте главы смотреть в предыдущем примере, или посмотреть на CDROM сопровождающем эту книгу.

2.5.5 Необходимые библиотеки
Различия между используемыми библиотеками пример 4 «Привет мир»,
пример 1 «Привет мир», пример 2 «Привет мир» и пример 3 «Привет мир».
Ознакомьтесь с разъяснением о необходимых библиотеках примера 1 «Привет мир».

2.6 ID окна представляемые wxWidgets
ID окна это целое число и используется, чтобы отметить каждое из уникальных окон в определенном контексте. Это необходимо, особенно при работе с событиями.
В некоторых предыдущих примерах, использовался wxID_ANY, в тех случаях когда разработчик не обратил внимание на уникальный идентификатор, если нет необходимости обрабатывать событие.
Когда, учитывая wxID_ANY, wxWidgets будет генерировать ряд отрицательных идентификаторов автоматически.
Кроме того, wxID_ANY, wxWidgets также предусматривает некоторые стандартные идентификаторы, которые могут быть
использованы. Это положительные ID. Пользователи могут определять свои собственные ID, которые должны быть не в конфликте с ID, которые были стандартом при условии, что всегда должены быть положительным целым числом.
Разработчикам рекомендуется использовать идентификатор, который вы представили, насколько это возможно.
В некоторых системах, с помощью ID, можно составить график соответствия (например wxID_OK связанно с ОК). Компоненты, такие, как wxTextCtrl можно также пункт или кнопка меню ID, как это предусмотрено wxID_COPY, wxID_PASTE и wxID_UNDO.

Вот стандартные ID:

Код Значение Описание
wxID_ANY -1
wxID_LOWEST 4999 наименьшее значение
wxID_OPEN 5000 открыть файл
wxID_CLOSE 5001 закрыть окно
wxID_NEW 5002 новое окно файла или документа
wxID_SAVE 5003 сохранить файл
wxID_SAVEAS 5004 сохранить файл как
wxID_REVERT 5005 вернуться
wxID_EXIT 5006 выход из приложения
wxID_UNDO 5007 отменить
wxID_REDO 5008 повторить
wxID_HELP 5009 помощь
wxID_PRINT 5010 печать
wxID_PRINT_SETUP 5011 настройка печати
wxID_PREVIEW 5012 версия для печати
wxID_ABOUT 5013 диалог о
wxID_HELP_CONTENTS 5014 помощь по содержанию
wxID_HELP_COMMANDS 5015 помощь по применямым командам
wxID_HELP_PROCEDURES 5016 помощь по процедурам
wxID_HELP_CONTEXT 5017 помощь по контексту
wxID_CLOSE_ALL 5018 закрыть всё
wxID_PREFERENCES 5019 предпочтительно
wxID_CUT 5030 вырезать
wxID_COPY 5031 копировать
wxID_PASTE 5032 вставить
wxID_CLEAR 5033 очистить
wxID_FIND 5034 найти
wxID_DUPLICATE 5035 дублировать
wxID_SELECTALL 5036 выделить всё
wxID_DELETE 5037 удалить
wxID_REPLACE 5038 заменить
wxID_REPLACE_ALL 5039 заменить всё
wxID_PROPERTIES 5040 свойства
wxID_VIEW_DETAILS 5041 детальный просмотр
wxID_VIEW_LARGEICONS 5042 просмотр больших иконок
wxID_VIEW_SMALLICONS 5043 просмотр маленьких иконок
wxID_VIEW_LIST 5044 просмотр в виде списка
wxID_VIEW_SORTDATE 5045 просмотр с сортировкой по времени
wxID_VIEW_SORTNAME 5046 просмотр с сортировкой по названию
wxID_VIEW_SORTSIZE 5047 просмотр с сортировкой по размеру
wxID_VIEW_SORTTYPE 5048 просмотр с сортировкой по типу
wxID_FILE1 5050 последние файлы
wxID_FILE2 5051 последние файлы
wxID_FILE3 5052 последние файлы
wxID_FILE4 5053 последние файлы
wxID_FILE5 5054 последние файлы
wxID_FILE6 5055 последние файлы
wxID_FILE7 5056 последние файлы
wxID_FILE8 5057 последние файлы
wxID_FILE9 5058 последние файлы
wxID_OK 5100 ок
wxID_CANCEL 5101 отменить
wxID_APPLY 5102 применить
wxID_YES 5103 да
wxID_NO 5104 нет
wxID_STATIC 5105 идентификатор для статического текста или растровый
wxID_FORWARD 5106 навигация вперед
wxID_BACKWARD 5107 навигация назад
wxID_DEFAULT 5108 значение по умолчанию
wxID_MORE 5109 больше
wxID_SETUP 5110 диалог настройки
wxID_RESET 5111 сброс
wxID_CONTEXT_HELP 5112 контекстно-зависимая справка
wxID_YESTOALL 5113 все да
wxID_NOTOALL 5114 все нет
wxID_ABORT 5115 прерывания
wxID_RETRY 5116 повторить
wxID_IGNORE 5117 игнорировать
wxID_ADD 5118 добавить
wxID_REMOVE 5119 удалить
wxID_UP 5120 вверх
wxID_DOWN 5121 вниз
wxID_HOME 5122 главная
wxID_REFRESH 5123 обновить
wxID_STOP 5124 стоп
wxID_INDEX 5125 подсветить индекс
wxID_BOLD 5126 жирный
wxID_ITALIC 5127 курсив
wxID_JUSTIFY_CENTER 5128 по центру
wxID_JUSTIFY_FILL 5129 формат
wxID_JUSTIFY_RIGHT 5130 справа
wxID_JUSTIFY_LEFT 5131 слева
wxID_UNDERLINE 5132 подчёркнутый
wxID_INDENT 5133 тире
wxID_UNINDENT 5134 отступ
wxID_ZOOM_100 5135 масштаб 100%
wxID_ZOOM_FIT 5136 размер страницы
wxID_ZOOM_IN 5137 увеличить
wxID_ZOOM_OUT 5138 уменьшить
wxID_UNDELETE 5139 восстановить
wxID_REVERT_TO_SAVED 5140 восстановить сохранённое состояние
wxID_SYSTEM_MENU 5200 система меню
wxID_CLOSE_FRAME 5201 закрыть фрейм
wxID_MOVE_FRAME 5202 переместить фрейм
wxID_RESIZE_FRAME 5203 изменение размеров фрейма
wxID_MAXIMIZE_FRAME 5204 максимальный размер фрейма
wxID_ICONIZE_FRAME 5205 иконки фрейма
wxID_RESTORE_FRAME 5206 восстановить фрейм
wxID_FILEDLGG 5900 диалог
wxID_HIGHEST 5999 наивысший

2.7 Установка своих ID окна
Если ID окна предусмотренного в стандарте не соответствует wxWidgets, разработчик всегда может создать свой собственный идентификатор. Существуют следующие правила
Рекомендуемые:
- Используйте положительное целое
- Использование Enum вместо # определения или Const статические INT
- Определить глобально, а не в классе
- Использование заглавных букв (всех) для идентификатора
- Используйте для подчеркивания отдельных слов
- Используйте большее значение имеет тот же wxID_HIGHEST + N, где wxID_HIGHEST + N является значением самого меньшего ID, который вы хотите использовать.
Например:

Enum
(
ID_WORDWRAP = wxID_HIGHEST + 100,
ID_USE_RICH_FORMAT
);

Похожие записи

Новая версия wxDesigner будет поддерживать wxWidge... Самая последняя версия wxDesigner - GUI Builder для wxWidgets и ее популярные сборки Python и Perl - теперь поддерживается для предстоящей версии wxWi...
wxWidgets 2.8.6 released 1 октября 2007 года вышел очередной релиз wxWidgets. Информация с официального сайта библиотеки http://www.wxwidgets.org/...
Как расположить свою панель инструментов справа от... Возможно при разработке программ кто - то столкнётся с проблемой расположения нескольких toolbar - ов. Как правило последующие панели инструментов рас...
В первые дни нового года…... После десяти дней нового года решил наконец-то выйти из дому :) Не то, что б я рьяно отмечал праздники. Просто погода не способствовала долгим прогулк...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Страницы

Метки

Рубрики

Свежие записи

Свежие комментарии

Август 2017
Пн Вт Ср Чт Пт Сб Вс
« Апр    
 123456
78910111213
14151617181920
21222324252627
28293031  

Архивы