А счастье казалось так возможно с EVT_CHAR_HOOK

May 30th, 2008 Begemot

Так я думал когда увидел в wx-mail-list упоминание EVT_CHAR_HOOK. В доке про этот эвент ничего нет, но порывшись в гугле и поэкспеременитровал – я понял что его обработчик получает все нажатия клавиш для окна перед тем как они будут обработанны дочерними контролами. И возрадовался. Дело в том что я люблю так хоткее делать, под мфц это было PreTranslateMessage, под wxWidgets найденный вариант был – вся работа в обработчике EVT_KEY_DOWN и connect для (почти) каждого контрола на форме

m_Note->Connect(wxID_ANY, wxEVT_KEY_DOWN, wxKeyEventHandler(MainFrame::OnKeyDown), (wxObject*)NULL, this);

А поскольку коннкетить каждый контрол для сложного окна не самое приятно времепрепровождение, то я легко возбудился увидив  EVT_CHAR_HOOK. И действительно коннекты уже не нужно, обработчик вызывается автоматом. Проблемы вылезли через пару дней:(. Первое по esc приложение "прячется" в трей – в новом варианте, если при открытом меню нажать еск, приложение спрячется а меню останется висеть:) Те хоткеи обработка которых зависила от выбранного в данный момент окна – то же в пролете.

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


Update для функции ReplaceForbiddenCharsInFileName

May 20th, 2008 Begemot

Обнаружил что Винда не любит точки в конце папок, поэтому доработал функциию ReplaceForbiddenCharsInFileName, теперь будет так

/********************** 22/03/08 19:41 *************************

deleteDotsAtEnd – удалять ли точки в конце, винда неразрешает такие имена, хотя и дает их создать програмно:)

******************************************************************/

/*static*/

wxString & BegUtils::ReplaceForbiddenCharsInFileName(wxString & name, const wxString ch/*=wxT("_")*/, bool deleteDotsAtEnd/*=true*/)

{

  wxString forbidden = wxFileName::GetForbiddenChars();

  int size=forbidden.Length();

  for (int i=0; i<size; ++i)

     name.Replace( wxString(forbidden[i]), ch,

true);

  if (deleteDotsAtEnd)

  {

     int count=0, len=name.Len()-1;

     while( name.GetChar(len-count)==_T(‘.’)) count++;

    if (count) name=name.Left(name.Length()-count);

  }

  return name;

}

(пока я пишу только под винду)

Posted in Программирование
Comments Off on Update для функции ReplaceForbiddenCharsInFileName


wxWidgets: Немного о хорошем

April 12th, 2008 Begemot

Что-то последнее время были преимущественно негативные топики. Но не все так плохо, просто готовил программу к релизу, осваивал кучу новых тем, разумеется много чего не получалось вот и расстраивался:)

А вообще:

  1. Сайзеры это прикольно, конечно незнаю как они поведут себя при портировании под другие ОС. Пока пишу только под винду – вполне нравится.
  2. DialogBlocks is good resource editor for wxWidgets applications. Так все-таки не плох. Конечно надо разобратся, привыкнуть – но в принципе использовать можно. Особенно полезно поигратся на первых порах что бы понять идеологию сайзеров, изучить свойства и поиметь представления как вообще делать интерфейс.  Правда мне не особенно нравится код который он генерит да и гибкости немного не хватает что бы делать главные окна приложений… Но для отдельных простых диалогов – типа опций, вспомогательных окон – достаточно быстро можно нарисовать интерфейс. Хорошая вешь. Кстати незарегистрированная копия – вполне пойдет для ознакомления с иделогией построения интерфейса. Воообщем зачет:)
  3. Проблему с отсутвием контрола для ввода горячей клавиши в wxWidgets. Я вроде решил, вставил родной виндовый Hot Key Control, попытавшись обернуть его в wxWidgets. Так как документации по этой теме я не нашел – код там наверное кривой до ужаса:) Но если испытания покажут что работает, можно будет его почистить и выложить.
  4. Размер программы. Для меня это  имело большое значения, программы у меня маленькие, вспомогательные утилиты которые висят в трее. Сейчас размер получился 1.9М что почти в 4 раза больше версии с MFC, но судя по всему на скорости работы это не сказалось.
  5. Ну и главное я все таки выпустил программу, уже несколько дней вроде полет нормальный:) Так что можете удобно хранить свои быстрые заметки 🙂

Вообщем к эксплуатации пригодно.


Отрелизился:)

April 8th, 2008 Begemot

Наконец более-менее дописал, хотя с иконками конечно еще плохо, но если кому интересно – бету, а фактически релиз, можно посмотреть тут.


Завершение программы при выходе из системы или EVT_QUERY_END_SESSION нам не всегда друг

April 8th, 2008 Begemot

Полюбуйтесь на это  – http://sourceforge.net/tracker/index.php?func=detail&aid=1428691&group_id=9863&atid=109863 . Багу больше 2x(!) лет, тянется еще с прошлого стабильного релиза. До сих пор не пофиксен. Status: Open.  А ведь есть специальные события даже  EVT_QUERY_END_SESSION и EVT_END_SESSION

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


Запрет на запуск второго экземпляра, с коммуникацией между ними

April 7th, 2008 Begemot

Изолью душу:) Решил добавить сабж, думал все просто: копи\пайст с книжки, разобраться, подправить под себя, потестить – на час работы, максимум два. Растянулось на целый день:)

Скопировал, разобрался, подправил, тестю – все ок. Обрадовался, собрал себе релиз для внутреннего пользования -  и тут засада. В релизе, при запуске второй копии, падает сервер. Дебаг, понятное дело затруднен… В итоге нашел падает на строчке.

return m_connection;

В wxConnectionBase *stServer::OnAcceptConnection(const wxString& topic). Вернее конечно не на ней, а после нее в дебрях библиотеки. Начал ковырятся, дошел до того что поведение программы, в смысле место падения, меняется в зависимости от того где определен конструктор в заголовочном файле или в cpp :).  В итоге решил вообще отказатся от использования соединений для общения, просто если приходит от клиента попытка установить соединение, ему отказывать и серверу появлятся на экране. Так работало.

Но тут осенило, что трабла в то что, где-то что-то портило память – поэтому такое, более чем странное поведение программы. Решил рыть до конца. В итоге заметил, что в декларациях классов скопированных с книжки, после определения функций в пределах h файла ‘;’ то есть, то нет. Насколько я знаю это не критично, можно ставить можно нет. Решил поставить везде ‘;’ и чудо свершилось… с надеждой в душе, убрал их назад в небытие, но не помогло – программа все равно не падала. Вот и как это объяснить?

Posted in Uncategorized | Tags:
2 Comments (but I need more)»


Сколько весит wxHtmlWindow

April 4th, 2008 Begemot

Добавление к программе wxmsw28u_html.lib для поддержки wxHtmlWindow и about- диалога основанного на хтмл утяжеляет екзешник на 170 кб, для меня это 10%.

Posted in Oбщее
Comments Off on Сколько весит wxHtmlWindow


C размаху головой об стену бьюсь

March 31st, 2008 Begemot

Начал делать опции, диалог набросал – вполне нормально получилось. А дальше траблы:

  1. Контрола для ввода горячей клавиши в wxWidgets нету. Из сторонних решений есть keybinder, но как я понять это достаточно мощный комбаин предназначенный немного для другого. Но попробую поковырять. Откровенно говоря подозреваю что такой контрол и ручками можно написать достаточно просто или вообще виндовый заюзать (хотя не уверен что это можно).
  2. Чекбоксы не поддерживают мультилайн. Хреново. \r\n не работает, хотя это было бы тоже не выход а костыли. Почему то у wxStaticText есть Wrap, а чекбокса нету.

 

Да если вас заинтересовал первый пункт, то наверное будет интересно узнать, что возможности сделать system wide hotkey под linux’om тоже нету. Разработчики библиотеки говорят – что линукс не дает такого апи. Хотя ходят слухи, что какие обходные пути есть. Дожевем до линукса посмотрим.


GetForbiddenChars() -> ReplaceForbiddenCharsInFileName()

March 27th, 2008 Begemot

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

wxFileName::GetForbiddenChars() есть, а обработать имя нечем. Написал свою.

/*static*/

wxString & BegUtils::ReplaceForbiddenCharsInFileName(wxString & name, const wxString ch/*=wxT(“_”)*/)

{

wxString forbidden = wxFileName::GetForbiddenChars();

int size=forbidden.Length();

for (int i=0; i<size; ++i)

name.Replace( wxString(forbidden[i]), ch,

true);

return name;

}


P.S. Кстати если в диалоге выбора папки – выбрать что-нибудь типа Мой Компьюте или Сетевое Окружение и нажать ОК, то диалог ввернет wxID_CANCEL. Он то вроде и правильно, нельзя же в эти папки писать – но пользователь может и не понять. Под MFC возращает id_ok и кривой путь, в результате получается запись в корень с:


Антиспамеры зло

March 22nd, 2008 Begemot

Чего-то там правят в списках рассылки wx’совских, перенесли на новый сервер, поставили SpamAssassin.  Теперь все мои письма Blocked by SpamAssassin. Обращения на форум шадонета не помогло, письмо лично тому чуваку который анонсировал изменения в майл листах тоже без ответа. Так что теперь чукча не писатель, чукча читатель.

Posted in Uncategorized | Tags:
Comments Off on Антиспамеры зло