Дамп суматошных мыслей, чтобы что-нибудь написать

March 19th, 2009 Begemot

Давно не ничего писал,  нет времени – месяц работал, потом 2 недели разгребал завалы дома, сейчас опять работаю. Так занят что и программировать некогда:)

На работе пишу гуи к программе на wxWidgets, собирал программу на линуксе – забавно, собирается и запускается, правда часто падает:) Видел живой mac-mini и XCode, программировал под него, и даже исправил часть багов.

Кое-чему научился, теперь я знаю что оконные обьекты нельзя удалять используя wxDELETE(), надо обязательно делать destroy(), кто бы мог подумать?:) Еще, я теперь почти как истинный хакер которых показывают в фильмах, уверено набираю cd xxx/xxx configure make. Узнал для чего нужен cmake, жаль только мне дома, как одиночке, это практически бесполезно.

Самое главное – я видел программу которая, запускается из одних сорцов на винде, маке и  линуксе! И даже писал ее. Теперь я настоящий кроссплатформенный программист:)

P.S. ну и добавлю чуточку полезного  – The latest stable release in the 2.8  – wxWidgets 2.8.10 Released, позавчера.


Глава 9. Написание собственных диалогов

March 10th, 2009 Begemot

Солдат спит – служба идет:) Алексей перевел еще одну главу – Глава 9. Написание собственных диалогов, а я традиционно делаю зеркало для скачки pdf

Posted in Учебники | Tags:
Comments Off on Глава 9. Написание собственных диалогов


Перевод Главы 6 “Обработка данных с устройств ввода”

March 6th, 2009 Begemot

Радостно, что круг переводчиков постепенно расширяется и мы все вместе неумолимо двигаем перевод книги по программированию на wxWidgets к логическому завершению:). Переведена еще одна глава – “Обработка данных с устройств ввода“, переведена трудами Грубникова Александра, отредактированна и оформленна стараниями всего того же Тюрюмова Алексея, бессменного лидера нашего мощного движения.

Перевод доступен как в виде pdf файла, так прямо тут, под катом.

Перевод Главы 6: Обработка данных с устройств ввода

Read the rest of this entry »

Posted in Учебники | Tags:
Comments Off on Перевод Главы 6 “Обработка данных с устройств ввода”


Глава 4.1 Окна, основы : Строение окна

February 23rd, 2009 Begemot

Первая часть четвертой главы книги Cross-Platform GUI Programming with wxWidgets в переводе на русский, на этот раз благодарим Лизунова Андрея за перевод.

 

Глава 4. Окна, основы

В этой главе, до того как описывать наиболее общие классы окон, используемых в приложении, мы познакомимся с основными элементами.. Эти элементы, почти наверняка, знакомы Вам из предыдущего опыта программирования или из приложений которыми вы пользовались. Несмотря на различия между системами, доступные элементы управления удивительно похожи по функциональности, wxWidgets управляет той частью, которая является общей. Оставшаяся часть обычно управляется, используя опциональные, платформо-зависимые, стили.

Read the rest of this entry »


wxWidgets vs QT

January 31st, 2009 Begemot

Ну вот прошло две недели после новости про qt lgpl, страсти вокруг открывающихся перспектив кажется немного поутихли. Я тоже вроде немого остыл. Первое мысль была что делать – говорят Qt лучше начинать что ли ее осваивать – с одной стороны заманичиво, с другой стороны придется все начинать с нуля, а осваиваю я крайне медленно:) Тем не менее желание было, что называется загорелся. Даже скачал саму библиотеку, кучу книжек к ней, позаносил в закладки сайты…

Больше всего меня растроило и убедило думать о смене библиотеке,  то что даже люди которых я считал чуть ли не апологетами wxWidgets в рунете – в один голос сказали что QT все-таки продвинутее и надо переходить на нее:(

Но несмотря на все хвалебные диферамбы в адресс qt у нее есть пару минусов, первое что мне очень не нравится это не-нативность контролов – я сам сейчас пытаюсь привыкнуть к KVirc  и кривость поведения обычных едит-боксов уже не раз заставляла меня вспоминать разработчиков, их родственников по женской линии и кривость рук. Окончательно меня добил пост на rsdn

Я после того, как пришлось несколько лет назад портировать продукты на Mac от QT плююсь. И не потому, что либа плохая, как раз наоборот — программировать приятно и удобно. Потому ее и выбрал ( ага, на безрыбье-то  ) Но… Пользователи ее терпеть не могут. Точнее то, как при ее использовании выглядит продукт. А выглядит он нестандартно и работает тоже нестандартно. Мелочей подобных описанным выше навалом  ! В итоге mac-пользователи мягко говоря разочаровываются. И высказывают это свое разочарование на форумах в духе “Ну не знаю… может где-то оно и нормально работает, но вот на mac это дерьмо дерьмом и пользоваться нормально невозможно”. Ну нафиг мне такое счастье, я лучше GUI отдельно напишу, значительно дешевле выходит в итоге.

Кстати, почему-то широко распространено мнение, что Opera на QT написана. Так вот, нифига подобного! Точнее уже нифига подобного, они QT они отказались еще в 2003, бо как столкнулись с точно такими же проблемами.

Я уже было решил потренироватся на кошках, в смысле не проекте который не включает стандартное гуи, а как раз наоборот требует универсального и одинакового custom draw look. Но тут вылез второй большой минус (имхо) насколько я понял маленькие приложения и qt понятия диаметрально противоположные.  Еще одна цитата  с rdsdn

А>Есть некое приложение для конечного клиента, которое использует динамическую линковку с библиотеками Qt.
А>Сами библиотеки не маленькие, а вместе с приложением, прямо скажем, довольно большенькие…

Собирал qt 4.4.3 с выключенными rtti, exceptions, accessibility(интересно, кто нибудь использует эту красоту?), qt3support.

Резльтат по размеру —
hello world статически слинкованный пример с одним виджетом, — 6.02 Мб, зависимость только от системных библиотек windows.
Он же запакованный — 2.8 метра.

Почему-то не собирались примеры с веб китом… Постоянно показывались ошибки линковки на классы, экспортируемые из QtWebKit, хотя сам libQtWebKit.a собрался.

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


О сайзерах

January 23rd, 2009 Begemot

Сайзеры в wxWidgets / wxPython – подробно, доступно и главное понятно. Всем кто еще не понимает как пользоватся сайзерами – рекомендую. Хоть и для питона восновном, но можно смотреть на картинки.

 

И пользуясь случаем, у меня самого недавно с сайзерами трабла возникла –  может кто подскажет. Есть wxAUI приложение – меню, тулбрал, панель, на панели сайзер в котором все контролы. Проблема в том что при старте приложеня – размер окна меньше чем размер панели, то есть по какой-то причине не размер всего окна не подстраивается под размер элементов панели… В другой моей программе такая же архитектура окна, такой же порядок кода – все работает. Пробую лайер в диалог блоксе создать – таже самая фигня, в нем выбираю тест – окно правильно не считает размер.  Может кто сталкивался, может подсказать куда смотреть?


QT LGPL

January 14th, 2009 Begemot

Говорят QT скоро будет доступно под лицензией LGPL, а это значит ее можно будет свободно использовать для коммерческих продуктов.

Если это правда, то интересно:

1. что будет с wxWidgets (я qt не смотрел из-за цены, но говорят что оно лучше)

2. зачем это Нокии??

3. что дальше делать?:)
 

ссылка раз, ссылка два


Precompiled headers

December 30th, 2008 Begemot

На шестом году программирования я наконец дорос до того что бы узнать что такое precompiled headers, как их делать и зачем они нужны:) Раньше я и конечно использовал, благо визард MFC-приложения делает precompiled header по умолчанию и заставляет им пользоватся. Но с переходом на wxWidgets надо было учить самому, а с “учить” у меня что-то последнее время проблемы.

Все оказалось не так и сложно, объясняю на бытов уровне, так что если кто знает как пользоватся – дальше не читайте! Обьясняю на примере VC 2008:

  1. Создаете и добавляете в проект x.h и x.cpp файлы
  2. В x.cpp пишете #include “x.h”
  3. В .h добавляете все все хедеры которые вам нужны
  4. Во все cpp файлы проекта добавляете  #include “x.h”
  5. Вызываете контекстое меню для x.cpp, выбираете свойства файла  С++ ->Precompiled headers -> Create Precompiled headers \Yc  |   x.h    | $(IntDir)\$(TargetName).pch
  6. Теперь настройки проекта, туда же. Use Precompiled headers |   x.h    | $(IntDir)\$(TargetName).pch
  7. Радуйтесь

После этих действий  полная сборка проекта занимает максимум 12 секунд вместо 1:20, и это я еще далеко не все стандартные хедеры вынес в precompiled headers. Компиляция части проекта, тоже быстрее  1-2 секунды.

Знаю что это азы, но вдруг кто как и я их не знает:)

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


Худеем

December 29th, 2008 Begemot

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

Поэтому перед релизом решил сбросить лишние килобайты. Для моего ехе уже стояла нужная оптимизация (/O1 /Os), так что начал с wxWidgets – собрал релизную версию с оптимизацией по размеру вместо скорости (компилятор от Visual Studio  2008) с этими же опциями. И удивлению моему не было предела – сбросил целых 375 Kb, 1,767 вместо 2,140.

Так же поступил с DatasetLayer. Еще минус 14 кб.

Теперь жду когда начнет тормозить 🙂


Используем png для иконок и храним ресурсы в архиве

December 24th, 2008 Begemot

Со временем я пришел к выводу что иконки лучше хранить в PNG, чем в XPM. Несомненый плюс это наличие альфа-канала. К тому же хранение иконок вне exe файла позволяет пользователю заменить используемые иконки на свои, что дает возможность правильно использовать для вашего приложения графику под LGPL лицензией (Где брать бесплатные иконки).

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

Я написал пару врапперов для удобной работы:

[sourcecode language=”cpp”]
// don’t forget call wxFileSystem::AddHandler(new wxZipFSHandler); in MyApp::OnInit()
wxImage BegUtils::GetImageFromZipResource(const wxString & path, long type/*=wxBITMAP_TYPE_ANY*/)
{
scoped_ptr fs(new wxFileSystem);
scoped_ptr file(fs->OpenFile(path));
if (!file) return wxNullImage;

wxInputStream* stream = file->GetStream();
wxImage image(*stream, type);

return image;
}

// Load a text resource from zip file
// don’t forget call wxFileSystem::AddHandler(new wxZipFSHandler); in MyApp::OnInit()
wxString BegUtils::GetUTF8TextFromZipResource(const wxString& path)
{
scoped_ptr fs(new wxFileSystem);
scoped_ptr file(fs->OpenFile(path));
if (!file) wxEmptyString;

wxInputStream* stream = file->GetStream();
size_t sz = stream->GetSize();
scoped_array buf(new char[sz]);
stream->Read((void*) buf.get(), sz);

wxString text = wxString::FromUTF8(buf.get(), sz);
if (text[0]==0xFEFF) text.erase(0, 1); // BOM
return text;
}
[/sourcecode]

 

Использование примерно такое

 

[sourcecode language=”cpp”]
wxString resPath=exePath+wxT(“resource.bin#zip:”);

#define MMB(x) BegUtils::GetImageFromZipResource(resPath+wxT(“icons\\”)+x+wxT(“.png”), wxBITMAP_TYPE_PNG)

AppendMenuItemWithImage(itemMenu, wxID_HELP, _T(“Help\tF1”), _T(“”), MMB(wxT(“help”)));
AppendMenuItemWithImage(itemMenu, wxID_ABOUT, _T(“About\tAlt+F1”), _T(“”), MMB(wxT(“information”)));
….
m_ToolBar->AddTool(wxID_EXIT, _T(“”), MMB(wxT(“exit”)), wxNullBitmap, wxITEM_NORMAL, _T(“Terminate Application (Alt+X)”), wxEmptyString);
….
#undef MMB
[/sourcecode]

AppendMenuItemWithImage можно взять в wxMenu с иконками и обход выделенных атемов в wxListCtrl

Пользуйтесь на здоровье.