пятница, 30 мая 2008 г.

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

Так я думал когда увидел в 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  оставить для более специфических вещей.

вторник, 20 мая 2008 г.

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

Обнаружил что Винда не любит точки в конце папок, поэтому доработал функциию 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;

}

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