Перевод главы 11: Буфер обмена и поддержка перетаскивания (Drag and Drop)

September 19th, 2008 Begemot

Лирическое отступление

Я уже говорил что решил поучаствовать в переводе на русский книги “Cross-Platform GUI Programming with wxWidgets”. Теперь пришло время публиковать первую переведенную мной главу.

Выбор главы не случаен, я как раз сейчас работаю над написанием на wxWidgets программы для ведения истории буфера обмена.

Можете высказывать свои замечания, пожелания, поправки… они вполне могут войти в финальный вариант перевода.

Спасибо Алексею, за редактирование и оформление текста.

Читать под катом.

 

Read the rest of this entry »


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


wxSearchCtrl или может я чего-то не понимаю?

September 11th, 2008 Begemot

Писец какой-то, нужно реализовать фильтрацию\поиск в приложении, вспомнаю что в wxWidgets есть специальный компонент для поиска – красивенький такой.

image

Ура думаю, сейчас быстро заюзаю, и напишу в блог в категорию ‘+1’. Как же заюзал, вообщем сегодня будем пороть  wxSearchCtrl.

  1. Логику человека который догадался разместить кнопку начала поиска слева (!), а очистки - справа мне наверное никогда не понять.
  2. Enter по умолчанию не забинден на кнопку начала поиска, а просто служит для навигации в диалоге, переход на следующий контрол
  3. Что бы иметь возможность отлавливать Enter, надо поставить флаг wxTE_PROCESS_ENTER. Но если создать контрол с этим флагом, то вдруг перестает работать tab(?)…
  4. Connect(wxID_ANY, xEVT_KEY_DOWN, wxKeyEventHandler(MainFrame::OnKeyDown), (wxObject*)NULL,

    this); для этого контрола не работает. А мне обязательно надо…

Если кто разбирался\работал\знает – я ничего не пропустил, может можно добится того чего я хочу?

Вот не могу понять, это действительно все так плохо сделано, или у меня какие-то извращенно завышенные желания. Может мне тестером пойти работать :)

p.s. Кто знает как отловить факт прихода\ухода фокуса для любого контрола в окне?


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Учимся вводить только цифры в wxTextCtrl

September 8th, 2008 Begemot

Поразительная фигня, казалось бы простая задача  и должно быть готовое решение. И правда есть, только поразительно кривое:(

Итак, задача – необходимо дать возможность пользователю указать число, например в настройках, количество записей  для отображения где-нибудь… Первое что приходит в голову – wxSlider, ну знаете такой контрол со стрелочками. Так как у меня диапазон от нуля до 10 000, а возможность задать шаг инкрементации для стрелочек я не нашел, и равен он 1 – то этот вариант, оказывается издевательством над юзером.

Думаем дальше и вспоминаем, про wxTextCtrl и валидаторы. Радуемся и пишем код, что-то типа

m_Count = new wxTextCtrl( this, ID_MAXCLIPTEXT, _T(""), wxDefaultPosition, wxSize(50, -1), 0, wxTextValidator(wxFILTER_NUMERIC, &count));

Я ожидал что контрол будет давать вводить в себя только цифры. Я ошибся, он также пропускал точку и запятую, что еще хоть как-то можно понять, хотя его и не просили. Но еще оказались разрешенными: ‘+’ и ‘–’. Также он спокойно пропускал все буквы кирилицы. Похоже что контрол отфильтровывал только пробел, спецсимволы и латиницу. Хотя даже это можно ввести туда пользуясь драг анд дропом или простой вставкой. Вообщем я разочаровался.

Попробывал задать более конкретно wxFILTER_INCLUDE_CHAR_LIST и разрешил только цифры. “голосуй, не голосуй, все равно … “ (с). Теже траблы со вставкой текста из буфера и …. с кирилицей. Прямо наваждение какое-то.

Решил писать сам, вот что получилось


h:
	void OnMaxClipTextUpdated( wxCommandEvent& event );

	wxTextCtrl* m_Count;

	unsigned long maxCount;
	long maxInsertionPoint;
	wxString maxCountStr;
	bool maxSetManually;

cpp:
	EVT_TEXT( ID_MAXCLIPTEXT, COPDatabase::OnMaxClipTextUpdated )

	m_Count = new wxTextCtrl( this, ID_MAXCLIPTEXT, _T(""), wxDefaultPosition, wxSize(50, -1), 0);
	m_Count->SetMaxLength(4);

void COPDatabase::OnMaxClipTextUpdated( wxCommandEvent& event )
{
	if (maxSetManually) return;
	wxString str=m_Count->GetValue();

	if (str.empty() || (str==wxT(" "))) // вторая проверка нужна для случая когда юзер выделяет все в контроле и жмет пробел
	{
		maxCount=0;
		str=wxT("0");
		maxInsertionPoint=1;
		// or if you want to let empty string - replace last 2 string to these - maxCountStr=wxEmptyString; maxInsertionPoint=0;
	}

	if (str.ToULong(&maxCount))
	{ // successfully converted to ulong, check range now
		if (maxCount>10000) maxCount=10000;
		else if (maxCount<0) maxCount=0;

		maxInsertionPoint=m_Count->GetInsertionPoint();
		maxCountStr=wxString::Format(wxT("%i"), maxCount); // we should do like this! иначе траблы с пробелами, нулями..
	}

	maxSetManually=true;
	m_Count->SetValue(maxCountStr);
	maxSetManually=false;
	m_Count->SetInsertionPoint(maxInsertionPoint);
}

Код выглядит извратом, но именно в такой он превратился после нескольких итераций, и такой заработал лучше всего.

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

Еще совет, лучше поставить ограничение на длину вводимых символов, типа m_Count->SetMaxLength(4); для верхней границы 10000 и т.д.

Пользуйтесь. Высказывайтесь.


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Не показывается tooltips под Windows 2000

September 3rd, 2008 Begemot

Баги + плохая память = даром потраченное время  и нервы. Не совсем про wxWidgets, но может кому полезно будет.

Собираю вчера альфу для своих, типа наконец дожил - радуюсь. Ставлю жене на машину и тут облом, не работают тултипсы. Код на винапи, перетащил со старой программы на мфц и вставил с минимальными правками.  Под ХП все работает, под Windows 2000 не показывается tooltips.

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

Исправил проблемное место в этом коде – не помогло, исправил попутно еще два бага в программе никак не связанных с этим. Самое обидное что в старой версии программы (mfc) этот код работает, в новой(wxwidgets) уже нет.

Вечером дошло что старая версия – ansi, новая – юникодная. Вспомнил что код используется еще в одной программе на мфц, но уже юникодной, посмотрел – работает под двушкой нормально.  Полез в сорцы, нашел одну строчку и долго матерился. С этой багой я уже сталкивался, тоже долго е****я и все-таки решил, но забыл:) Единственное мое оправдание что было это больше двух лет назад.

Вот строчка которую я нашел:


ZeroMemory(&ti, sizeof(TOOLINFO));
//ti.cbSize = sizeof(TOOLINFO);
// Я знаю что тут должно быть sizeof(TOOLINFO) =48, но при числах более 44 оно не показывает подсказку - под win2K, похоже только в юникоде
ti.cbSize = 44; 

Глюк этот похоже появлятся только в юникодных версиях программ под Windows 2000 – tooltip создается, но не появляется на экране. Решается вот таким грязным хаком.

Шаманство.


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Первые траблы с Chome и wxWidgets.

September 3rd, 2008 Begemot

Вот щеет, поставил Chome как дефолтный броузер, теперь мои wx-проги при попытке выполнить код перехода на веб страницу типа

wxLaunchDefaultBrowser(dHomeLink, wxBROWSER_NEW_WINDOW); 

запускают броузер и открывают страницу, но выдают ошибку

12:39:20: Can’t open registry key ‘HKCR\http\shell\open\DDEExec\topic’ (error 2: the system cannot find the file specified.)
12:39:20: Can’t read value of ‘HKCR\http\shell\open\DDEExec\topic’ (error 2: the system cannot find the file specified.)

Че за  новая напасть:(


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Zip-уем данные на лету

September 2nd, 2008 Begemot

Встроенные удобства это приятно!:)

Пишу данные в базу, возникла мысль что архивирование может быть очень кстати, попробывал – действительно стало лучше. Арихивирование благодаря встроенным средствам wxWidgets делается легко и быстро. Просто пропускаем данные через wxZlibOutputStream который архивирует\распаковывает на лету.


void SavecbContentToStream(wxMemoryOutputStream &memout, bool zlib/*=false*/) const
{
   scoped_ptr<wxDataOutputStream> dos;
   scoped_ptr<wxZlibOutputStream> zlibstr;

  if(zlib)
   {
        zlibstr.reset(new wxZlibOutputStream(memout, -1, wxZLIB_GZIP));
        dos.reset(new wxDataOutputStream (*zlibstr));
   }
   else
        dos.reset(new wxDataOutputStream (memout));

    // write some data …
   *dos <<(wxUint16)1 <<(wxUint16)cbContent.size();
   //  ...
}

Функция записывает данные в переданный буфер с опциональным архивированием их.


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Новый блог про разработку для мобильных устройств

August 4th, 2008 Begemot

T-Rex оказывает разродился новым блогом про разработку под мобильные устройства, если я правильно понимаю то упор будет сделан на разработку с использованием wxWidgets, что не может не радовать:)

Уже есть пару полезных материалов, по крайней мере, про сборку SQLite для   Windows Mobile мне бы скоро пришлось у него спрашивать:)

Так что добавляйте в свои ридеры.


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


MiniFrame Looks Terrible in Gnome

August 2nd, 2008 Begemot

If you ever want to create a cross-platform program with an interface similar to Photoshop’s, i.e. using palettes with different tools, don’t use wxWidgets. The only thing that comes close to that sort of palette is wx’s MiniFrame, which can only minimize / iconize on Windows. In GNOME, the MiniFrame looks terrible, especially with Compiz enabled. It cannot be….

http://gayhacker.wordpress.com/2008/07/11/the-wxminiframe-problem/


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Переведенные главы книжки по программированию на wxWidgets

July 22nd, 2008 Begemot

В продолжение разговор про перевод книги Cross-Platform GUI Programming with wxWidgets By Julian Smart, Kevin Hock, Stefan Csomor. Несколько глав уже переведенны и выложенны  у T-Rexa, но там ссылки на pdf файлы ведут на депозитфайлс, с которого качать более чем гемморойно. Поэтому по взаимной договоренности, я дублирую их на своем хостинге.

Итак переведенные главы:

 


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Перевод Книги по wxWidgets

July 20th, 2008 Begemot

Вот странное все-таки существо человек:) Еще надавно я жаловался что я плохо работаю, занимаюсь чем угодно, но только не тем основным проектом которым надо и спрашивал у психолога что делать, И вот на тебе, на фоне всего этого, да еще и лета с его жарой, ленью и разъездами, я, мечтая убить кучу лишних полумертвых проектов которые я повешал себе на шею, ввязываюсь в новую “авантюру” –принимаю предложение Алексея помочь ему с переводом книги по программированию на wxWidgets - Cross-Platform GUI Programming with wxWidgets. И это при том что я ни разу не переводчик, и даже не чувак хорошо знающий английский или русский языки:)

Часть книги уже переведенна Алексеем, остальное сейчас в переводе. Теперь переводят уже целых два переводчика, так что дело должно пойти быстрее. Вот бы только лето кончилось:) Ждите.


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.




Page 2 of 6«123456»