Новые книги

The tutorials start with the most basic Windows program, the windows equivalent of "hello world!", Winnie. Then we move on to a more Generic program, which serves as a skeleton for a simple Windows application. Then we discuss various Controls. Using these controls one can build a complete dialog-based application, whose main window is a dialog. We are then ready to discuss a Generic Dialog, a framework with which one can quickly build specific dialogs.

To do some simple graphics one needs a Canvas object. You use Pens and Brushes to paint on the canvas.

More advanced topics include programming with Threads with a practical example of a Folder Watcher — a program that watches directories for changes.

Modern windows programming requires some knowledge of the Shell API, which leads us to the discussion of OLE and COM. We show how one can encapsulate OLE in C++ to create Smart OLE. OLE is also used in Automation, which lets your application talk to other applications.

Controls are nothing but specialized windows. You can easily create your own controls, as evidenced by the Splitter Bar tutorial.

For graphics programmer, we give a short introduction on using Bitmaps for animation and a more advanced tutorial on using Direct Draw.
Harvard Business Review – главный деловой журнал в мире. Представляем новый выпуск серии «HBR: 10 лучших статей», посвященный проблемам стратегического маркетинга.

Если вы недовольны результатами работы вашего маркетингового отдела и хотите улучшить показатели продаж компании, эта книга для вас. Из сотен статей журнала, посвященных стратегическому маркетингу, редакторы HBR отобрали самые полезные и актуальные на сегодняшний день. Из них вы узнаете, каковы преимущества клиентоориентированной стратегии, как с максимальной эффективностью использовать привязанность покупателей к бренду на протяжении всей их жизни, почему так важно учитывать специфику женской психологии и, самое главное: как выстроить правильную стратегию бренда и перестать выбрасывать деньги на ветер.

Коды растровых операций

Коды растровых операций

Выше уже было сказано, что одиннадцатый аргумент функции StretchBlt() - это код растровой операции. Другими словами, это код, который определяет, как при операции будут взаимодействовать биты, определяющие заливку и изображение совместимого контекста с изображением на действительном контексте. Комбинируются биты на основе логических операций над ними. По укоренившейся в книге по программированию для Windows традиции, эти операции записываются в обратной польской нотации (не путать с венгерской, автор польской нотации не имеет к Microsoft ни малейшего отношения).

По той же традиции, биты, определяющие bitmap совместимого контекста, обозначают буквой S (source - источник, исходный), биты заливки - буквой P (pattern - образец), а биты, на которых будет прорисовываться изображение - буквой D (destination - назначение, место назначения). Операции обозначаются следующим образом: a - побитовое И (AND), n - побитовое НЕТ (NO), o - побитовое ИЛИ (OR), x - побитовое исключающее ИЛИ (XOR).

Несколько слов о польской нотации. В ней операции записываются слева направо. Знак операции следует за операндами. Появление знака операции означает, что нужно произвести следующие действия:
 - взять два последних операнда  - произвести с ними требующуюся операцию  - записать результат на место последних двух операндов.

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

Обозначив знак операции как Op, в польской нотации действия с битами можно записать таким образом:

  PSOp

Это говорит о необходимости взять пиксель патерны и прорисоваемого bitmap'а и произвести над ним операцию. Если в операции участвуют три операнда, то получим:

  DPSOp1Op2

Что мы должны сделать в этом случае? Правильно, сначала произвести действие, определяемое Op1, с битами патерны и прорисовываемым bitmap'ом, после этого произвести Op2 с полученным результатом и битами действительного контекста. Ничего сложного здесь нет.

Каждый код растровой операции представляется 32-битным целым. Старшее слово кода представляет собой индекс битовой операции, младшее - код операции. Как определяется индекс операции?

Давайте представим, что нам необходимо определить индекс растровой операции, определяемой в польской нотации записью DPSxx. Попутно можно определить и индекс операции PSx. Запишем друг под другом ОПРЕДЕЛЕННЫЕ значения P,S и D, а под ними - результаты побитовых операций PSx и DPSxx:

P11110000
S11001100
D10101010

PSx00111100
DPSxx00010110

Итак, индекс операции PSx - 0x3C, а индекс операции DPSxx - 0x96.
Уважаемый читатель, я прошу обратить внимание на то, что друг под другом записываются не произвольные, а строго определенные значения. Эти значения позволяют перебрать все возможные комбинации патерны, исходного и целевого bitmap'ов. Теперь, когда все стало ясно, вы можете попробовать попрактиковаться в определении индексов дюбых операций. Несмотря на то, что существуют 256 индексов растровых операций, на практике используются только некоторые из них. В файле wingdi.h для наиболее часто используемых растровых операций определены идентификаторы, которые приведены в таблице:

Краткое описание кодов растровых операций

Наименование Индекс
операции
Польская
запись
Эффект
BLACKNESS 0x00 0 Заполнение действительного контекста черным цветом
NOTSRCERASE 0x11 DSon  
NOTSRCCOPY 0x33 Sn Прорисовываемый bitmap отображается в негативном виде
DSTINVERT 0x55 Dn Изображение действительного контекста проявляется негативным
PATINVERT 0x5A DPx  
SRCINVERT 0x66 DSx  
SRCAND 0x88 DSa  
MERGEPAINT 0xBB DSno  
MERGECOPY 0xC0 PSa  
SRCCOPY 0xCC S Копирование прорисовываемого bitmap'а на действительный контекст
SCRPAINT 0xEE DSo  
PATCOPY 0xF0 P Копирование патерны на действительный контекст
PATPAINT 0xFB DPSnoo  
WHITENESS 0xFF 1 Заполнение действительного контекста белым цветом

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

Теперь и одиннадцатый аргумент PatBlt() стал ясным и понятным - я просто копирую bitmap в окно. Только и всего. Кстати, понимание логики работы с растровыми операциями может позволить избежать трудоемких преобразований bitmap'ов перед копированием.