请问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