不用gdi对象,画线算法我已经明白了,现在问题是:我怎么创建这个位图,然后怎么在位图上画一个点,谁能给个例子关键实现?谢谢!

解决方案 »

  1.   

    画图,不用GDI, 就是DDRAW, D3D, OPENGL....自己写画线的算法,也要一个个点画出来不是?
      

  2.   

    直接操作DIB数组看看这个,实现图像的任意角度旋转
    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=7575
      

  3.   

    谢谢mct1025,能不能再给一点这方面的例子或链接。我需要的就是直接操作位图像素。我现在还搞不懂怎么获得像素数组。谢谢!先给你这么多分。
      

  4.   

    从文件直接读取,或是用GetDIBits可以得到DIB数据BITMAPFILEHEADER 中的bfOffBits 指向bitmap的DIB数据开始位置BITMAPINFOHEADER 中的biHeight 高度参数决定数据存储方向,一般情况 biHeight > 0
    If biHeight is positive, the bitmap is a bottom-up DIB and its origin is the lower-left corner. If biHeight is negative, the bitmap is a top-down DIB and its origin is the upper-left corner. biBitCount :Specifies the number of bits-per-pixel. 直接操作DIB速度快,但是不太方便,比如说画一条倾斜直线,还需要自己写算法
    而且根据biBitCount,处理像素的颜色位数也比较麻烦在旋转位图中使用,是因为GetPixel,SetPixel速度实在太慢了这方面的例子,只知道这个我写了一下,在24位bmp底部画一条红色直线 CFileStatus fstatus;
    CFile file;
    LONG cb;
    LPVOID pvData = NULL;
    HGLOBAL hGlobal;
    //读取文件
    if(file.Open("c:\\start2.bmp",CFile::modeRead)&&
    file.GetStatus("c:\\start2.bmp",fstatus)&&((cb =fstatus.m_size)!= -1))
    {
    hGlobal = GlobalAlloc(GMEM_MOVEABLE,cb);

    if (hGlobal != NULL)
    {
    if ((pvData = GlobalLock(hGlobal))!= NULL)
    {
    file.ReadHuge(pvData,cb);
    GlobalUnlock(hGlobal);
    file.Close();
    }
    }
    }
    BITMAPFILEHEADER *pbfh;
    pbfh = (BITMAPFILEHEADER *)pvData;
    BITMAPINFOHEADER *pbmh;
    pbmh = (BITMAPINFOHEADER *)((BYTE *)pvData + 14); if (pbmh->biBitCount != 24)
    return; BYTE *pDIB = (BYTE *)pvData + pbfh->bfOffBits;
    for (int i = 0 ;i < pbmh->biWidth * 3;i = i + 3)
    {//对于24位bmp,底部划一条红线
    pDIB[i] = 0x00;//b
    pDIB[i+1] = 0x00;//g
    pDIB[i+2] = 0xff;//r
    }
    //保存文件
    CFile bf;
    if(bf.Open("c:\\t.bmp",CFile::modeCreate|CFile::modeWrite))
    {
    bf.WriteHuge(pvData,pbfh->bfSize);
    bf.Close();
    }
    GlobalFree(hGlobal);
      

  5.   

    pbmh = (BITMAPINFOHEADER *)((BYTE *)pvData + 14);
    这个我不懂啊,为什么是加14啊,是固定的吗?
      

  6.   

    sizeof(BITMAPFILEHEADER) == 14
      

  7.   

    感谢各位的参与!
    我现在已经有点眉目了。
    问题的产生是这样的:我现在有个项目,它必须画2万条以上的曲线,每条曲线的点平均个数大约100,用GDI的MoveTo, LineTo画得800毫秒,而且还有区域和弧。而我们的要求是不能超过500毫秒,所以我考虑直接在内存位图上画,然后再显示。我不知道这个方法速度能提高多少。大家有什么好的方法吗?一定高分相送,我还有2千多可用分啊!to  mct1025:颜色24为的处理不是很方便,可以创建一个32位颜色的位图,这样一个像素一个int大小,好处理。mct1025能不能说说这方面的一些关键技术和注意事项?谢谢!!大家踊跃发言,UP者有分,好的发言得多分。我难得提问一次,积累了几年的分终于有用武之地了。嗬嗬!
      

  8.   

    你是直接画到窗体的DC上的吗?
    为什么不用内存DC?
      

  9.   

    直接操作DIB,速度能快多少
    能不能达到你的需求,我也不清楚你可以看看图形学的教程,有各种基本图形的生成算法,Bresenham算法用的比较多
    到google搜一下,可能有现成的程序区域填充、线宽与线型的处理、裁剪、反走样等 好多都要自己实现可能很辛苦啊,呵呵