воскресенье, 26 сентября 2010 г.

Простои проект C++ с использованием wxWidgets

Понадобится кроссплатформенная утилита bakefile для поддержки генерации make-файлов и файлов-проектов для разных платформ и сред программирования. Для её использования понадобится python. Будем считать, что с установкой wxWidgets справились все. У меня, например, для этого создан командный файл build_cl.cmd в каталоге %WXWIN%\build\msw. %WXWIN% - переменная среды, содержащая путь к wxWidgets (не должен содержать пробелов). Использую, компилятор C++ идущий вместе с Microsoft Visual C++ 2005 Express Edition, установил его без IDE и MSDN, ещё установлен MS PSDK для работы.

call vcvars32
nmake -f makefile.vc MONOLITHIC=0 SHARED=0 UNICODE=1 BUILD=release
pause

В директории проекта создадим поддиректорию build, в ней создадим файл app.bkl, следующего содержания:


1 <?xml version="1.0" ?>
2 <!-- $Id$ -->
3
4 <makefile>
5
6 <!-- Путь к файлу wx.bkl, хотя можно их таскать в
۠отдельной директории с именем presets в
۠директории проекта -->

7 <include file="C:/wxWidgets-2.9.1/build/bakefiles/wxpresets/presets/wx.bkl" />
8
9 <!-- Определяем переменную BUILDDIR в стиле wxWidgets -->
10 <set-wxlike-builddir> </set-wxlike-builddir>
11
12 <exe id="app" template="wxgui">
13
14 <debug-info>off</debug-info>
15 <runtime-libs>dynamic</runtime-libs>
16
17 <!-- Здесь всякие опции для линковщика -->
18 <ldflags cond="FORMAT=='msvc'">/OPT:REF</ldflags>
19 <ldflags cond="FORMAT=='msvc'">/OPT:ICF</ldflags>
20 <ldflags cond="FORMAT=='msvc6prj'">/entry:"wWinMainCRTStartup"</ldflags>
21
22 <!-- Исходники -->
23 <sources>$(fileList('../src/*.cpp'))</sources>
24 <headers>$(fileList('../src/*.h'))</headers>
25 <win32-res>$(fileList('../src/*.rc'))</win32-res>
26 <symbian-res>$(fileList('../src/*.rss'))</symbian-res>
27
28 <!-- Здесь используемые в проекте библиотеки
۠wxWidgets -->

29 <wx-lib>core</wx-lib>
30 <wx-lib>base</wx-lib>
31 </exe>
32
33 </makefile>



Как видим, используется XML-формат. Чтобы bakefile не ругался на строки, где содержатся кириллические символы, файл должен быть в кодировке UTF-8. Имена тегов должны быть в нижнем регистре.

Для генерации makefile.vc использую командный файл, следующего содержания:

bakefile -f msvc app.bkl
call vcvars32
pause

Для сборки проекта использую командный файл, следующего содержания:

nmake /f makefile.vc WX_MONOLITHIC=0 WX_SHARED=0 WX_UNICODE=1 WX_DEBUG=0
pause


Исходники, файлы ресурсов и заголовочные файлы находятся в папке src.
В простейшем случае, там расположены следующие файлы:
app.h
app.cpp
frame.h
frame.cpp
minimal.rc
mondrian.ico
mondrian.xpm

Содержание файла app.h :

1 #include <wx/app.h>
2 #if !defined(__WXMSW__) && !defined(__WXPM__)
3 #include "mondrian.xpm"
4 #endif
5
6 #include "frame.h"
7
8 class App : public wxApp
9 {
10 public:
11 virtual bool OnInit();
12 };


Содержание файла app.cpp :

1 /// app.cpp
2 #include "app.h"
3
4 bool App::OnInit()
5 {
6 if ( !wxApp::OnInit() )
7 return false;
8
9 Frame *frame = new Frame(_T("Только фрейм"));
10 frame->Show(true);
11 return true;
12 }
13
14 IMPLEMENT_APP(App)



Содержание файла frame.h :

1 #include <wx/frame.h>
2 class Frame : public wxFrame
3 {
4 public:
5 Frame(const wxString& title);
6 private:
7 DECLARE_EVENT_TABLE()
8 };
9
10 //Идентификаторы элементов управления, которые должны реагировать на события
11 enum
12 {
13
14 };
15
16



Содержание файла frame.cpp :

1 #include "frame.h"
2
3 //Таблица событий для связи методов и идентификаторов с определенным типом
» сообщения

4 BEGIN_EVENT_TABLE(Frame, wxFrame)
5
6 END_EVENT_TABLE()
7
8 // Конструктор
9 Frame::Frame(const wxString& title)
10 : wxFrame(NULL, wxID_ANY, title)
11 {
12 SetIcon(wxICON(mondrian_xpm));
13 }
14



Содержание файла ресурсов minimal.rc :

mondrian_xpm ICON "mondrian.ico"
#include "wx/msw/wx.rc"

понедельник, 13 сентября 2010 г.

Неестественное присвоение в TextBox на VB6

Много строковое значение строковой переменной в Visual Basic 6.0 при присвоении его TextBox, не приводит к соответствующему отображению, простой установки свойства MultiLine в значение True, оказалось недостаточным. А вот такой способ работает, создавая дополнительную строку.

TexBox1.MultiLine=True
TexBox1.SelStart=Len(TextBox1.Text)
TexBox1.SelText = vbNewLine & strNewLine

Все это кажется странным.