上帝保佑 - God4

God Bless

  :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
最近开始学习VC,今天突发心情,想弄个像网页里常见的浮动gif动画,想来想去用个笨方法实现了,不管怎么说,在桌面上飘来飘去的图片,足够搏MM一笑了。要是打开两个,就像梁祝双飞蝶。



1.键盘消息屏蔽

我把键盘消息屏蔽了,只留下了一个字符“~”来进行退出操作,个人用途呵呵。

BOOL CRunOnceDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
{
    
if(wParam==WM_DESTROY) //是退出则继续
        return CDialog::OnCommand(wParam, lParam);
    
else //不是退出就滤掉命令返回
        return TRUE;
}


BOOL CRunOnceDlg::PreTranslateMessage(MSG
* pMsg) 
{
    
switch(pMsg->message)
    
{
        
case WM_KEYDOWN:
        
case WM_KEYUP:
        
case WM_DEADCHAR:
        
case WM_SYSKEYDOWN:
        
case WM_SYSKEYUP:
        
case WM_SYSCHAR:
        
case WM_SYSDEADCHAR:
        
case WM_KEYLAST:
            
{
                
//是ESC则过滤之
                if(pMsg->wParam==VK_ESCAPE)
                    
return TRUE;
                
break;
            }

        
case WM_CHAR:
            
{
                
//是“~”则退出
                if(pMsg->wParam=='~')
                    PostQuitMessage(
0);
                
break;
            }

    }


    
return CDialog::PreTranslateMessage(pMsg);
}


void CRunOnceDlg::OnClose() 
{
    
//屏蔽Alt+F4消息
    
//CDialog::OnClose();
}

 

2.对话框浮动

在OnInitDialog()里设置一个定时器SetTimer(2, 20, NULL);

void CRunOnceDlg::OnTimer(UINT nIDEvent) 
{
    
static LONG nImg = 0;

    
switch(nIDEvent)
    
{

        
case 2:
            
{
                
if(rate>dlen) //更新行程
                {
                    dlen 
= rand()%100+100;
                    angle 
+= (rand()%180-90)*PI/180;
                }

                
else //一次行程尚未结束
                {
                    dlen 
-= rate;
                }


                LONG dx 
= LONG(cos(angle)*rate);
                LONG dy 
= LONG(sin(angle)*rate);

                CRect rect;
                GetWindowRect(
&rect);

                
if((rect.left+dx)<0 || (rect.right+dx)>cxfull)
                
//左右出屏
                    angle = PI-angle;
                    dx 
= LONG(cos(angle)*rate);
                    dy 
= LONG(sin(angle)*rate);
                }


                
if((rect.top+dy)<0 || (rect.bottom+dy)>cyfull)
                
//上下出屏
                    angle = -angle;
                    dx 
= LONG(cos(angle)*rate);
                    dy 
= LONG(sin(angle)*rate);
                }


                SetWindowPos(NULL, rect.left
+dx, rect.top+dy, NULL, NULL, SWP_NOSIZE|SWP_NOZORDER);
            }

            
break;
    }


    CDialog::OnTimer(nIDEvent);
}

 

3.CImageList动画

首先要定义一个CImageList,初始化后定时draw,古老的东西。

    ImgList.Create(IMG_WIDTH, IMG_HEIGHT, ILC_COLOR24, 41);
    CBitmap bmp;

    bmp.LoadBitmap(IDB_BITMAP1);
    ImgList.Add(
&bmp, RGB(0,0,0));
    bmp.DeleteObject();

    bmp.LoadBitmap(IDB_BITMAP2);
    ImgList.Add(
&bmp, RGB(0,0,0));
    bmp.DeleteObject();

    bmp.LoadBitmap(IDB_BITMAP3);
    ImgList.Add(
&bmp, RGB(0,0,0));
    bmp.DeleteObject();

    bmp.LoadBitmap(IDB_BITMAP4);
    ImgList.Add(
&bmp, RGB(0,0,0));
    bmp.DeleteObject();

    SetTimer(
1500, NULL);

void CRunOnceDlg::OnTimer(UINT nIDEvent) 
{
    
static LONG nImg = 0;

    
switch(nIDEvent)
    
{
        
case 1:
            
{
                CDC 
* pDC = GetDC();
                ImgList.Draw(pDC, nImg, CPoint(
00), 0);
                ReleaseDC(pDC);

                
if(nImg<3)
                    nImg
++;
                
else
                    nImg
=0;
            }

            
break;

    }


    CDialog::OnTimer(nIDEvent);
}

 

4.对话框的拖动

对话框的样式为无标题栏无边框,拖动的时候采用欺骗系统的方法,让系统以为是按在标题栏上。

UINT CRunOnceDlg::OnNcHitTest(CPoint point) 
{
    CRect rc;
    GetClientRect(
&rc);
    ClientToScreen(
&rc);

    
return rc.PtInRect(point) ? HTCAPTION : CDialog::OnNcHitTest(point);
}

最后再给个源代码的下载,新手交流。
/Files/God4/LoveWorm.rar

posted on 2007-09-29 21:07  God4  阅读(698)  评论(0)    收藏  举报