汗死,写了2次怎么都没有了。。。。
上次记录的是mfc如何将一个矩形图像中的非白色区域影藏,即只显示非白色区域的图像,而让图片中的白色区域显示为原界面的背景色。
结果不知道怎么就丢失了。。。。
现在没太多时间,先写今天看的内容。
内容为:
如何让这个不规则的图像的消息响应区域也是不规则图像的区域。
其实也就是说,当你重绘button时,然后调用getdc()这样得到的dc(device context)就是那个不规则的图像区域,而非矩形。
也可以说button的window窗口的大小就是你看到的不规则图像的大小,而不是矩形。
要解决这个问题,首先先了解一下这些内容:
1:windows中所有的绘制都是矩形绘制的。所以要绘制一个不规则的图像,就要将它看成一个由N个小矩形拼成的图像。比如可以看成高的象素为1px的小矩形。
2:如何去切小矩形呢,方法是:扫描图像,当第1次碰到白色图像时记录下纵坐标(a),继续扫描,当一行到头或者再次碰到白色象素的时候记录下纵坐标-1(b)的值,这样a 到b的就是矩形的长度,宽度自然可以设置为1,这样才不失真。
然后当你切完所有矩形时,将所有矩形combine一下就得到一个新的window响应区域了。
这里要说到几个函数及结构体:
RGNDATAHEADER,
typedef struct _RGNDATAHEADER {
DWORD dwSize; //sizeof(RGNDATAHEADER)
DWORD iType; //这里必须为RDH_RECTANGLES
DWORD nCount; //这里是说明被切成多少个矩形,也就是说后面跟着多少个rect
DWORD nRgnSize;
RECT rcBound; //矩形数据,其后可能还有很多矩形
} RGNDATAHEADER;
CreateRectRgn
CombineRgn
初始创建个0的rect,然后每次combine上其他rect,这样就OK了。
因为一开始不知道切成多少个rect,所以这里需要动态开辟空间,同时通过偏移指针将指针指向rect的数组开始处。