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

怎么编程显示一个图片和图片的倒影呢?谢谢

2012-03-01 
如何编程显示一个图片和图片的倒影呢?多谢如何编程显示一个图片和图片的倒影呢?多谢[解决办法]越说越邪乎

如何编程显示一个图片和图片的倒影呢?多谢
如何编程显示一个图片和图片的倒影呢?多谢

[解决办法]
越说越邪乎了,GDI很简单的代码就可以实现的效果,没有必要搞那么复杂。话不多说,直接上代码,运行的效果是最好的检验。

C/C++ code
void __fastcall TForm1::Button1Click(TObject *Sender){    // 创建两个位图对象    Graphics::TBitmap *bmpSrc = new Graphics::TBitmap;    Graphics::TBitmap *bmpDst = new Graphics::TBitmap;    try    {        // 从文件中装载位图        bmpSrc->LoadFromFile("C:\\ccrun\\222.bmp");        // 位图的高和宽        int nWidth = bmpSrc->Width;        int nHeight = bmpSrc->Height;        // 源图的边框区域和目标图的边框区域        TRect rctSrc(0, 0, nWidth, nHeight);        TRect rctDst(0, nHeight - 1, nWidth, -1);        // 如果要水平翻转,就将rctDst定义成如下        // TRect rctDst(nWidth - 1, 0, -1, nHeight);        // 目标图的宽和高和源图一致        bmpDst->Width = nWidth;        bmpDst->Height = nHeight;        // 垂直翻转        bmpDst->Canvas->CopyRect(rctDst, bmpSrc->Canvas, rctSrc);        // 将源图绘制在窗体左上方        Canvas->Draw(0, 0, bmpSrc);        // 接着在源图下方绘制出目标图,造成倒影的感觉        Canvas->Draw(0, nHeight, bmpDst);        // 如果是水平翻转,就在源图的右侧绘制出目标图        // Canvas->Draw(nWidth, 0, bmpDst);    }    __finally    {        // 清场        delete bmpSrc;        delete bmpDst;    }}
[解决办法]
趁妖哥不在骗点分,改进版倒影:
C/C++ code
void __fastcall TForm1::Button1Click(TObject *Sender){    // 创建两个位图对象    Graphics::TBitmap *bmpSrc = new Graphics::TBitmap;    Graphics::TBitmap *bmpDst = new Graphics::TBitmap;    try    {        // 从文件中装载位图        bmpSrc->LoadFromFile("C:\\ccrun\\222.bmp");        // 位图的高和宽        int nWidth = bmpSrc->Width;        int nHeight = bmpSrc->Height;        // 源图的边框区域和目标图的边框区域        TRect rctSrc(0, 0, nWidth, nHeight);        TRect rctDst(0, nHeight - 1, nWidth, -1);        // 如果要水平翻转,就将rctDst定义成如下        // TRect rctDst(nWidth - 1, 0, -1, nHeight);        // 目标图的宽和高和源图一致        bmpDst->Width = nWidth;        bmpDst->Height = nHeight;        // 垂直翻转        bmpDst->Canvas->CopyRect(rctDst, bmpSrc->Canvas, rctSrc);        bmpDst->PixelFormat = pf32bit;        // 渐变透明度        for(int y=0; y<nHeight; y++)        {            RGBQUAD* cr = (RGBQUAD*)bmpDst->ScanLine[y];            double alpha = 255.0 - 255.0*y/nHeight;            for(int x=0; x<nWidth; x++)            {                cr[x].rgbReserved = alpha+0.5;                cr[x].rgbBlue *= alpha/255.0;                cr[x].rgbRed *= alpha/255.0;                cr[x].rgbGreen *= alpha/255.0;            }        }        // 将源图绘制在窗体左上方        Canvas->Draw(0, 0, bmpSrc);        // 接着在源图下方绘制出目标图,造成倒影的感觉        BLENDFUNCTION blendfunc={            AC_SRC_OVER,            0,            255,            AC_SRC_ALPHA        };        ::AlphaBlend(Canvas->Handle,            0, nHeight, nWidth, nHeight,            bmpDst->Canvas->Handle,            0,0,nWidth,nHeight,            blendfunc            );    }    __finally    {        // 清场        delete bmpSrc;        delete bmpDst;    }} 

热点排行