Э-э-х, непростая у
нас, программистов, профессия! Иногда просто откровенно завидуешь медикам,
лингвистам, архитекторам, ученым и всем остальным, которые отучились в
институте - и могут спать спокойно: если что-то принципиально новое и появляется
в их области, то не слишком часто и точно не слишком помногу. У нас же
в одночасье, иногда по хотению и велению только ОДНОЙ фирмы, все может
перевернуться с головы на ноги (чаще наоборот), и вот ты обнаруживаешь, что
никокой ты не специалист, - тебе надо еще учиться, учиться и учиться (не помню
кто сказал ;) Когда смотришь объявления о работе для программистов,
частенько кружится голова от всяких аббревиатур и названий на английском языке -
MFC, ATL, COM, ASP, PHP, SQL, HTML, DHTML, XML, UML, VB, VBA, VBScript, C++,
Java, JavaScript, Perl, CGI, TCP/IP, OpenGL, DirectX и пр. и пр.
Кстати, я в парочке объявлений уже заметил C# , хотя он еще даже не вышел! И
вот видишь в объявлении совершенно непредсказуемую комбинацию из четырех-пяти
вышеперечисленных названий, и думаешь - неужели есть кто-то, кто это все знает?
Да еще имеет 2-3 года опыта работы с этим? А вот в том-то и дело, что
таких людей не слишком много. Есть один практический совет: если вы хотя бы на
60% удовлетворяете требованиям работодателя, посылайте
резюме!
Мне могут возразить, что мол старые технологии остаются
востребованными всегда, наряду с новыми. Я скажу одно: когда вы последний раз
видели, чтобы требовался программист под MS-DOS? А я помню время, когда под
Windows (тогда еще 3.1) программировали считанные единицы (и то все считали это
недостойным занятием), а большинство работало именно в DOS.
Утешить
может только одно: постигая что-то конкретное, мы также постигаем общий принцип,
по которому это конкретное сделано. А вот знание общих принципов, господа -
действительно помогает. Уже зная пару-тройку языков, новый язык программирования
вполне реально изучить за две недели, за месяц - писать на нем сносные
программы, за полгода - стать профессионалом. Только через полгода обязательно
появится еще что-нибудь новое...;) Поэтому люди сейчас
поступают умнее: они осваивают новое еще ДО того,
как это новое появится. Нет, они вовсе не
путешествуют во времени...
Статья про
WTL в 14-ом выпуске не осталась незамеченной. Некоторые заитересовались
этой
темой, некоторые захотели высказать свое мнение. Вот одно
из таких писем:
Добрый день (вечер, ночь, утро) Алекс
и подписчики
"Программирование на Visual С++" (в случае, если мое письмо опубликуют в
рассылке). После
прочтения выпуска No.14 у меня появилась пара мыслей по поводу будущего MFC и
WTL. Точнее, мысли эти у меня есть давно (месяца два-три), возможно, вы об
этом тоже знаете. То, что MFC умирает - это факт. С самого начала она была
мертворожденной. Постоянные баги, внутренняя сложность, обилие
недокументированных внутренних структур и функций - все это не делает
библиотеку хорошей. Я уже не говорю о ее монстрообразности. Да, с ней удобно
работать. Но стоят ли проблемы удобства? Можно говорить очень долго о
достоинствах и недостатках MFC, но факт остается фактом: будущего у нее нет.
Что касается WTL, то здесь тоже все непросто. Точнее, если верить одному
из мэнэджеров Майкрософт (к сожалению, не помню кто), то все очень просто: у
WTL будущего тоже нет. В одном из выступлений он заметил, что WTL не будет
поддерживаться Майкрософт. Правда, не исключено, что WTL получит свое
развитие. Ну и последнее. Я думаю, все слышали о проекте Майкрософт .NET.
Я занимаюсь им в свободное время и могу сказать одно: это действительно
отличная вещь. Пока еще сырая, нет даже беты, но уже в следующем обновлении
MSDN (октябрь) должна появиться Visual Studio 7 Beta (или Visual Studio.Net).
Не хочу рассказывать о .NET, не для маленького письма тема, к тому же, я не
настолько хороший лектор, как Jeffrey Richter и Don Box. Поэтому всем, кто
интересуется, могу посоветовать пару ссылок: http://www.msdn.microsoft.com/net/
, http://www.andymcm.com/ и
замечательный список рассылки DOTNET на http://discuss.develop.com.
Q1| В Visual
C++ 6.0
создаётся ImageList с помощью ImageList_LoadImage. Потом две загруженные
картинки рисуются в окошке - сначала одна, потом поверх неё другая (используется
маска) - функция ImageList_Draw. Проблема в том, что рисуется только в 16
стандартных цветах. Картинка 24-битная. Пробовал и с 256 и 16-цветными, с
использованием палитры - эффект тот же. Если не сложно, подскажи, как её
нарисовать в 16M цвете (использую только API, без MFC)? -
Дрон
|A
Насколько я понимаю, в функцию ImageList_LoadImage следует
передать флаг LR_CREATEDIBSECTION, чтобы избежать преобразований цветов в
изображении. Например:
Такой
же ответ на этот вопрос прислал David Potashinsky.
Большое спасибо всем, кто
откликнулся.
У меня
выдалось немного свободного времени, поэтому следующий вопрос я не
стал помещать в рубрику "В поисках истины", а ответил на него сам:
Q2| Меня попросили
сделать страничку свойств (CPropertySheet),
которая является главным окном приложения, минимизируемой. Означенная просьба
неожиданно оказалась не столь простой как кажется на первый взгляд. Добавить
собственно значок минимизации - нет проблем: в CPropertySheet::OnInitDialog
добавляем ModifyStyle(0, WS_MINIMIZEBOX). Одно плохо - не работает он.
- Олег
|A
Сначала
скажу, что эта идея - property sheet в качестве главного окна приложения -
довольно неудачная. Сейчас объясню, почему. С точки зрения Windows Ваше
приложение является не окном в полном смысле слова, а диалогом, причем таким
диалогом, кнопка которого на панель задач не выводится. Т.о. при минимизации
произойдет вовсе не то, что Вы ожидали - он минимизируется а-ля windows 3.1
(или как дочернее окно MDI) - в левый нижний угол. Можно конечно
ухитриться и сделать так, чтобы показывалась кнопка на таскбаре (см.
предыдущий выпуск), но приемлемый, на мой взгляд, выход в данной ситуации
- минимизировать в системный трей.
Теперь - что надо сделать, чтобы
кнопка минимизации заработала: При нажатии на эту кнопку для такого окна
генерации события WM_SYSCOMMAND не происходит, и обрабатывать его
нет смысла. Поэтому в класс-наследник CPropertySheet нужно добавить
обработчик события WM_NCLBUTTONDOWN (non-client left button down, это событие
происходит, когда нажимается левая кнопка мыши в неклиентской области
окна, а значок минимизации как раз и находится в этой области):
void
CMinSheet::OnNcLButtonDown(UINT nHitTest, CPoint point) {
// TODO: Add your message handler code
here and/or call default
CPropertySheet::OnNcLButtonDown(nHitTest, point);
if (nHitTest == HTMINBUTTON) {
IsIconic()? ShowWindow(SW_RESTORE):
ShowWindow(SW_MINIMIZE); } }
Заметьте, что в
свернутом состоянии кнопка минимизации (minimize) становится кнопкой
восстановления (restore). Повторю, в этом случае
минимизироваться диалог будет в левый нижний угол. Лучше всего вместо
минимизации его прятать [ ShowWindow(SW_HIDE); ] и выводить
иконку в трее (как это делать см. выпуск рассылки
No.11).
Если кто-то из вас, уважаемые подписчики, не
согласен в чем-то с этим ответом, или есть какие-нибудь дополнения -
обязательно напишите.
Подробно про класс CPropertySheet вы сможете прочитать
в следующем выпуске.
Q| Возникла
вот
такая задачка. Имеется некоторое разбиение SDI на несколько view при помощи
сплиттеров (A). Как его изменить не убивая окна (на B или C)? -
Nikita Zeemin