MFC屏保图片浏览增加下雪效果问题,请教(急) 基础MFC的屏保程序一个图片在窗口滑行浏览,要在上面做一些特效,比如下雪,是不是要设两个定时器,怎样设, 我大体做完了,但在运行时却出现了逻辑错误(我用的一个定时器),想了好久,很是郁闷 给一些建议或方法,谢谢,很急 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 设置两个定时器是可以的!定时器设置CWnd::SetTimer的时候第一个参数就是你设置的定时器的!你可以两个定时器用不同的时间!根据具体的定时器,来做不同的事!OnTimer(UINT nIDEvent),用nIDEvent来判断具体是那个定时器! 可以设置两个定时,使用SetTimer()函数的时候,设置不同的定时器的ID在OnTimer()函数中通过nIDEvent判断定时器,来处理事件即可如SetTimer(1,500,NULL);SetTimer(2,1000,NULL);void CXXXDlg::OnTimer(UINT nIDEvent) {switch(nIDEvent){case 1:do something;break;case 2:do something;break;}} 显示雪花的话,可以使用CPoint 对象数组,如CPoint m_Point[256];然后使用rand()函数随机产生这么点,可以控制不要产生相同的点在这些点处使用BitBlt()函数贴图(雪花),向下的话使这些点纵坐标递增,这些数据在OnTimer()事件中,改变。并更新视图。 不要太难,就对固定的几张图,我也是将图放入内存在显示的,可是只能分配一次内存,载入一张,多的话运行出错,void CMyscreenDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1)/2 ; int y = (rect.Height() - cyIcon + 1)/2 ; dc.DrawIcon(x, y, m_hIcon); } else { CPaintDC dc(this); w_pdcmem = new CDC; w_bitmap.LoadBitmap(IDB_BITMAP1); w_pdcmem->CreateCompatibleDC(&dc); w_pdcmem->SelectObject(&w_bitmap); w_showX = 0; sndPlaySound( "music.wav" , SND_ASYNC | SND_LOOP ); SetTimer(1,1,NULL); CDialog::OnPaint(); }}void CMyscreenDlg::DrawBitmap(){ CClientDC dc(this); CDC dcmem; CBitmap bitmap; bitmap.CreateCompatibleBitmap(&dc,s_showW,s_showH); dcmem.CreateCompatibleDC(&dc); dcmem.SelectObject(&bitmap); dcmem.SetBkMode(0); dcmem.FillRect(&CRect(0,0,s_showW,s_showH), &CBrush(RGB(0,0,255)) ); UINT y =0; dcmem.StretchBlt( 0,y,s_showW,s_showH, w_pdcmem, w_showX,0,s_showW,s_showH, SRCCOPY); dc.BitBlt(20,0,s_showW,s_showH,&dcmem,0,0,MERGECOPY);}两个图片显示的函数,希望你给出可以载入多张图的改正代码或方法,谢谢 谢谢,如果单独实现的雪花的话还好,不过要和图片流动配合起来,两个效果都需要做rect,在填充RECT时,两个有冲突,能说点详细点吗?我是初学者 呃,有两个个地方首先要改一下!第一,SetTimer不能放到OnPaint里面,应该放到CDilaog::OnInitUpdate()里面!第二,CreateCompatibleBitmap创建的,用完后要删除,DeleteObject(); CreateCompatibleDC 对应的是DeleteDC(); 设备环境改变后,用后要记得还原: CBitmap *pold = dcmem.SelectObject(&bitmap); int oldmode = dcmem.SetBkMode(0); .............dcmem.SelectObject(pold);dcmem.SetBkMode(oldmode ); 另外,DrawBitmap()在那儿调用的?我看到在这个函数里面,将IDB_BITMAP1贴在一个蓝色的方块上面!然后一起贴出!其他图片呢? http://topic.csdn.net/u/20090804/17/f7f21cc3-a89f-4913-bdfd-7a1c64d31af7.html?15462 哈哈,一切OK啦,如我所愿,屏保非常漂亮。有时间在做能载入JPG和MP3的功能。谢谢你的指点。 传我邮箱吧 我学习下 我也是初学者 [email protected] LZ能否把源代码发给我学习学习下 我邮箱是[email protected] 小弟在此谢过·~~~ 可否参考学习一下:[email protected] 谢谢 救命啊!大虾们,怎样在同一个窗口上同时显示多个进程的界面?(请看内容)谢谢!俺是菜菜! 自定义消息 消息映射出错 多文档的菜单修改问提 FindWindow!!!各位看看! C++静态数据成员感悟 什么是直接通过ODBC读写Excel表格文件??? 寻好的主页空间,有谁知道啊! 关于CEdit中超链接? 请问如何只读打开别的进程独占打开的文件? 一个巨蠢的问题,在字符串中如何保留"号 关于CFile::Read()函数 急求大家帮忙webbrowser怎么选择网页中的select元素并触发change事件,分不够再加
OnTimer(UINT nIDEvent),用nIDEvent来判断具体是那个定时器!
在OnTimer()函数中通过nIDEvent判断定时器,来处理事件即可如
SetTimer(1,500,NULL);
SetTimer(2,1000,NULL);void CXXXDlg::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case 1:do something;break;
case 2:do something;break;
}
}
然后使用rand()函数随机产生这么点,可以控制不要产生相同的点
在这些点处使用BitBlt()函数贴图(雪花),向下的话使这些点
纵坐标递增,这些数据在OnTimer()事件中,改变。并更新视图。
void CMyscreenDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1)/2 ;
int y = (rect.Height() - cyIcon + 1)/2 ;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
w_pdcmem = new CDC;
w_bitmap.LoadBitmap(IDB_BITMAP1);
w_pdcmem->CreateCompatibleDC(&dc);
w_pdcmem->SelectObject(&w_bitmap);
w_showX = 0;
sndPlaySound( "music.wav" , SND_ASYNC | SND_LOOP );
SetTimer(1,1,NULL);
CDialog::OnPaint();
}
}
void CMyscreenDlg::DrawBitmap()
{ CClientDC dc(this);
CDC dcmem;
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,s_showW,s_showH);
dcmem.CreateCompatibleDC(&dc);
dcmem.SelectObject(&bitmap);
dcmem.SetBkMode(0);
dcmem.FillRect(&CRect(0,0,s_showW,s_showH),
&CBrush(RGB(0,0,255))
);
UINT y =0;
dcmem.StretchBlt(
0,y,s_showW,s_showH,
w_pdcmem,
w_showX,0,s_showW,s_showH,
SRCCOPY);
dc.BitBlt(20,0,s_showW,s_showH,&dcmem,0,0,MERGECOPY);
}
两个图片显示的函数,希望你给出可以载入多张图的改正代码或方法,谢谢
第二,CreateCompatibleBitmap创建的,用完后要删除,DeleteObject();
CreateCompatibleDC 对应的是DeleteDC();
设备环境改变后,用后要记得还原:
CBitmap *pold = dcmem.SelectObject(&bitmap);
int oldmode = dcmem.SetBkMode(0);
.............
dcmem.SelectObject(pold);
dcmem.SetBkMode(oldmode );
另外,DrawBitmap()在那儿调用的?我看到在这个函数里面,将IDB_BITMAP1贴在一个蓝色的方块上面!然后一起贴出!其他图片呢?