MFC 中实现窗口淡入淡出、逐步放大显示效果

http://m.blog.csdn.net/blog/woaiwcy/4715336

[原]MFC 中实现窗口淡入淡出、逐步放大显示效果

2009-10-22阅读1444 评论0

MFC 中实现窗口淡入淡出、逐步放大显示效果,主要是利用相关函数+定时器实现

1、  窗口逐步放大显示:

这里要用到CRECT的三个函数InflateRect()、CenterPoint()、SetRect()

SetRect()初始化rect

CenterPoint()返回rect的中心点

InflateRect(wstep,hstep)rect以wstep和hstep步长放大/缩小(步长为负则缩小)。

SetTimer()设置一个定时器

KillTimer()使用结束后销毁该定时器

下面实现对话框中的IDC_STATIC1控件放大效果:

1.       在OnInitalDialog()中添加

GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);//获取对话框中的IDC_STATIC1控件,

    m_w=rect.Width();

    m_h=rect.Height();

    m_stepx=m_w/10;

    m_stepy=m_h/10;

    GetWindowRect(&rect);

    rect.SetRect(rect.CenterPoint(),rect.CenterPoint());

    GetDlgItem(IDC_STATIC1)->SetWindowPos(NULL,rect.left,rect.top,

                         rect.Width(),rect.Height(),SWP_SHOWWINDOW);

    SetTimer(111,300,NULL);//设置一定时器

在OnTimer()中

if(nIDEvent==111)

       {

              if(m_step<5)

              {

                     rect.InflateRect(m_stepx,m_stepy);

                     GetDlgItem(IDC_STATIC1)->SetWindowPos(NULL,rect.left,rect.top,

                            rect.Width(),rect.Height(),SWP_SHOWWINDOW);

                     g_pSetLayeredWindowAttributes(this->m_hWnd, 0, (BYTE)m_tm, 2);

                     ::RedrawWindow(m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

                     m_step++;

                     m_tm=m_step*255/4;//设置当前的透明度值,通过修改该值可以使窗口以不同透明度显示

              }

              else

              {

                     KillTimer(111);

              }

       }

这样就实现了逐步放大显示的效果

2.       对话框淡入的效果

这里使用了Windows2000的API函数SetLayeredWindowAttributes()实现淡入淡出效果,该函数定义如下:

BOOL SetLayeredWindowAttributes(

HWND hwnd, // handle to the layered window 透明窗体的句柄

COLORREF crKey, // specifies the color key 颜色值

BYTE bAlpha, // value for the blend function 透明度,取值范围是[0,255]

DWORD dwFlags // action 透明方式

);

dwFlags可以取两个值:

         当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;

         当取值为LWA_COLORKEY时,bAlpha参数有效,而窗体中的所有颜色为crKey的地方将变为透明。

        LWA_ALPHA = 0x2

        LWA_COLORKEY=0x1

 

  其中dwFlags有LWA_ALPHA(值为2)和LWA_COLORKEY(值为1)两种设置,如果LWA_ALPHA被设置的话,通过bAlpha参数指定窗体的透明度;如果LWA_COLORKEY标志被设置的话,则指定关键色为crKey,该颜色所覆盖的区域将从窗体去除,去除后的区域将不再进行点击检测,其他颜色则正常显示。如果阿尔法混合值设置为0,其窗口区域同样不进行点击检测。

在使用时我们在OnInitalDialog()中添加

m_hUser32= GetModuleHandle(_T("USER32.DLL"));

       g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(m_hUser32, "SetLayeredWindowAttributes");

       if (g_pSetLayeredWindowAttributes == NULL)

              ::PostQuitMessage(0);

       HWND hWnd = GetSafeHwnd();

       LONG lWindowLong = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;

       ::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong);

//关键是下面这两句

       g_pSetLayeredWindowAttributes(hWnd, 0, (BYTE)m_tm, 2);

       ::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

在OnTimer()中添加:

g_pSetLayeredWindowAttributes(this->m_hWnd, 0, (BYTE)m_tm, 2);

                     ::RedrawWindow(m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);//参考上面的程序

注:m_hUser32、g_pSetLayeredWindowAttributes定义为类的成员变量

使用结束后记得调用FreeLibrary()释放对DLL的使用

本程序在DestroyWindow()中释放

if(m_hUser32!=NULL)

              ::FreeLibrary(m_hUser32);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值