在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?
来源:互联网 发布:淘宝推广平台哪个好 编辑:程序博客网 时间:2024/06/05 05:15
用IntPtr类型,Hdc一般是指绘图设备句柄,用Graphics的成员方法GetHdc获得,Graphics可以用静态方法FromHwnd创建某个窗体的绘图器,把某个窗体的Handle传给他就可以了,如果Handle传0,则创建的是整个屏幕的绘图器。
最近在学习C#中的GDI部分,本来尝试编写一个字幕控件(其实还是用label比较合适),但是发现控件中用GDI将整个控件粉刷貌似不行(应该是我水平不行),所以就去捣鼓了下WIN32的DLL,发现用API还真是件幸福的事(仅在WIN32平台上说)。回到C#,在C#中要在一个窗体(控件也是窗体),只要用
Graphics g=控件名.CreateGraphics();//这样就可以用g来在这个控件上画东西了。
但是如果我想不限范围,在整个屏幕上画,那么.NET就无能为力了。还好,我们有WIN32,我们可以用GetDC或者CreateDC来获得整个屏幕的设备驱动器句柄。用完之后别忘了用ReleaseDC或DeleteDC释放。
以下是C#中GetDC()和ReleaseDC()的声明方法
Hdc = GetDC(IntPtr.Zero); //MSDN中说当传入指针为空时返回整个屏幕的设备驱动器句柄
嘿嘿,接下来我们就可以利用这个设备驱动器句柄来乱画东西了,不过在此之前我们先把这个C#不常见的东西转化为熟悉的Graphics。我们只要用
Graphics g = Graphics.FromHdc(Hdc);//这样就从设备驱动器句柄中获得了.NET只能的Graphics类。
得到了这些东西,剩下的就不用我多说了吧,这些来大家就可以在这个屏幕上爱怎么画就怎么画。不过画完之后记得调用ReleaseDC()来释放这个句柄(如果画完程序就结束那倒无所谓)。
ReleaseDC(IntPtr.Zero, Hdc); //这样这个屏幕的设备驱动器句柄就被释放了。
Graphics g=控件名.CreateGraphics();//这样就可以用g来在这个控件上画东西了。
但是如果我想不限范围,在整个屏幕上画,那么.NET就无能为力了。还好,我们有WIN32,我们可以用GetDC或者CreateDC来获得整个屏幕的设备驱动器句柄。用完之后别忘了用ReleaseDC或DeleteDC释放。
以下是C#中GetDC()和ReleaseDC()的声明方法
[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern IntPtr GetDC(IntPtr Hwnd); //其在MSDN中原型为HDC GetDC(HWND hWnd),HDC和HWND都是驱动器句柄(长指针),在C#中只能用IntPtr代替了
[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern int ReleaseDC( IntPtr hWnd, IntPtr hDC);
然后我们获得整个屏幕的设备驱动器句柄static extern IntPtr GetDC(IntPtr Hwnd); //其在MSDN中原型为HDC GetDC(HWND hWnd),HDC和HWND都是驱动器句柄(长指针),在C#中只能用IntPtr代替了
[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern int ReleaseDC( IntPtr hWnd, IntPtr hDC);
Hdc = GetDC(IntPtr.Zero); //MSDN中说当传入指针为空时返回整个屏幕的设备驱动器句柄
嘿嘿,接下来我们就可以利用这个设备驱动器句柄来乱画东西了,不过在此之前我们先把这个C#不常见的东西转化为熟悉的Graphics。我们只要用
Graphics g = Graphics.FromHdc(Hdc);//这样就从设备驱动器句柄中获得了.NET只能的Graphics类。
得到了这些东西,剩下的就不用我多说了吧,这些来大家就可以在这个屏幕上爱怎么画就怎么画。不过画完之后记得调用ReleaseDC()来释放这个句柄(如果画完程序就结束那倒无所谓)。
ReleaseDC(IntPtr.Zero, Hdc); //这样这个屏幕的设备驱动器句柄就被释放了。
阅读全文
0 0
- 在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?
- 在C#中如何利用存储过程返回dataset??假设这个存储过程有一个参数
- C#中在函数参数列表中第一个参数指定为this有什么用?
- 存储过程有输出参数,在c#中用nhibernate调用存储过程时,如何才能获取到一个结果集和这个输出参数呢?
- ulua在C#中调用lua并传递参数
- WinPcap中Pocket.dll里的PacketGetAdapterNames这个API在C#里面的调用
- 如何生成DLL文件并导出函数及如何在C++或C#中调用DLL中导出的函数
- 在C#中如何调用dll文件
- 在C#中如何调用dll文件
- 在C#中如何调用dll文件
- 在安卓开发中如何在代码中设置ImageView中src中这个参数
- 在C#中调用DLL
- C#中调用dll,函数参数带指针
- C#中调用C++的dll的参数为指针类型的导出函数
- C#中调用C++的dll的参数为指针类型的导出函数
- 如何在一个可变参数函数中调用另一个可变参数函数
- C#中如何加载dll并调用其函数
- 关于在C#中调用C++ DLL 时的参数传递
- iframe选择父元素的方法和js跳出iframe的方法
- 被玩坏的代码注释
- Android 热敏打印 文本
- ArcGIS Server网络分析服务的发布与测试
- 《深入理解mybatis原理》 MyBatis的二级缓存的设计原理
- 在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?
- eclipse如何为java项目生成API文档、JavaDoc
- enable_irq_wake是如何起作用的
- NAT穿透(UDP打洞)
- java中System.getProperty()方法详解
- 单调栈
- leetcode 166. Fraction to Recurring Decimal 循环小数的展开
- Java多线程总结之线程安全队列Queue
- 智能照明:蓝牙5.0将打败ZigBee?