基于VC++ PNG按钮的实现【3】

本文介绍如何在VC6.0环境下利用UpdateLayeredWindow函数从User32.dll动态链接库中调用,实现窗口透明效果,并通过定时器不断刷新窗口样式。文章详细展示了初始化过程及关键代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

// 在此背景区域画蝴蝶扇翅膀的图 , 根据定时器变换图片, FALSETRUE ,来回得变

       bFly?graph.DrawImage(m_pImageClock, points, 3):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值