Программирование на Visual C++

Выпуск №16 от 23 сентября 2000 г.

Здравствуйте!

Э-э-х, непростая у нас, программистов, профессия! Иногда просто откровенно завидуешь медикам, лингвистам, архитекторам, ученым и всем остальным, которые отучились в институте – и могут спать спокойно: если что-то принципиально новое и появляется в их области, то не слишком часто и точно не слишком помногу. 

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

Когда смотришь объявления о работе для программистов, частенько кружится голова от всяких аббревиатур и названий на английском языке – 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 C++" (в случае, если мое письмо опубликуют в рассылке).

После прочтения выпуска 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.

(Alex Ivanoff)
ВОПРОС-ОТВЕТ

Q1  В Visual C++ 6.0  создаётся ImageList с помощью ImageList_LoadImage. Потом две загруженные картинки рисуются в окошке – сначала одна, потом поверх неё другая (используется маска) – функция ImageList_Draw. Проблема в том, что рисуется только в 16 стандартных цветах. Картинка 24-битная. Пробовал и с 256 и 16-цветными, с использованием палитры – эффект тот же. Если не сложно, подскажи, как её нарисовать в 16M цвете (использую только API, без MFC)?

(Дрон)

A. Насколько я понимаю, в функцию ImageList_LoadImage следует передать флаг LR_CREATEDIBSECTION, чтобы избежать преобразований цветов в изображении.

Например:

HIMAGELIST hImageList;

hImageList = ImageList_LoadImage(hInstance, MAKEINTRESOURCE(IDB_BITMAP1), 100, 0, CLR_NONE, IMAGE_BITMAP, LR_CREATEDIBSECTION);

(Alexander Shargin)

Такой же ответ на этот вопрос прислал 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); ] и выводить иконку в трее (как это делать см. выпуск рассылки №11).

Если кто-то из вас, уважаемые подписчики, не согласен в чем-то с этим ответом, или есть какие-нибудь дополнения – обязательно напишите.

Подробно про класс CPropertySheet вы сможете прочитать в следующем выпуске.

В ПОИСКАХ ИСТИНЫ

Q. Возникла вот такая задачка. Имеется некоторое разбиение SDI на несколько view при помощи сплиттеров (A). Как его изменить не убивая окна (на B или C)?

  +--+----+     +--+----+    +--+----+

  |  |    |     |  |    |    +  +    +

  +--+----+     +--+    |    +  +----+

  |       |     |  |    |    +  +    +

A +-------+   B +--+----+  C +--+----+

(Nikita Zeemin)

До встречи!

(©Алекс Jenter mailto:jenter@mail.ru) (Красноярск, 2000.)







Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Наверх