基础MFC的屏保程序
一个图片在窗口滑行浏览,要在上面做一些特效,比如下雪,是不是要设两个定时器,怎样设,
  我大体做完了,但在运行时却出现了逻辑错误(我用的一个定时器),想了好久,很是郁闷
 给一些建议或方法,谢谢,很急

解决方案 »

  1.   

    设置两个定时器是可以的!定时器设置CWnd::SetTimer的时候第一个参数就是你设置的定时器的!你可以两个定时器用不同的时间!根据具体的定时器,来做不同的事!
    OnTimer(UINT nIDEvent),用nIDEvent来判断具体是那个定时器!
      

  2.   

    可以设置两个定时,使用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;
    }
    }
      

  3.   

    显示雪花的话,可以使用CPoint 对象数组,如CPoint m_Point[256];
    然后使用rand()函数随机产生这么点,可以控制不要产生相同的点
    在这些点处使用BitBlt()函数贴图(雪花),向下的话使这些点
    纵坐标递增,这些数据在OnTimer()事件中,改变。并更新视图。
      

  4.   

    不要太难,就对固定的几张图,我也是将图放入内存在显示的,可是只能分配一次内存,载入一张,多的话运行出错,
    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);
    }
    两个图片显示的函数,希望你给出可以载入多张图的改正代码或方法,谢谢
      

  5.   

    谢谢,如果单独实现的雪花的话还好,不过要和图片流动配合起来,两个效果都需要做rect,在填充RECT时,两个有冲突,能说点详细点吗?我是初学者
      

  6.   

    呃,有两个个地方首先要改一下!第一,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贴在一个蓝色的方块上面!然后一起贴出!其他图片呢?
      

  7.   

    http://topic.csdn.net/u/20090804/17/f7f21cc3-a89f-4913-bdfd-7a1c64d31af7.html?15462
      

  8.   

    哈哈,一切OK啦,如我所愿,屏保非常漂亮。有时间在做能载入JPG和MP3的功能。谢谢你的指点。
      

  9.   

    传我邮箱吧   我学习下   我也是初学者   [email protected]
      

  10.   

    LZ能否把源代码发给我学习学习下    我邮箱是[email protected]   小弟在此谢过·~~~
      

  11.   

    可否参考学习一下:[email protected] 谢谢