本人是菜鸟,我尽量把问题描述清楚,希望图像方面的编程大牛帮我解决。
     我要写的是一个画图程序,应用的核心类是开源程序CxImage这个图像类,图像的显示是此类完成的,此类中存储图像信息的是byte* pDib,存储形式是设备无关位图,我想在我的程序中加入画图操作部分,就像Windows画图程序中的铅笔、画刷、长方形等,这些画图操作都需要使用内存设备,调用CreateCompatibleDC函数,这必须使用pDib内存中信息创建一个HBitmap对象,然后将HBitmap对象选进dc中进行操作,操作后将HBitmap中的信息导入到PDib中,这样一进一出需要两个过程,而我需要的程序在画图过程中需要使用PDib信息进行显示,而且需要实时显示,所以我需要对图片的操作直接体现在PDib中,这样我的程序的图片操作与显示就可以同步了,如何让图片操作直接体现在图片存储PDib中?请高手赐教!!

解决方案 »

  1.   

    很简单:
    1:CreateDIBSection() create a HBITMAP(用原图的LPBITMAPINFO) --> copy pDib的位数据到hBitmap的ppvbits.
    2:hbitmap选入memdc gdi作图
    3:画完选出memdc, 把hbitmap的ppvbits copy回pDib的位数据.
      

  2.   

       二楼朋友请注意看我的问题
        我程序中的图片显示是使用CxImage类中的Draw函数,这个函数使用的是pDib信息,这个函数支持透明显示,这是我不愿意修改这个函数的原因
        我想进行图片操作并进行实时显示但还不想更改Draw函数,若Copy到 hBitmap 进行操作后再Copy回PDib 那就不能实时显示了,因为我显示的函数应用的是PDib信息。
      

  3.   

    不明你说的"实时"是指什么:
    "若Copy到 hBitmap 进行操作后再Copy回PDib 那就不能实时显示了,",怎么不能实时显示?画的时候可以直接Get客户区DC在客户区上画,但要反映到实际DIB时,那就需要选入memdc内用gdi作图画到原图上,否则画了等于没画.
    难道你是指不用GDI作图..而自己写所有的画这画那实现方法?
      

  4.   

    btw..去找找周长发的<<visual c++.net 图象处理编程>>吧,源码附带的画图工程"ImageBoard"就是个画图工程.去看看他的实现方法.
      

  5.   

       请你注意我所使用的显示函数是CxImage类中的Draw函数,这个函数使用的是pDid信息
       我再告诉你为什么你这方法不能实时,若程序使用铅笔在画布上乱画,你这种方法只能是画完了  内存操作完了再Copy回pDib再显示,在铅笔乱画过程中你如何显示?能画一个点就进行一次内存操作吗,你如何连续画点?
      

  6.   

         ImageBoard这个程序我也参考过,它操作图片和显示图片都是使用的CBitmap m_pbitmap ,所以它不存在实时的问题,它只是在保持时才把m_pbitmap转化为DIB形式。我的程序中想实现支持Alpha通道,所以显示不是直接使用的pBitmap,而是使用的pDib,操作CreateDIBSection 中的pBit指针,将Alpha信息导入才使得透明度显示出来,不是直接用的pBitmap 。 我的表达能力有限,敬请谅解!!
          若图片操作不能直接体现在pDib上,我就只能重构我的程序了。
      

  7.   

    http://blogimg.chinaunix.net/blog/upfile2/090601201328.rar你可以试试用这个打开任意一个文件,然后点工具栏上的笔,右面会出现画点,然后点左面的任一"方块",再选择右下的颜色,就可以在右面画图区域"画点"了..你认为那不够实时吗?
    可以再看看左面原方块有何反应..
    btw..画完就算,不要保存...这是偶N年前编来汉化GBA游戏图片的.
      

  8.   

    lambochan:你为什么不仔细看我的回答呢,实时操作我也能实现,ImageBoard中也有,你就不要再来教我这些了。望你仔细看我的问题与回答后再回复。