| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2906 人关注过本帖
标题:如何显示多幅BMP图,并实现前后切换
只看楼主 加入收藏
daisylin
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2009-8-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
如何显示多幅BMP图,并实现前后切换
要做写一个程序要实现多幅BMP图像的读取,并实现前后图像的切换,不知道从何下手,请高手指点
搜索更多相关主题的帖子: BMP 
2010-04-12 21:39
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:10 
做个层级管理,思想就是根据需要对数组做排序,数组中的元素是要绘制的图元,绘制顺序按数组下标来。
2010-04-12 22:17
daisylin
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2009-8-14
收藏
得分:0 
回复 2楼 debroa723
类型定义:
typedef vector<CDib*> DibArrays;
typedef vector<CDib*>::iterator Iterator;
在文档类中定义多文件的读取函数以及返回成员变量的函数:
成员变量:
    Iterator m_iter;
    DibArrays m_DibArrays;
void CLesson3Doc::OnFileOpen()
{
    // TODO: Add your command handler code here
    CFileDialog MyDlg(TRUE,"*.bmp",NULL,OFN_ALLOWMULTISELECT | OFN_ENABLESIZING,NULL,NULL);
    if (MyDlg.DoModal() == IDOK)
    {
        POSITION pos = MyDlg.GetStartPosition();  //获得列表中第一个文件名的位置
        while (pos!=0)
        {
            CString FileName= MyDlg.GetNextPathName(pos); //获得选中的下一个文件名
            CDib* pDib = new CDib;
            pDib->LoadFile(FileName);
            m_DibArrays.push_back(pDib);
            m_iter = m_DibArrays.end()-1;
        }
        m_index = (int)m_DibArrays.size();
        UpdateAllViews(NULL);

    }
}

Iterator CLesson3Doc::GetIterator()
{
    return m_iter;
}

DibArrays CLesson3Doc::GetDibArrays()
{
    return m_DibArrays;
}

在视图类的Draw函数定义如下:
void CLesson3View::OnDraw(CDC* pDC)
{
    CLesson3Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here


    Iterator iter = pDoc->GetIterator();
    if (iter!=NULL)
    {
        (*iter)->Draw(pDC);
        // Invalidate();
    }
}
前一幅图按键和后一幅图按键的命令响应函数定义为:
void CLesson3View::OnPrev()
{
    // TODO: Add your command handler code here
    CLesson3Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
   
    Iterator iter = pDoc->GetIterator();
    DibArrays vDibArrays = pDoc->GetDibArrays();
    if (iter!=NULL)
    {
        iter--;
        if (iter<vDibArrays.begin())
        {
            iter++;
        }
        Invalidate();
    }
}

void CLesson3View::OnNext()
{
    // TODO: Add your command handler code here
    CLesson3Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    Iterator iter = pDoc->GetIterator();
    DibArrays vDibArrays = pDoc->GetDibArrays();
    if (iter!=NULL)
    {
        iter++;
        if (iter==vDibArrays.end())
        {
            iter--;
        }
        pDoc->UpdateAllViews(NULL);
    }
   
}

这样表述有问题吗?
编译没有错误,选择多幅图像能显示出最后一幅图像,但是前一幅图按键没有响应,是怎么回事呢?
谢谢指点
2010-04-14 09:55
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:10 
截获鼠标点击事件,得到点击点的坐标,用该点和图片做检测(坐标点和图片矩形的碰撞检测),获得第一个点中图片,将该图片在容器的位置提到最后面,这就是点选排序,这时再绘制图片的时候,被点中的图片就在最上面了(绘制的顺序是容器的正向顺序)。然后再去点按钮。
还可以截获到鼠标移动事件,可以实现移动图片的功能。
"但是前一幅图按键没有响应,是怎么回事呢?"这个问题由于代码不全,不知道原因!可能就是因为被上面的图片覆盖的原因吧。
2010-04-14 20:47
daisylin
Rank: 2
等 级:论坛游民
帖 子:33
专家分:26
注 册:2009-8-14
收藏
得分:0 
回复 4楼 debroa723
Lesson3.rar (41.78 KB)

附件中是我写的代码,能不能帮我看一下到底是哪里出错了?
2010-04-14 20:57
sworder1
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-5-9
收藏
得分:0 
回复 楼主 daisylin
我最近也在搞这
2010-05-09 20:59
快速回复:如何显示多幅BMP图,并实现前后切换
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013213 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved