UpdateLayeredWindow (),该函数在 .net 以上的版本的 SDK 中有申明,但是在 VC6.0 下要调用要么下载 200 多兆的高版本 SDK ,要么从动态链接库 “User32.dll” 中调用,这里选择从 “User32.dll” 中调用。以上定义中后三项就是为此作准备的。
3 、在对话框的 OnCreate ()中添加如下代码:对 2 的函数和成员变量进行初始化!(其中 ImageFromIDResource ()函数为从资源中载入 Png 图像的一个方法!)
int CGDIPClockDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) ==-1)
return -1;
hFuncInst = LoadLibrary("User32.DLL");
BOOL bRet=FALSE;
if(hFuncInst)
UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow");
else
{
AfxMessageBox("User32.dll ERROR!");
exit(0);
}
// 初始化 gdiplus 的环境
// Initialize GDI+.
//m_Blend 是结构体 BLENDFUNCTION 的对象,用于指定两个 DC( 画图设备 ) 的融合方式。
m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000 仅仅融合在 WINDOUWS2000 平台下定义
m_Blend.BlendFlags=0; //nothingelseisspecial...
m_Blend.AlphaFormat=1; //... 透明度
m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA
ImageFromIDResource(IDR_PNGNUM,"PNG",m_pImageNum);// 从资源类加载 ID 号
ImageFromIDResource(IDR_PNGBAK1,"PNG",m_pImageClock1);
ImageFromIDResource(IDR_PNGBAK,"PNG",m_pImageClock);
ImageFromIDResource(IDR_PNGHOUR,"PNG",m_pImageHHour);
ImageFromIDResource(IDR_PNGMIN,"PNG",m_pImageHMinu);
ImageFromIDResource(IDR_PNGSEC,"PNG",m_pImageHSec);
m_BakWidth =m_pImageClock->GetWidth();
m_BakHeight =m_pImageClock->GetHeight();
m_HourWidth =m_pImageHHour->GetWidth();
m_HourHeight=m_pImageHHour->GetHeight();
m_MinuWidth =m_pImageHMinu->GetWidth();
m_MinuHeight=m_pImageHMinu->GetHeight();
m_SecWidth =m_pImageHSec->GetWidth();
m_SecHeight =m_pImageHSec->GetHeight();
::SetWindowPos(m_hWnd, HWND_TOPMOST,0,0,m_BakWidth,m_BakHeight,SWP_NOSIZE|SWP_NOMOVE);
return 0;
/ 启动后立刻更新窗口样式为透明窗体
UpdateClockDisplay();
SetTimer(1,500,NULL);
// 去除任务栏窗口对应按钮
ModifyStyleEx (WS_EX_APPWINDOW,WS_EX_TOOLWINDOW );
4 、 在 OnInitDialog ()种添加如下代码对调用透明窗体初始化和设置时钟进行刷新,代码意义有注解:
void CGDIPClockDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
UpdateClockDisplay();
CDialog::OnTimer(nIDEvent);
}
5 、 透明窗体创建于刷新,均调用以下函数完成,函数的参数表示整个窗体的透明度在该函数中包括了 GDI+ 中对 Image.DrawImage() 函数的集中重载方式的使用,还有在 GDI+ 中图像变换矩阵的使用初步研究。
BOOL CGDIPClockDlg::UpdateClockDisplay(int Transparent)// 该函数被定时器每一秒触发次
{
// 创建画图设备环境
HDC hdcTemp=GetDC()->m_hDC;
m_hdcMemory=CreateCompatibleDC(hdcTemp);
HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,m_BakWidth,m_BakHeight);
SelectObject(m_hdcMemory,hBitMap);
// 确定透明度
if(Transparent<0||Transparent>100) Transparent=100;
m_Blend.SourceConstantAlpha=int(Transparent*2.55);//1~255
HDC hdcScreen=::GetDC (m_hWnd);
RECT rct;
// 得到窗体的区域
GetWindowRect(&rct);
POINT ptWinPos={rct.left,rct.top};
Graphics graph(m_hdcMemory);
// 确定画的背景区域
Point points[] = {
Point(0, 0),
Point(m_BakWidth, 0),
Point(0, m_BakHeight)
};
static bool bFly=false;
// 在此背景区域画蝴蝶扇翅膀的图 , 根据定时器变换图片, FALSE 变 TRUE ,来回得变
bFly?graph.DrawImage(m_pImageClock, points, 3):