На главную К Бендеру |
Порой не всегда удается найти в интернете или еще где реализацию некоторых вещей (компонентов, и т.п.), которые могут быть полезными не только мне. По этому и появилась эта страничка, на которой я буду выкладывать всякие интересные решения (в основном на с++), которые мне удалось реализовать самому или которые мне показались достаточно интересными. Если есть желание поделиться со мной какими-то своими решениями, милости прошу гостевую или на мыло.
Вам предлагаются следующие полезные компоненты (решения):
Окно ввода с всплывающими подсказками
В один прекрасный момент у меня появилась необходимось сделать компонент (или типа того ), представляющий собой окно ввода (TEdit) c всплывающими в нем подсказками по мере набора текста (ну примерно как в браузере, когда вы набираете url, а внизу выпадает некий список...). Начал рыться в интернете инашел следующую информацию:
"всплывающая подсказка" (далее будем называть ее так) реализуется при помощи shell-интерфейса IAutoComplete. Описание этого COM-интерфеса можно найти в msdn. Примеры работы с этим интерфейсом есть почти для всех популярных сред программирования (Delphi, VC, C#), за исключением C++ Builder (для этой среды вообще почему-то мало чего делается , а я в основном работаю в ней).
Попытался разобраться с этим. Позадовал вопросы на форумах. После чего пришел к неутешительному выводу: в рунете практически нет никакой информации по этому интерфейсу, за исключением пожалуй вот этого, который конечно навел меня на мысль, что все придется реализовывать самому, но не более . Более того, на одном из форумов мне вообще посоветовали использовать стандартный компонент TComboBox (
как вариант для решения данной задачи это конечно подходит, но с точки зрения пользовательского интерфейса TComboBox для этой задачи выглядит как-то не очень...). Короче, не найдя ничего стоящего, пришлось залезать в инет поглубже и рыть, рыть, рыть...
А нарыл я следующее. Как я уже написал ранее, примеры работы с IAutoComplete есть практически для всех популярных средств разработки. Исходники и ссылки на них будут расположены в конце. Мне повезло, что среди них присутствует вариант на VC, в котором описана полная реализация объекта "автозавершения" (или как я его называю - "объекта с автоподсказкой"). Хотя я нашел исходники и для Delphi, которые казалось бы должны быть ближе к C++ Builder, но это оказалось не так, ибо паскаль штука такая, что без поллитра не разберешься . Но это я так, к слову. На самом деле на мой взгляд в этом примере не совсем верна реализация некоторых методов. Хотя сам запускать его не пробовал (времени не было, да и желания). У кого чего-нибудь из этого найдется - код в конце. Да, и не забудьте пожалуйста оповистить меня о ваших результатах (интересно все-таки
).
В итоге по аналогии с вариантом для VC реализовал два объекта:
Написал код для С++ Builder с использованием VCL. Но через некоторое время подумал, почему бы не сделать портируемый код. Ну и сделал ... с использованием STL и библиотеки BOOST, откуда взял "умный" указатель intrusive_ptr (вообще библиотека BOOST очень полезная, всем советую ). Код проверил на "всех" имеющихся у меня компиляторах: Borland C++ Builder 6.0 и Microsoft Visual Studio 2008. Как ни странно, и там и там все скомпилировалось и сработало без ошибок и варнингов
.
Как и обещал вначале (ну или около того), выкладываю написанный мною код и подробное описание к нему, сделаное в системе doxygen. А так же выкладываю все что мне удалось нарыть в инете (вдруг кому интересно будет посмотреть). Для скачивания нужной информации просто нажмите на ссылку и наслаждайтесь .
Мой портируемый код, VC (код, статья), С# (статья), Delphi (код, статья).
Программа расчета глубины резкости объективов фотокамер
После того, как прикупил себе зеркалку Canon EOS 450D и сделал на ней несколько фоток, очень сильно порадовался . Решил почитать теорию фотографии и наткнулся на одно, по крайней мере для меня, интересное место. А именно - глубина резко изображаемового пространства (ГРИП).
Поясню почему оно меня занинтересовало. Когда я для фотосъемки пользовался обычныой "мыльницей" (Canon PowerShot A710 IS), то сделать акцент на какой либо детали фотографии было практически невозможно (в силу особенностей предлагаемой оптики, размеров матрицы, и т.п.). По этому такие вещи, как глубина резкости в кадре, меня особо не интересовали. С появлением же "зеркалки" был приятно удивлен тому, что оказывается можно делать размытый фон у фотографии не только средствами фотошопа, а так же самой оптикой. Вот тут-то меня и заинтересовало, как же это делается?
В итоге, почитал теорию, нашел формулы расчета ГРИП (здесь) и накидал простенькую программку. Кому надо - пользуйтесь. Если есть какие-то пожелания по усовершенствованию этой программы, пишите в гостевую или на мыло. Если не будет лениво, сделаю . Кстати, аналогичная прога, только в интернете (оналайн) есть здесь. Желающие так-же могут ей воспользоваться.
Вкратце о самой программе. Она позволяет расчитать переднюю и заднюю границы резко изображаемого пространства, ГРИП, а так же гиперфокальное расстояние объектива. Для этого Вам потребуется ввести:
И, наконец, самое главное . Программу можете взять здесь. З.Ы. Программа проверена антивирусом
. Вирусов не обранужено
.