VC++学习笔记----MFC 图像浏览器 --制作流程

一、需求分析

1、扫描指定目录下所有文件
2、显示图片
3、切换图片
4、改变图片大小:原图,高度适应,宽度适应

二、基本知识:

2.0注意

1、L和_T()能够解决字符的问题。VS2013下字符集为UNICODE。

2.1 CFileFind类

文件类,类似于Java中File类。
本文中可能会用到的方法:

查找操作
      ::FindFile();//查找文件
      ::FindNextFile();//是否还存在下一个文件
::GetFileName();//文件名
::GetRoot();
      ::GetFilePath();//文件路径
      ::GetLength();//文件长度

判断文件属性
      ::IsDirectory();//是否是目录

2.2 GDI+

2.3 MFC中的DC,CDC和HDC
我觉得这个播客说的很清楚,就不说了
MFC中的DC,CDC和HDC

2.4 CString
//和Java中String的操作有很多相似的地方

一、查找:
    Left(int);//从左取字串
    Right(int);//从右取字串
    ReverseFind(_T"");//从后向前查找第一个匹配,找到时返回下标。没找到时返回-1
二、字符变换
    MakeLower();//su所有字符小写

2.5CStringArray

m_FilesNameAry[nIndex] //获取第nIndex数
Add //在数组的末尾添加一个元素;可根据需要增长数组
Append //向数组中添加另一个数组;如果必要的话可增长数组
插入/删除
InsertAt //在指定索引处插入一个元素(或者是另一个数组中的所有元素)
RemoveAt // 删除指定索引处的一个元素
RemoveAll() //清空数组

2.6 CStringList

RemoveAll   删除此列表中的所有元素

GetHeadPosition
返回列表中的头部元素的位置
GetTailPosition 返回列表中尾部元素的位置
GetNext 获取用于重复的下一个元素
GetPrev 获取用于重复的前一个元素

2.7 CScrollView

 SetScrollSizes(MM_TEXT, sizeTotal); 

三、代码实现

1、清空偏移量:置0;
2、把图像数据加载到内存中,把地址给 成员变量
3、获取图像的偏移量:图像和客户区大小关系
4、刷新客户区

3.1 文件操作

第一种方式:
不兼容.BMP; 识别.bmp

    CString filesPath = path + L"\\*.bmp";

第二种方式:
兼容BMP,bmp

    fileFind.GetFileName().Right(3).MakeLower()="bmp"

查找方式


GetAllFileNames(const CString& path, CStringArray& ary)
{
    ary.RemoveAll();
    CFileFind fileFind;
    //添加选择模块,第一种方式的话,把L"\\*.bmp";
    CString filesPath = path + L"\\*.*";
    if (fileFind.FindFile(filesPath))
    {
        CString strPicPath;
        // 如果该目录还有文件
        while (fileFind.FindNextFile())
        {
        //添加选择模块,第二钟方式
            ary.Add( fileFind.GetFileName());
        }
        //添加选择模块,第二钟方式
        ary.Add(fileFind.GetFileName());
    }
    //关闭查找
    fileFind.Close();
}
3.2 GDI+

1、添加头文件,引用GDI+

#include <gdiplus.h>
using namespace Gdiplus;

2、初始化和析构
在对应文件的头文件里

    GdiplusStartupInput m_GdiplusStartupInput;
    ULONG_PTR           m_GdiplusToken;

构造函数或者初始化函数里:

    // GDI+图像库初始化 
    GdiplusStartup(&m_GdiplusToken, &m_GdiplusStartupInput, NULL);

析构或者退出函数:

    // 关闭GDI+图像库
    GdiplusShutdown(m_GdiplusToken);

3、使用的函数

//绘图
 graph.DrawImage(&image, x, y, width, height); //绘制图像。自动缩放图像,根据长和宽
   //加载图像到m_pBitmap 
    m_pBitmap = ::new Bitmap(image.GetWidth(), image.GetHeight(), PixelFormat32bppARGB);
    Graphics* graph = Graphics::FromImage(m_pBitmap);
    graph->DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight());
3.3主函数

采取双缓冲显示

    CRect rect;
    GetClientRect(rect);

    CPoint pt = GetScrollPosition();//获取起始位置
    rect.OffsetRect(pt);

    CDC memDC;
    CBitmap MemBitmap;

    // 设备描述表初始化
    memDC.CreateCompatibleDC(NULL);

    // 建立与屏幕显示兼容的内存显示设备
    MemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());

    // 选取空白位图
    memDC.SelectObject(MemBitmap);
    memDC.FillSolidRect(rect, RGB(255, 255, 255));

    if (m_nPos >= 0)
        ShowPicture(&memDC, *m_pBitmap, m_nShowType);

    pDC->BitBlt(pt.x, pt.y, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

    MemBitmap.DeleteObject();
    memDC.DeleteDC();
3.5 窗口抖动问题
    BOOL C***View::OnEraseBkgnd(CDC* pDC)
    {
     return TRUE;
    }
3.6 滚轮问题

每次客户区改变的时候,客户区都会刷新,比如改变滚动条,或者改变客户区大小

OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
nPos滚轮所在的位置

参考:
1、MFC-给窗口添加滚动条
2、CScrollBar 滚动条操作
3、CString 用法大全
4、CScrollView双缓冲绘图
5、使用CScrollView创建滚动条
6、C++实现双缓冲

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值