我在学<<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还有一个,我记不起来了)还有就是图象文件 是怎么把一幅图保存为文件的
是不是将图象按每个象素的颜色值保存下来的
如果一个图象有一百个象素 那就将这一百个象素的颜色值都逐个保存下来
而且保存下来之后 文件中的数据是什么样子的呢
除了保存一百个象素的颜色值 还要保存一些其他的什么信息呢
而且那些颜色值在文件中是什么样子的 是数字吗 那又怎么读呢我实在太笨了 谁能告诉我 我一定非常感谢

解决方案 »

  1.   

    简单说几句多媒体计时器没有用过,网上应该有资料的
    SetTimer的精确度大概40毫秒左右回调函数是这样一个函数,由你编写,在某个时候,你调用操作系统或第三方提供的函数时,做为参数传给你调用的函数(你填写的是函数名,实际传的是函数地址),被你调用的函数在执行是,会调用你做为参数提供的函数,所以叫回调。一般,回调函数的参数都是约定好的。文件读取
    在读取大的文件的时候,如果将文件一下子全部读入内存,将会占用很大的内存空间,这将影响性能。内存映射文件的相关知识,你有兴趣可以参考一下别的资料。我给你一个文图文件(BMP)结构的说明,你看看另外:推荐楼主看《Windows核心编程》
      

  2.   

    1.1 BMP文件组成 
    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;
      

  3.   

    1 多媒体计时器:
    #include <mmsystem.h>

    DWORD curtime=timeGetTime();
       其实如果你要更精确的计时,可以使用QuerySystemPerformance之类的2 这个问题我没必要多说了,今天论坛上讨论的正火呢
      具体你可以查看SetTimer 的MSDN。
      SetTimer可以将一个回调函数作为参数。
      至于问为什么可以,那我也不知道。
      你看函数指针还能作为参数传递呢。3 没接触过4 图像有很多种,你问的估计是未经过压缩的位图(BMP)
      真彩色BMP需要36H 个字节的文件头,接下来就是数据了
      每个象素3个字节(分别记录RGB信息,所以每个R或者G或者B都是1个字节,即8位)