在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?
生活随笔
收集整理的這篇文章主要介紹了
在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
用IntPtr類(lèi)型,Hdc一般是指繪圖設(shè)備句柄,用Graphics的成員方法GetHdc獲得,Graphics可以用靜態(tài)方法FromHwnd創(chuàng)建某個(gè)窗體的繪圖器,把某個(gè)窗體的Handle傳給他就可以了,如果Handle傳0,則創(chuàng)建的是整個(gè)屏幕的繪圖器。
最近在學(xué)習(xí)C#中的GDI部分,本來(lái)嘗試編寫(xiě)一個(gè)字幕控件(其實(shí)還是用label比較合適),但是發(fā)現(xiàn)控件中用GDI將整個(gè)控件粉刷貌似不行(應(yīng)該是我水平不行),所以就去搗鼓了下WIN32的DLL,發(fā)現(xiàn)用API還真是件幸福的事(僅在WIN32平臺(tái)上說(shuō))。回到C#,在C#中要在一個(gè)窗體(控件也是窗體),只要用
????Graphics g=控件名.CreateGraphics();//這樣就可以用g來(lái)在這個(gè)控件上畫(huà)東西了。
????但是如果我想不限范圍,在整個(gè)屏幕上畫(huà),那么.NET就無(wú)能為力了。還好,我們有WIN32,我們可以用GetDC或者CreateDC來(lái)獲得整個(gè)屏幕的設(shè)備驅(qū)動(dòng)器句柄。用完之后別忘了用ReleaseDC或DeleteDC釋放。
????以下是C#中GetDC()和ReleaseDC()的聲明方法
????????[System.Runtime.InteropServices.DllImport("User32.dll")]
????????static?extern?IntPtr?GetDC(IntPtr?Hwnd);?//其在MSDN中原型為HDC?GetDC(HWND?hWnd),HDC和HWND都是驅(qū)動(dòng)器句柄(長(zhǎng)指針),在C#中只能用IntPtr代替了
????????[System.Runtime.InteropServices.DllImport("User32.dll")]
????????static?extern?int?ReleaseDC(?IntPtr?hWnd,??IntPtr?hDC); ????然后我們獲得整個(gè)屏幕的設(shè)備驅(qū)動(dòng)器句柄
????Hdc = GetDC(IntPtr.Zero); //MSDN中說(shuō)當(dāng)傳入指針為空時(shí)返回整個(gè)屏幕的設(shè)備驅(qū)動(dòng)器句柄
????嘿嘿,接下來(lái)我們就可以利用這個(gè)設(shè)備驅(qū)動(dòng)器句柄來(lái)亂畫(huà)東西了,不過(guò)在此之前我們先把這個(gè)C#不常見(jiàn)的東西轉(zhuǎn)化為熟悉的Graphics。我們只要用
????Graphics??g = Graphics.FromHdc(Hdc);//這樣就從設(shè)備驅(qū)動(dòng)器句柄中獲得了.NET只能的Graphics類(lèi)。
????得到了這些東西,剩下的就不用我多說(shuō)了吧,這些來(lái)大家就可以在這個(gè)屏幕上愛(ài)怎么畫(huà)就怎么畫(huà)。不過(guò)畫(huà)完之后記得調(diào)用ReleaseDC()來(lái)釋放這個(gè)句柄(如果畫(huà)完程序就結(jié)束那倒無(wú)所謂)。
????ReleaseDC(IntPtr.Zero, Hdc);?//這樣這個(gè)屏幕的設(shè)備驅(qū)動(dòng)器句柄就被釋放了。
最近在學(xué)習(xí)C#中的GDI部分,本來(lái)嘗試編寫(xiě)一個(gè)字幕控件(其實(shí)還是用label比較合適),但是發(fā)現(xiàn)控件中用GDI將整個(gè)控件粉刷貌似不行(應(yīng)該是我水平不行),所以就去搗鼓了下WIN32的DLL,發(fā)現(xiàn)用API還真是件幸福的事(僅在WIN32平臺(tái)上說(shuō))。回到C#,在C#中要在一個(gè)窗體(控件也是窗體),只要用
????Graphics g=控件名.CreateGraphics();//這樣就可以用g來(lái)在這個(gè)控件上畫(huà)東西了。
????但是如果我想不限范圍,在整個(gè)屏幕上畫(huà),那么.NET就無(wú)能為力了。還好,我們有WIN32,我們可以用GetDC或者CreateDC來(lái)獲得整個(gè)屏幕的設(shè)備驅(qū)動(dòng)器句柄。用完之后別忘了用ReleaseDC或DeleteDC釋放。
????以下是C#中GetDC()和ReleaseDC()的聲明方法
????????[System.Runtime.InteropServices.DllImport("User32.dll")]
????????static?extern?IntPtr?GetDC(IntPtr?Hwnd);?//其在MSDN中原型為HDC?GetDC(HWND?hWnd),HDC和HWND都是驅(qū)動(dòng)器句柄(長(zhǎng)指針),在C#中只能用IntPtr代替了
????????[System.Runtime.InteropServices.DllImport("User32.dll")]
????????static?extern?int?ReleaseDC(?IntPtr?hWnd,??IntPtr?hDC); ????然后我們獲得整個(gè)屏幕的設(shè)備驅(qū)動(dòng)器句柄
????Hdc = GetDC(IntPtr.Zero); //MSDN中說(shuō)當(dāng)傳入指針為空時(shí)返回整個(gè)屏幕的設(shè)備驅(qū)動(dòng)器句柄
????嘿嘿,接下來(lái)我們就可以利用這個(gè)設(shè)備驅(qū)動(dòng)器句柄來(lái)亂畫(huà)東西了,不過(guò)在此之前我們先把這個(gè)C#不常見(jiàn)的東西轉(zhuǎn)化為熟悉的Graphics。我們只要用
????Graphics??g = Graphics.FromHdc(Hdc);//這樣就從設(shè)備驅(qū)動(dòng)器句柄中獲得了.NET只能的Graphics類(lèi)。
????得到了這些東西,剩下的就不用我多說(shuō)了吧,這些來(lái)大家就可以在這個(gè)屏幕上愛(ài)怎么畫(huà)就怎么畫(huà)。不過(guò)畫(huà)完之后記得調(diào)用ReleaseDC()來(lái)釋放這個(gè)句柄(如果畫(huà)完程序就結(jié)束那倒無(wú)所謂)。
????ReleaseDC(IntPtr.Zero, Hdc);?//這樣這個(gè)屏幕的設(shè)備驅(qū)動(dòng)器句柄就被釋放了。
總結(jié)
以上是生活随笔為你收集整理的在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: FFMpeg分析详细分析
- 下一篇: C#获取容器窗体中控件Location问