一、需求分析
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++实现双缓冲