WEB开发网
开发学院软件开发VC 在VC6.0中用GDI+调用png图片实现半透明渐变的特效... 阅读

在VC6.0中用GDI+调用png图片实现半透明渐变的特效窗口

 2007-03-17 21:58:56 来源:WEB开发网   
核心提示: 2、在GDIPClockDlg.h中定义所有类成员变量,包括所有图片的指针和图片的长宽尺寸信息,在VC6.0中用GDI+调用png图片实现半透明渐变的特效窗口(2), Image *m_pImageClock; Image *m_pImageClock1; Image *m_pImageH

2、在GDIPClockDlg.h中定义所有类成员变量,包括所有图片的指针和图片的长宽尺寸信息。

    Image *m_pImageClock;
    Image *m_pImageClock1;
    Image *m_pImageHHour;
    Image *m_pImageHMinu;
    Image *m_pImageHSec;
    Image *m_pImageNum;
    int m_BakWidth , m_BakHeight ;
    int m_HourWidth, m_HourHeight;
    int m_MinuWidth , m_MinuHeight;
    int m_SecWidth , m_SecHeight ;
    HINSTANCE hFuncInst ;
    Typedef BOOL (WINAPI*MYFUNC)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,
COLORREF,BLENDFUNCTION*,DWORD);     
    MYFUNC UpdateLayeredWindow;
  在这一步中需要特别说明的是,在创建透明窗口式需要调用一个Windows API函数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.BlendOp=0; //theonlyBlendOpdefinedinWindows2000
    m_Blend.BlendFlags=0; //nothingelseisspecial...
    m_Blend.AlphaFormat=1; //...
    m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA
   
  // png图片添加到资源中了在"PNG"下:所以这里可以从资源中调用,
  // 这里Image没有提供字节调用资源中图像的函数,
  // ImageFromIDResource()是通过资源名称"PNG"和资源ID号将图像
  // 的Image指针传递给指针应用。来完成的。
  
  ImageFromIDResource(IDR_PNGBAK1,"PNG",m_pImageClock1);
  ImageFromIDResource(IDR_PNGNUM,"PNG",m_pImageNum);
  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;
}
4.在OnInitDialog()种添加如下代码对调用透明窗体初始化和设置时钟进行刷新,代码意义有注解://启动后立刻更新窗口样式为透明窗体
    UpdateClockDisplay();
    SetTimer(1,500,NULL);
//去除任务栏窗口对应按钮
    ModifyStyleEx (WS_EX_APPWINDOW,WS_EX_TOOLWINDOW );
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+中图像变换矩阵的使用初步研究。

Tags:VC 中用 GDI

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接