我在学<<MFC Windows 程序设计>> 有很多地方不懂
该怎么学呢 大家有什么好的建议比如书上说SetTimer()不能精确控制时间
而多媒体计时器可以,书上却没说怎么用多媒体计时器
有谁知道可以告诉我么还有回调函数 为什么他能作为参数传递给别的函数呢
谁能给我讲讲回调函数到底是怎么回事
CMemoryFile
还有文件读取
书上是用下面方式读的
CFile *pFile = ar.GetFile();
m_length = (UINT)pFile->GetLength();
m_pData = new BYTE[m_length]; //BYTE * m_pData;
pFile->Read(m_pData,m_length);
书上说分配一个与文件一样大小的内存空间不是很好
那样文件会一下子都装入内存
可以用什么内存映射法。。来优化
却又没说具体怎么做
麻烦大家也给我介绍一下比new BYTE[m_length]更好的方法还有就是CFile的派生类中有个CMemoryFile的类
好象是CMemoryFile,能将内存读取简化为文件方式的读取
请问怎么用这两个类(除了CMemoryFile还有一个,我记不起来了)还有就是图象文件 是怎么把一幅图保存为文件的
是不是将图象按每个象素的颜色值保存下来的
如果一个图象有一百个象素 那就将这一百个象素的颜色值都逐个保存下来
而且保存下来之后 文件中的数据是什么样子的呢
除了保存一百个象素的颜色值 还要保存一些其他的什么信息呢
而且那些颜色值在文件中是什么样子的 是数字吗 那又怎么读呢我实在太笨了 谁能告诉我 我一定非常感谢
该怎么学呢 大家有什么好的建议比如书上说SetTimer()不能精确控制时间
而多媒体计时器可以,书上却没说怎么用多媒体计时器
有谁知道可以告诉我么还有回调函数 为什么他能作为参数传递给别的函数呢
谁能给我讲讲回调函数到底是怎么回事
CMemoryFile
还有文件读取
书上是用下面方式读的
CFile *pFile = ar.GetFile();
m_length = (UINT)pFile->GetLength();
m_pData = new BYTE[m_length]; //BYTE * m_pData;
pFile->Read(m_pData,m_length);
书上说分配一个与文件一样大小的内存空间不是很好
那样文件会一下子都装入内存
可以用什么内存映射法。。来优化
却又没说具体怎么做
麻烦大家也给我介绍一下比new BYTE[m_length]更好的方法还有就是CFile的派生类中有个CMemoryFile的类
好象是CMemoryFile,能将内存读取简化为文件方式的读取
请问怎么用这两个类(除了CMemoryFile还有一个,我记不起来了)还有就是图象文件 是怎么把一幅图保存为文件的
是不是将图象按每个象素的颜色值保存下来的
如果一个图象有一百个象素 那就将这一百个象素的颜色值都逐个保存下来
而且保存下来之后 文件中的数据是什么样子的呢
除了保存一百个象素的颜色值 还要保存一些其他的什么信息呢
而且那些颜色值在文件中是什么样子的 是数字吗 那又怎么读呢我实在太笨了 谁能告诉我 我一定非常感谢
解决方案 »
- inno Setup 卸载前关闭进程
- 对串口发送数据与接收数据的控制
- 用一条SQL语句来求某字段的和????????????
- 求教一个串口问题
- 请问C++中宣称与定义有何不同?
- 如何修改已有工程的名称 -白赚地
- 在vc中用dao连接数据库,如何用word格式打印报表
- 怎样将Imail 的SMTP服务器配置成ESMTP服务器?
- 菜鸟向大家请教:当鼠标移到对话框上时如何显示一信息,类似于托盘
- 我什么都不会,请问函数间传递一串数据,如果不用字符串,还能用什么?
- 如何在工程A和工程B之间通过共享内存来共享数据,看到很多例子,都是在一个工程内(急).
- 正在做备份工具-有没有办法加快枚举目录、枚举文件的速度?
SetTimer的精确度大概40毫秒左右回调函数是这样一个函数,由你编写,在某个时候,你调用操作系统或第三方提供的函数时,做为参数传给你调用的函数(你填写的是函数名,实际传的是函数地址),被你调用的函数在执行是,会调用你做为参数提供的函数,所以叫回调。一般,回调函数的参数都是约定好的。文件读取
在读取大的文件的时候,如果将文件一下子全部读入内存,将会占用很大的内存空间,这将影响性能。内存映射文件的相关知识,你有兴趣可以参考一下别的资料。我给你一个文图文件(BMP)结构的说明,你看看另外:推荐楼主看《Windows核心编程》
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。 1.2 BMP文件头
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:
typedef struct tagBITMAPFILEHEADER
{
WORDbfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORDbfReserved1; // 位图文件保留字,必须为0
WORDbfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图
// 文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;1.3位图信息头
BMP位图信息头数据用于说明位图的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本结构所占用字节数
LONGbiWidth; // 位图的宽度,以像素为单位
LONGbiHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount// 每个像素所需的位数,必须是1(双色),
// 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),
// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位
LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数
LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;1.4颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD {
BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
BYTErgbGreen; // 绿色的亮度(值范围为0-255)
BYTErgbRed; // 红色的亮度(值范围为0-255)
BYTErgbReserved;// 保留,必须为0
} RGBQUAD;
颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
当biBitCount=1,4,8时,分别有2,16,256个表项;
当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
} BITMAPINFO;1.5位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数: 当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节;
Windows规定一个扫描行所占的字节数必须是
4的倍数(即以long为单位),不足的以0填充,
一个扫描行所占的字节数计算方法:
DataSizePerLine= (biWidth* biBitCount+31)/8;
// 一个扫描行所占的字节数
DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍数
位图数据的大小(不压缩情况下):
DataSize= DataSizePerLine* biHeight;
#include <mmsystem.h>
DWORD curtime=timeGetTime();
其实如果你要更精确的计时,可以使用QuerySystemPerformance之类的2 这个问题我没必要多说了,今天论坛上讨论的正火呢
具体你可以查看SetTimer 的MSDN。
SetTimer可以将一个回调函数作为参数。
至于问为什么可以,那我也不知道。
你看函数指针还能作为参数传递呢。3 没接触过4 图像有很多种,你问的估计是未经过压缩的位图(BMP)
真彩色BMP需要36H 个字节的文件头,接下来就是数据了
每个象素3个字节(分别记录RGB信息,所以每个R或者G或者B都是1个字节,即8位)