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

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();
}
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);
}
ImgList.Create(IMG_WIDTH, IMG_HEIGHT, ILC_COLOR24, 4, 1);
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(1, 500, NULL);
void CRunOnceDlg::OnTimer(UINT nIDEvent)
{
static LONG nImg = 0;

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

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

}

CDialog::OnTimer(nIDEvent);
}
UINT CRunOnceDlg::OnNcHitTest(CPoint point)
{
CRect rc;
GetClientRect(&rc);
ClientToScreen(&rc);

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

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, 4, 1);
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(1, 500, NULL);
void CRunOnceDlg::OnTimer(UINT nIDEvent)
{
static LONG nImg = 0;
switch(nIDEvent)
{
case 1:
{
CDC * pDC = GetDC();
ImgList.Draw(pDC, nImg, CPoint(0, 0), 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
一天一点进步



浙公网安备 33010602011771号