关于最近

MyRainmeter

1:用GDI+重写了MyRainmeter的部分绘制代码。

why GDI+

怎么说呢,对于GDI的理解还只是在于表面,很多也仅仅限于会用(还是在查文档的前提下), 不过不管怎样,慢慢的积累就是一种进步。

GDI+在于图形绘制提供了很多GDI没有、或者说简化了GDI操作的函数封装。譬如对于32位位图PNG的绘制,透明图层在GDI里还得自己慢慢算,是一个很头疼的事。

how to use GDI+

为了使用GDI+,必须包含GDI+的头文件目录,以及调用GDI+lib库。

    // Using GDI+
    #include <gdiplus.h>
    #pragma comment(lib, "gdiplus.lib")
    using namespace Gdiplus;

然后的话是初始化和销毁环境,初始化和销毁工作应该在同一时段完成,以免因为后来忘了销毁,然后…… 在初始化之前先声明一个句柄,用于管理GDI+;

    protected:
    	ULONG_PTR m_gdiplusToken;  

初始化

    // Startup GDI+
    GdiplusStartupInput input;  
    GdiplusStartup(&m;_gdiplusToken, &input;, NULL); 

销毁

    // Shutdown GDI+
    GdiplusShutdown(m_gdiplusToken);  

在MyRainmeter之中,由于会有比较多的地方用到GDI+,所以初始化和销毁放在CMyRainmeterApp类中完成,即存在于软件的整个生命周期中。

some samples:

使用指定颜色填充矩形:

    Graphics graphics(pDC->m_hDC);	 // 初始化graphics变量,从gdi获取图形绘制入口
    Gdiplus::Rect solidRect(m_X, m_Y, m_W, m_H);
    Color solidColor = Color(GetAValue(color), GetRValue(color), GetGValue(color), GetBValue(color));
    SolidBrush solidBrush(solidColor);
    graphics.FillRectangle(&solidBrush;, solidRect);

渐变色填充指定矩形:

    Color solidColor2 = Color(GetAValue(color), GetRValue(color), GetGValue(color), GetBValue(color));
    Gdiplus::LinearGradientBrush linGrBrush(solidRect,  //  绘制区域
    	solidColor,  //  第一种颜色
    	solidColor2,  //  第二种颜色 
    	(Gdiplus::REAL)m_GradientAngle);  //  渐变色的角度
    
    graphics.FillRectangle(&linGrBrush;, solidRect);

绘制灰度图片:

    Gdiplus::Image* pImage = new Gdiplus::Image(m_ImageName);
           // 通过矩阵实现颜色转化,使之变成灰度图
           ImageAttributes imageAttributes;
           ColorMatrix colorMatrix ={
    	0.299f, 0.299f, 0.299f, 0, 0,
    	0.588f, 0.588f, 0.588f, 0, 0,
    	0.111f, 0.111f, 0.111f, 0, 0,
    	0, 0, 0, 1, 0 ,
    	0, 0, 0, 0, 1
    };
    imageAttributes.SetColorMatrix(
    	&colorMatrix;, 
    	ColorMatrixFlagsDefault,
    	ColorAdjustTypeBitmap);		
    graphics.DrawImage(
    	pImage, 
    	drawRect, 
    	0, 0, 
    	pImage->GetWidth(), 
    	pImage->GetHeight(), 
    	UnitPixel, 
    	&imageAttributes;
    );
           //graphics.DrawImage(pImage, drawRect);	// 绘制图片,如果只要绘制普通的图片只要这句就够了
           // Release HDC
    graphics.ReleaseHDC(pDC->m_hDC);  // 释放设备上下文       

///// 唉,好吧,突然没心情写了,明天再写吧

blog comments powered by Disqus