当前位置:编程学习 > C#/ASP.NET >>

请问c++高手:c++中的SetDIBitsToDevice函数的功能在c#下如何实现?

我现在有一个c++的ppc代码,但要改成c#,其中c++中的SetDIBitsToDevice的函数转变成c#版,困扰了我一个星期了。

 c++中的int SetDIBitsToDevice(
  HDC hdc,                 // handle to DC
  int XDest,               // x-coord of destination upper-left corner
  int YDest,               // y-coord of destination upper-left corner 
  DWORD dwWidth,           // source rectangle width
  DWORD dwHeight,          // source rectangle height
  int XSrc,                // x-coord of source lower-left corner
  int YSrc,                // y-coord of source lower-left corner
  UINT uStartScan,         // first scan line in array
  UINT cScanLines,         // number of scan lines
  CONST VOID *lpvBits,     // array of DIB bits
  CONST BITMAPINFO *lpbmi, // bitmap information
  UINT fuColorUse          // RGB or palette indexes
);

lpbmi可以用c#中的结构体来定义。但是*lpvBits就不知道怎么办了?

我想到用memorystream来实现,但不知道怎样获得byte类型的stream? --------------------编程问答-------------------- 试试

ref Object Bits, ref BITMAPINFO BitsInfo --------------------编程问答-------------------- 学习中~ --------------------编程问答-------------------- IntPtr ptr;
--------------------编程问答-------------------- hdt(倦怠)兄:
       IntPtr ptr;
        虽然得到句柄,但在bitmap中并没有对句柄的使用.
        我试过的.

net_lover(【孟子E章】) :
        我前几天给老师写过一封信,也是这个问题.

--------------------编程问答-------------------- intptr 相当于指针
byte[] bdata = new ... 
intptr = Marshal.UnManager...( bdata ) //函数记不大清了,你查一下msdn
--------------------编程问答-------------------- ref Object好象不行,出现异常. 

我的问题是这样的:我有一个dll,里面封装了一个MViewGetMap(HMVIEW hView, const BITMAPINFO*& pInfo, LPVOID& pBits)函数.是c++写的,现在从程序里用c#引用dll里的这个函数,

hView已知,目前需要获得的是bitmapInfo结构体定义的pInfo和LPVOID&定义的 pBits,如下:
  [DllImport("MapView.dll", EntryPoint = "MViewGetMap", SetLastError = true, CharSet = CharSet.Unicode)]
 public static extern bool MViewGetMap(IntPtr hView, ref BITMAPINFO pInfo, ref Object      pBits);

 [StructLayout(LayoutKind.Explicit)]
    public struct BITMAPINFOHEADER
    {
        [FieldOffset(0)]
        public Int32 biSize;
        [FieldOffset(4)]
        public Int32 biWidth;
        [FieldOffset(8)]
        public Int32 biHeight;
        [FieldOffset(12)]
        public Int16 biPlanes;
        [FieldOffset(14)]
        public Int16 biBitCount;
        [FieldOffset(16)]
        public Int32 biCompression;
        [FieldOffset(20)]
        public Int32 biSizeImage;
        [FieldOffset(24)]
        public Int32 biXPelsPerMeter;
        [FieldOffset(28)]
        public Int32 biYPelsPerMeter;
        [FieldOffset(32)]
        public Int32 biClrUsed;
        [FieldOffset(36)]
        public Int32 biClrImportant;
    }

    public struct RGBQUAD
    {
        public Byte rgbBlue;
        public Byte rgbGreen;
        public Byte rgbRed;
        public Byte rgbReserved;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct BITMAPINFO
    {
        public BITMAPINFOHEADER bmiHeader;
        public RGBQUAD bmiColors;
    }

Object pBits = new object();
BITMAPINFO pInfo = (BITMAPINFO)Marshal.PtrToStructure(HMVIEW, typeof(BITMAPINFO));
然后调用MViewGetMap(HMVIEW, ref pInfo, ref pBits)

在发现用object不行之后,用Intptr可以获得一个整型句柄,但在c#不知道怎么用?

在获得这两个参数值之后,在c++里就好办,直接用setDibitsToDevice就可以发布图象了,
但是现在在c#下又没有对应的函数,怎么办?难道c#下发布图象的功能不如c++?


真心希望孟子和其他高手能指点迷津!!! --------------------编程问答-------------------- hdt(倦怠)兄:
           "intptr 相当于指针"
   如果我现在获得了这个指针,怎样转换成byte[]

--------------------编程问答-------------------- marshal.readbyte
--------------------编程问答-------------------- hdt(倦怠)兄:
     marshal.readbyte
    读取的是单个字节,还行不成stream
     因为在转换memorystream sw=new memorystream(bytedata)中,bytedata必须是[]byte的.
     如果通过for循环去读,我又不知道循环几次?怎么解决这个问题? --------------------编程问答-------------------- 最后把图给画出来: 
Bitmap bmp = new Bitmap(bw);
 e.Graphics.DrawImage(bmp, 200, 200);


请教大家:,如果不需要显示全图的话,其实从bitmapinfo结构体中得到的信息,对于最后图形的生成没有影响吧,因为我只显示部分图,类似漫游效果. --------------------编程问答-------------------- 循环读取
--------------------编程问答-------------------- 怎样循环读取?循环多少次,stream的长度我还不知道那.

看看能不能给我具体一点的建议?现在真有点急了.希望大家能帮帮我. --------------------编程问答-------------------- sorry 以前只看你的问题,没有仔细看你要调的函数,其实你全错了
SetDIBitsToDevice(
  HDC hdc,                 // handle to DC
  int XDest,               // x-coord of destination upper-left corner
  int YDest,               // y-coord of destination upper-left corner 
  DWORD dwWidth,           // source rectangle width
  DWORD dwHeight,          // source rectangle height
  int XSrc,                // x-coord of source lower-left corner
  int YSrc,                // y-coord of source lower-left corner
  UINT uStartScan,         // first scan line in array
  UINT cScanLines,         // number of scan lines
  CONST VOID *lpvBits,     // array of DIB bits //这个参数是输入参数,需要你在外部初始化

--------------------编程问答-------------------- 建议看看我的blog
--------------------编程问答--------------------
hdt(倦怠) :

IntPtr pBits = new IntPtr();
BITMAPINFO pInfo = (BITMAPINFO)Marshal.PtrToStructure(HMVIEW, typeof(BITMAPINFO));
然后调用MViewGetMap(HMVIEW, ref pInfo, ref pBits)

这时候不是获得了两个东西吗?一个是pInfo,一个是pBits,是
输入参数啊,给SetDIBitsToDevice做为参数使用的.
只是现在我不用SetDIBitsToDevice,而是用c#实现.

你能把msn告诉我吗?真诚向你请教!My msn:haixia9060@hotmail.com --------------------编程问答-------------------- 你的blog里的哪篇文章是与此相关的?
我现在比较急,可能来不及多看了,不过以后会细看的 --------------------编程问答-------------------- 具体是什么函数
MViewGetMap
还是
SetDIBitsToDevice
??? --------------------编程问答-------------------- 简单来说就是把SetDIBitsToDevice函数换成c#版
--------------------编程问答-------------------- 其实,现在这个问题也可以有偿解决,我实在没有办法了,希望大家帮我 --------------------编程问答-------------------- 我现在已经获得了一个BitmapInfo结构体的信息,也获得了一个指向位图缓存的地址,如何用c#画到一个设备上。应该明白我的意思了吧?

我的Msn:haixia9060@hotmail.com
--------------------编程问答-------------------- 没有人解答吗? --------------------编程问答-------------------- 我也遇到相同的问题,期待中。。。
补充:.NET技术 ,  VC.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,