MFC界面开发笔记

来源:互联网 发布:如何优化虚拟内存 编辑:程序博客网 时间:2024/05/01 16:50

 汗死,写了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的数组开始处。

原创粉丝点击