首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

GDI做的不规则窗体,vcl控件看不见,如何自己画按钮啊

2012-02-24 
GDI做的不规则窗体,vcl控件看不见,怎么自己画按钮啊? - C++ Builder / Windows SDK/API麻烦哪位大大给个例

GDI做的不规则窗体,vcl控件看不见,怎么自己画按钮啊? - C++ Builder / Windows SDK/API
麻烦哪位大大给个例子

窗体是用妖哥的那个 GDI+的例子改的

现在想往上画一些PNG的图当按钮啊~~~~

找以前文章,有人说 一种方法 造一个和Form1同句柄的窗口 然后就可以随便拖放了,说的不是很细,看的不是很明白,求例子。

第2种方法就是用GDI 往上画图 再截取 消息。。。。 同求例子~~~~~~

[解决办法]
关注 以前查过资料 ,使用两个窗体 ,没找到很好的解决方法。
[解决办法]
没有想象中那么复杂,GDI+窗口的WM_PAINT不能用了,如果要想让界面内容有所变化,需要用UpdateLayeredWindow重画。

1.创建一个 PixelFormat = pf32bit 的 TBitmap 储存整个窗口内容,为了支持Alpha通道,必须是32位的位图,所有要显示的东西都储存在这个位图里面,这个位图的内容完全由 GDI+ 处理,不能用普通的API函数。
2.以刚才创建的位图的画布句柄创建GDI+,即 Gdiplus::Graphics g(bmp->Canvas->Handle);
以后就用刚才创建的 g 来绘图了。
3.只要通过 g 修改了 bmp,就要通过 UpdateLayeredWindow 让修改生效,显示出来。
4.如果要放 png 按钮,可以弄两 png 分别作为鼠标移动之上、之外的图片。为了方便,可以放一个假的按钮,只做消息处理的 TPaintBox 之类的,这个控件不做显示用,只处理 MouseEnter、MouseLeave、MouseDown事件,产生这些事件,通过 g 把重画 bmp ,包括刚才的 png 图片,都这样画上去,再 UpdateLayeredWindow 来刷新显示。
5.重画bmp的时候,首先用bmp->Canvas->Bursh->Color=clBlack; bmp->Canvas->FillRect()清除bmp所有的显示,然后所有的内容都通过GDI+来画。UpdateLayeredWindow 刷新显示的时候,不但更新内容,还更新窗口的形状,可以做出桌面小精灵,如同瑞星的小狮子的动画效果来。
[解决办法]
这样的窗口,不能放太复杂的控件,只是png图片,文字等,按钮需要用png图片做(也可以用GDI+画)。
用GDI+显示的内容都没问题,用普通的API函数显示的内容一律无法显示。
把控件的WM_PAINT和WM_ERASEBKGND截获,转移到通过GDI+修改显示内容的bmp,再通过UpdateLayeredWindow 刷新显示,也许可以,没这么实验过。

我试验过 C++ Builder 2010 的 TImage 加载的 png 图片直接就能用,如果只有几张 png 图片,不需要显示其他内容,可以不用 GDI+,直接就能 UpdateLayeredWindow。

热点排行