喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

[北京]代朋友公司招聘PHP高级程序员多名

上一主题 下一主题
     
标题: [闲谈] C++Builder 用GDI+实现半透明渐变的特效窗口  
 
游戏人间
版主
Rank: 7Rank: 7Rank: 7
☞风云山庄大少爷☜


UID 62639
精华 2
积分 14485
帖子 7405
金钱 14338 喜悦币
威望 20
人脉 127
阅读权限 100
注册 2004-12-21
来自 广西人在北京
状态 离线
C++Builder 用GDI+实现半透明渐变的特效窗口



<?php
偶然间甜石榴兄弟给我一个东东,是BlueCrab用VC写的利用GDI
+技术实现半透明渐变窗口的特效,看起来很不错。在此对BlueCrab和甜石榴深表感谢。ccrun(老妖)花了点时间将其在BCB中实现,并实现了简单的动态换肤。效果图:


在C
++Builder中使用GDI+的方法和代码网上遍地都是,这里为了完整性,简单说说流程:

1.
在BCB6中已自带了ghiplus.h文件,故只需要生成gdiplus.lib文件就可以:
    
在命令行下运行implib gdiplus.lib gdiplus.dll。(如果ghiplus.dll不在当前文件夹下,注意写完整路径)

2.在工程的编译选项中加入STRICT条件编译:
    
Project-->Options-->Directories/Conditionals-->Condtionals-->点击旁边的"..."按钮-->输入STRICT,然后Add。

3.
在工程中加入Gdiplus.lib:
    
Project-->Add To Project-->找到Gdiplus.lib添加进来。

4.
在工程的.h文件中包含所需的头文件,注意先后顺序:
    
#include "math.hpp"
    #include <algorithm>
    
using std::min;
    
using std::max;
    
#include "gdiplus.h"
    
using namespace Gdiplus;

完整示例代码在这里下载(查看页面)http://www.ccrun.com/src/v.asp?id=36

.h文件中:
private:    // User declarations
    
ULONG_PTR m_GdiplusToken;
    
Gdiplus::GdiplusStartupInput m_GdiplusStartupInput;
    
int __fastcall SetTransparent(LPWSTR lpSkinFileint nTran);

    
BLENDFUNCTION m_Blend;
    
HDC    m_hdcMemory;
    
Gdiplus::Image *m_Image;

public:        
// User declarations
    
__fastcall TfrmMain(TComponentOwner);
    
__fastcall ~TfrmMain(void);

.
cpp文件中:
//---------------------------------------------------------------------------
// 用GDI+实现半透明渐变的特效窗口
// by ccrun(老妖) - [email]info@ccrun.com[/email]
//---------------------------------------------------------------------------
// Welcome C++Builder Study - [url]http://www.ccrun.com[/url]
//--------------------------------------------------------------------------- 
#include <vcl.h>
#pragma hdrstop
#include "uMain.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;

//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponentOwner)
        : 
TForm(Owner)
{
    
BorderStyle bsNone;
    
// init GDI+
    
GdiplusStartup(&m_GdiplusToken, &m_GdiplusStartupInputNULL);
    
//
    
m_Blend.BlendOp 0;               // the only BlendOp defined in Windows 2000
    
m_Blend.BlendFlags 0;            // nothing else is special ...
    
m_Blend.AlphaFormat 1;           // ...
    
m_Blend.SourceConstantAlpha 255// AC_SRC_ALPHA
    //
    
if(FileExists(ExtractFilePath(ParamStr(0)) + "\test.png"))
        
SetTransparent(WideString("test.png"), 100);
    
// Stay on top
    
SetWindowPos(HandleHWND_TOPMOST0000SWP_NOMOVE SWP_NOSIZE);
}
//---------------------------------------------------------------------------
__fastcall TfrmMain::~TfrmMain(void)
{
    
GdiplusShutdown(m_GdiplusToken); // Close GDI+
}
//---------------------------------------------------------------------------
int __fastcall TfrmMain::SetTransparent(LPWSTR lpSkinFileint nTran)
{
    
// Use GDI+ load image
    
m_Image Gdiplus::Image::FromFile(lpSkinFile);
    
// Change Form size
    
Width m_Image->GetWidth();
    
Height m_Image->GetHeight();
    
// Create Compatible Bitmap
    
HDC hdcTemp GetDC(0);
    
m_hdcMemory CreateCompatibleDC(hdcTemp);
    
HBITMAP hBitMap CreateCompatibleBitmap(hdcTemp,
            
m_Image->GetWidth(), m_Image->GetHeight());
// 本文转自 C++Builder研究 - [url]http://www.ccrun.com/article.asp?i=643&d=n5u8o4[/url]
    
SelectObject(m_hdcMemoryhBitMap);
    
// Alpha Value
    
if (nTran<|| nTran >100)
        
nTran 100;
    
m_Blend.SourceConstantAlpha int(nTran 2.55); // 1~255
    //
    
HDC hdcScreen = ::GetDC(0);
    
RECT rct;
    
GetWindowRect(Handle, &rct);
    
//
    
POINT ptWinPos = {rct.leftrct.top};
    
Gdiplus::Graphics graph(m_hdcMemory);
    
// 63 63 72 75 6E 2E 63 6F 6D
    
graph.DrawImage(m_Image00m_Image->GetWidth(), m_Image->GetHeight());
    
//
    
SIZE sizeWindow = {m_Image->GetWidth(), m_Image->GetHeight()};
    
POINT ptSrc = {00};
    
// Set Window style
    
DWORD dwExStyle GetWindowLong(HandleGWL_EXSTYLE);
    if((
dwExStyle 0x80000) != 0x80000)
        
SetWindowLong(HandleGWL_EXSTYLEdwExStyle 0x80000);
    
// perform the alpha blend
    
BOOL bRet UpdateLayeredWindow(HandlehdcScreen, &ptWinPos,
            &
sizeWindowm_hdcMemory, &ptSrc0, &m_Blend2);
    
//
    
graph.ReleaseHDC(m_hdcMemory);
    
ReleaseDC(0hdcScreen);
    
hdcScreen NULL;

    
ReleaseDC(0hdcTemp);
    
hdcTemp NULL;

    
DeleteObject(hBitMap);

    
DeleteDC(m_hdcMemory);
    
m_hdcMemory NULL;

    
m_Image NULL;
    return 
bRet;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormMouseDown(TObject *Sender,
      
TMouseButton ButtonTShiftState Shiftint Xint Y)
{
    if(
Button == mbLeft)
    {
        
ReleaseCapture();
        
Perform(WM_SYSCOMMANDSC_MOVE HTCAPTION0);
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::miShowAboutClick(TObject *Sender)
{
    
MessageBox(Handle,
            
"在BCB中用GDI+实现半透明渐变的特效窗口rn"
            "-------------------------rn"
            "by ccrun(老妖)rn"
            "Welcome to [url]www.ccrun.com[/url]"
,
            
"GDI+ Window"MB_OK MB_ICONINFORMATION);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::miCloseAppClick(TObject *Sender)
{
    
Close();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::miGoToCcrunClick(TObject *Sender)
{
    
ShellExecute(Handle"Open""http://www.ccrun.com"NULLNULLSW_SHOW);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::miStayOnTopClick(TObject *Sender)
{
    
TMenuItem *mi = (TMenuItem *)Sender;
    
mi->Checked = !mi->Checked;
    
SetWindowPos(Handlemi->CheckedHWND_TOPMOSTHWND_NOTOPMOST,
            
0000SWP_NOMOVE SWP_NOSIZE);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::miChangeSkinClick(TObject *Sender)
{
    
TOpenDialog *dlgOpen = new TOpenDialog(this);
    
dlgOpen->Filter "PNG file(*.png)|*.png";
    if(
dlgOpen->Execute())
    {
        
SetTransparent(WideString(dlgOpen->FileName), 100);
        
Invalidate();
    }
    
delete dlgOpen;
}
?>




 
群号:6025396/6025252/19520091(广西PHP交流/PHP高级编程/算法交流) 寧可在嘗試中失敗,也不在保守中成功! 不為失敗找理由,只為成功找方法! 饿踢Blog
 
2008-3-31 08:45 AM#1
查看资料  访问主页  Blog  发短消息  顶部
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.038268 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP