Перья на основе растровых изображений
Последним испытанием для геометрического пера будет произвольное bitmap-изображение. Если задать BS_PATTERN в качестве стиля кисти, на основе которой создается перо, то линия рисунка может иметь произвольный узор и толщину, что дает волю фантазии разработчика. Однако сначала следует создать ресурс bitmap-изображения, загрузить его и задать его описатель в поле IbHatch логической кисти.
Для создания изображения:
- Перейдите в окно Resource View.
- Раскройте узел дерева под именем API.rc и убедитесь, что в дереве нет узла с именем Bitmap.
- Вызовите контекстное меню на узле API.rc и дайте команду Add Resource.
- В диалоге Add Resource выберите тип Bitmap и нажмите кнопку New.
- Откройте окно Properties и в поле справа от текста ID задайте идентификатор IDB_PAT1 новому точечному изображению.
- Измените размер изображения, уменьшив его до 5x5. Используйте для этой цели элементами управления (resize handles) рамки.
- Создайте произвольное изображение с помощью контрастирующих цветов.
- В окне Resource View вызовите контекстное меню на узле дерева IDВ_РАТ1 и выберите команду Insert Copy.
- Измените язык копии на тот, который поддерживается системой, например English (United States), иначе не получится, и нажмите ОК.
- Теперь вы имеете копию изображения с теми же размерами и идентификатором. Здесь удобно перевести окно Properties в режим Floating или сдвинуть его нижнюю границу вверх. Измените идентификатор нового изображения на IDВ_РАТ2 и, при желании, возвратите язык ресурса.
- Измените узор второго изображения и повторите пункты 7-10, задав идентификатор IDВ_РАТЗ для третьего изображения.
Возвратитесь в окно API.CPP и введите в число локальных переменных функции wndProc новые массивы:
//===== Массив идентификаторов bitmap static UINT nPatterns[] = { IDB_PAT1, IDB_PAT2, IDB_PAT3 }; static string bitmap!] = { "BS_PATTERN, 1", "BS_PATTERN, 2", "BS_PATTERN, 3" );
Вслед за фрагментом, моделирующим стиль PS_USERSTYLE, вставьте следующий код:
//======= Геометричесое перо (bitmap) Ib.lbStyle = BS_PATTERN; sText = "Стили на основе bitmap-узора (Geometric pen)"; GetTextExtentPoint(hdc,sText.c_str(), sText.size 0,SszText); iYPos += 2 * szText.cy; iXPos = iXCenter – szText.cx/2; TextOut(hdc, iXPos, iYPos, sText.c_str(), sText .size ()); nLines = sizeof(nPatterns)/sizeof(nPatterns[0]); for (i =0; i < nLines; i++) { HBITMAP hBmp; hBmp = LoadBitmap(GetModuleHandle(NULL), (char*)nPatterns[i]); Ib.lbHatch = long(hBmp); HPEN hp = ExtCreatePen(PS_GEOMETRIC, 5, &lb, 0, 0); HPEN hOld = (HPEN)SelectObject(hdc, hp); iYPos += szText.cy; MoveToEx(hdc, 10, iYPos, NULL); LineTofhdc, iXMax,iYPos); SelectObject(hdc, hOld); DeleteObject(hp); TextOut(hdc, 10, iYPos, bitmap[i].c_str(), bitmap[i].size ()); }