Direct2D 学习笔记(2)画刷 Brush

画刷的使用方法
需要包含的文件:<wincodec.h>
需要包含的库: "windowscodecs.lib"
 
1.颜色——D2D_COLOR_F 结构体
D2D_COLOR_F 结构体的原型是D3DCOLORVALUE
typedef struct _D3DCOLORVALUE {
    float r;  //红色分量值,范围0-1
    float g;  //绿色分量值,范围0-1
    float b;  //蓝色分量值,范围0-1
    float a;  //alpha分量值(透明度),范围0-1
} D3DCOLORVALUE;

 

其中,四个属性的取值范围是0-1。
可以通过D2D1::ColorF方法获取颜色
D2D1::ColorF(0.0f, 0.0f, 0.0f, 1.0f);      //rgba形式
D2D1::ColorF(0x000000, 1.0f);           //UINT32形式
D2D1::ColorF(D2D1::ColorF::Pink, 1.0f);    //Enum形式特定值

 

2.位图的加载——ID2D1Bitmap
从文件中加载位图:
以下代码可以看作是一个模板,除了第2步中的文件名”filename",以及第4步中的width/height需要更改,其他的只需套用即可完成位图ID2D1Bitmap的初始化,因此一般把它封装成一个函数使用。
//1初始化IWICImagingFactory
IWICImagingFactory *pIWICFactory;
CoInitialize(NULL);
CoCreateIstance(
 CLSID_WICImagingFactory,
 NULL,
 CLSCTX_INPROC_SERVER,
 IID_PPV_ARGS(&pIWICFactory)
);

ID2D1Bitmap *pBitmap;
IWICBitmapDecoder *pDecoder;
IWICBitmapFrameDecode *pSource;
IWICStream *pStream;
IWICFormatConverter *pConverter;
IWICBitmapScaler *pScaler;

//2初始化IWICBitmapDecoder
pIWICFactory->CreateDecoderFromFilename(
 "filename",    //修改为图片的路径名
 NULL,
 GENERIC_READ,
 WICDecodeMetadataCacheOnload,
 &pDecoder
);

//3初始化IWICBitmapFrameDecode
pDecoder->GetFrame(0, &pSource);
//4初始化IWICBitmapScaler pIWICFactory->CreateBitmapScaler(&pScaler); pScaler->Initialize( pSource, width,   //缩放至width宽度 height,   //缩放至height高度 WICBitmapInterpolationModeCubic ); //4初始化IWICFormatConverter pIWICFactory->CreateFormatConverter(&pConverter); pConverter->Initialize( pScaler, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.0f, WICBitmapPaletteTypeMedianCut ); //5从WIC中加载位图 pRenderTarget->CreateBitmapFromWicBitmap( pConvert, NULL, &pBitmap ); //6释放临时对象 XXXXX->Release();

 

3.画刷类型
单色刷——ID2D1SolidColorBrush
ID2D1SolidColorBrush *pscBrush;
//创建单色画刷
RenderTarget->CreateSolidColorBrush(
 D2D1::ColorF(0, 1.0f),
 &pscBrush
);

 

线性渐变刷——ID2D1LinearFradientBrush
ID2D1LinearGradientBrush *plgBrush;
ID2D1GradientStopCollection *pgsCollection;

//创建渐变节点数组
D2D1_FRADIENT_STOP gradientStops[2];
gradientStops[0] = {0.0f, D2D1::ColorF(0, 1.0f)};
gradientStops[1] = {1.0f, D2D1::ColorF(0xffffff, 1.0f)};

//创建渐变条(这一部分可以想象成ps中的那个渐变)
RenderTarget->CreateGradientStopCollection(
 gradientStops,       //渐变颜色点信息
 2,                   //渐变颜色点数量
 D2D1_GAMMA_2_2,   
 D2D1_EXTEND_MODE_CLAMP,
 &pGsCollection
);

//创建渐变刷
RenderTarget->CreateLinearGradientBrush(
 LinearGradientBrushProperties(
  D2D1::Point2F(0, 0),         //渐变线起始点(窗口坐标)
  D2D1::Point2F(150, 150)     //渐变线终点(窗口坐标)
 ),
 pgsCollection,
 &plgBrush
);

 

发散渐变刷——ID2D1RadialGradientBrush
 
g_pTarget->CreateRadialGradientBrush(
 RadialGradientBrushProperties(
  Point2F(20,20),       //颜色中心
  Point2F(0, 0),         //颜色偏离中心
  20,                    //颜色x轴半径
  20                     //颜色y轴半径
 ),
 g_pGsCollection,
 &g_pRgBrush
);

 

 
位图刷——ID2D1BitmapBrush
 
//使用WIC从文件中加载资源后
pRenderTarget->CreateBitmapBrush(pBitmap, &BitmapBrush);

 

4.画刷使用
pRenderTarget->BeginDraw();
pRenderTarget->FillRectangle(&rect, pxxxBrush);
pRenderTarget->DrawRectangle(&rect, pxxxBrush);
pRenderTarget->EndDraw();

 

下一期将学习位图刷和位图的更多用法。

posted @ 2019-10-04 09:53  Halation  阅读(574)  评论(0编辑  收藏  举报