搜尋
首頁後端開發C#.Net教程C# GDI+程式設計(五)

呼叫API函數,在視窗非客戶區繪圖

GDI+的Graphics類別裡有個FromHdc函數,這個函數可以根據視窗裝置上下文(DC)建立Graphics對象,在vc++中,視窗客戶區與非客戶區的繪圖無非就是GetWindowDC和GetDC函數的不同呼叫。前者獲得整個視窗DC,後者獲得窗口客戶區DC。

那麼我們就可以在C#裡,呼叫GetWindowDC函數取得整個視窗DC,然後透過FromHdc載入進去,這樣我們就能針對整個視窗繪圖了。

C#要如何呼叫WINDOWS API呢,或是說如何呼叫動態連結函式庫(DLL)裡的函式。

跟VC++的大同小異,先導入動態連結函式庫,然後再宣告API函數,如下:

 [System.Runtime.InteropServices.DllImport("User32.dll")]IntDC private static

當然上面是最簡單的,還有一些細節沒講,先就這樣吧,會基本使用就行了,那些細節問題以後再詳細說明。

在C#中,我們發現API函數的參數型別都不一樣了,像是在VC++中的句柄HDC,HWND。在這裡聲明時,都用了IntPtr代替,這是沒有辦法的事,因為C#沒有指標這個概念,而我們透過查HDC,和HWND類型定義時發現,它們都是指標類型。

所以在C#中,這些「句柄」類型都用IntPtr代替,包括區域句柄HRGN,HICON圖標,HFONT字體句柄等。

看一個範例吧,(接著上一章的)

    public partial class Form1 : Form
    {
        //導入動態連結函式庫,且宣告函數,此函數是宣告在Form1類別中的宣告函數。
        [System.Runtime.InteropServices.DllImport("User32.dll")]
         //儲存PNG非透明部分的路徑
        private GraphicsPath path = new GraphicsPath();
        / /載入PNG圖片
        Bitmap bmp = new Bitmap("d:\Image\win.png");
             InitializeComponent();
            //判斷每像素的色彩值,以取得圖片的顯示區域
            for (int y = 0; y     bmp.Width; x++)
                {
         
                    int argb = cor.ToArgb();
                    byte[] bargb = BitConverter.GetBytes(argb);
                    //像素顏色值不是透明的
                    if (bargb[3] != 0)
                    {
                        //把這個像素點區域加入到路徑裡去
                        path.AddRectangle(new        }
                }
         ion = new Region(path) ;
            this.Paint += formPaint;
         
   sender, PaintEventArgs e)
        {
            
     //Handle是視窗句柄,它是IntPtr類型
            IntPtr hdc = GetWindowDC (this.Handle);
            //依照視窗DC建立Graphics物件
            /繪製圖片
            gr.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp .Height));
        }
protected override void OnPaintBackground(PaintEventArgs e)
        {
          ground(e);
            e.Graphics.FillRectangle(Brushes.Transparent, this.ClientRectangle);
   怎麼樣,效果不錯吧,但一拖曳窗口就原形畢露了,注意到蘋果下方的陰影了麼,就是為了實現這個效果才會帶來一些問題,或者說麻煩了許多吧。只是我沒去解決。移動窗口,或最大化窗口,都沒有完全刷新整個窗口,才會導致這種問題出現。這個問題留待以後解決吧,

在興趣的朋友也可以去解決這個問題。

另外,我用透明畫刷填充的只是視窗的客戶區,如果想填充整個視窗(包括標題列),方法跟在整個視窗繪圖一樣,獲得WindowDC,然後

創建Graphics對象,繪製視窗背景。

(題外話:在vc++中,客戶區與非客戶區有著不同的重繪訊息,WM_PAINT和WM_NCPAINT,這一點要注意了,在刷新非客戶區的時候,別重繪客戶區,雖說不會出什麼問題,但影響了效率總是不好的,能避免就避免)

自繪視窗非客戶區(包括標題欄,最大,最小化,關閉按鈕)

重寫訊息處理函數WndProc

public partial class Form1 : Form

    {

        public Form1()

              }

        protected override void WndProc(ref Message m) == 0xA3)//WM_NCLBUTTONDBLCLK  雙擊標題訊息

                MessageBox.Show("你雙擊了標題欄");
        ref m);
        }

    }

這樣雙擊標題欄的時候就會給予一個提示,然後再預設處理。

查訊息對應的數值,可以到VC++編譯器裡去查,例如打上WM_LBUTTONDOWN然後右鍵,選擇轉到定義就可以查看了。

m.HWnd儲存有視窗句柄,m.LParam和m.WParam是訊息的附帶訊息,可以參考CreateWindow函數裡的WPARAM和LPARAM參數來解釋。

 

 自繪非客戶區工作量實在是太大了,這裡我只給個大概的思路,方向,以後有空再來做吧。

前提當然是把各項資料計算出來,例如視窗有無邊框,如果有的話,取得邊框寬度,高度,然後計算四個邊框的矩形區域。

最後就判斷視窗有無最大,最大小化屬性,然後得到三個按鈕的區域。

而SystemInformation類別裡就儲存有這些數據,例如SystemInformation.CaptionButtonSize儲存有標題欄按鈕的大小,得到了大小,就可以

確定按鈕的區域了,因為這三個按鈕都在視窗的右上角,除去邊框的高寬。

而SystemInformation.CaptionHeight儲存有標題列的高度,邊框的高寬儲存在SystemInformation.BorderSize或SystemInformation.Border3DSize,這個根據視窗的FormBorderStyle決定。視窗的是否處於最大化可以判斷MaximizeBox,為true最大化。

得到了上面那些數據,就響應非客戶區的各種訊息,如滑鼠左鍵訊息WM_NCLBUTTONDOWN和WM_NCLBUTTONUP。

滑鼠移動訊息WM_NCMOUSEMOVE,接著就開始自繪了。

另Rectangle類別裡的Contains函數,可以判斷一個點是否在一個矩形區域內。

 

更多C# GDI+程式(五)相關文章請關注PHP中文網!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
c#.net適合您嗎?評估其適用性c#.net適合您嗎?評估其適用性Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

.NET中的C#代碼:探索編程過程.NET中的C#代碼:探索編程過程Apr 12, 2025 am 12:02 AM

C#在.NET中的編程過程包括以下步驟:1)編寫C#代碼,2)編譯為中間語言(IL),3)由.NET運行時(CLR)執行。 C#在.NET中的優勢在於其現代化語法、強大的類型系統和與.NET框架的緊密集成,適用於從桌面應用到Web服務的各種開發場景。

C#.NET:探索核心概念和編程基礎知識C#.NET:探索核心概念和編程基礎知識Apr 10, 2025 am 09:32 AM

C#是一種現代、面向對象的編程語言,由微軟開發並作為.NET框架的一部分。 1.C#支持面向對象編程(OOP),包括封裝、繼承和多態。 2.C#中的異步編程通過async和await關鍵字實現,提高應用的響應性。 3.使用LINQ可以簡潔地處理數據集合。 4.常見錯誤包括空引用異常和索引超出範圍異常,調試技巧包括使用調試器和異常處理。 5.性能優化包括使用StringBuilder和避免不必要的裝箱和拆箱。

測試C#.NET應用程序:單元,集成和端到端測試測試C#.NET應用程序:單元,集成和端到端測試Apr 09, 2025 am 12:04 AM

C#.NET應用的測試策略包括單元測試、集成測試和端到端測試。 1.單元測試確保代碼的最小單元獨立工作,使用MSTest、NUnit或xUnit框架。 2.集成測試驗證多個單元組合的功能,常用模擬數據和外部服務。 3.端到端測試模擬用戶完整操作流程,通常使用Selenium進行自動化測試。

高級C#.NET教程:ACE您的下一次高級開發人員面試高級C#.NET教程:ACE您的下一次高級開發人員面試Apr 08, 2025 am 12:06 AM

C#高級開發者面試需要掌握異步編程、LINQ、.NET框架內部工作原理等核心知識。 1.異步編程通過async和await簡化操作,提升應用響應性。 2.LINQ以SQL風格操作數據,需注意性能。 3..NET框架的CLR管理內存,垃圾回收需謹慎使用。

C#.NET面試問題和答案:提高您的專業知識C#.NET面試問題和答案:提高您的專業知識Apr 07, 2025 am 12:01 AM

C#.NET面試問題和答案包括基礎知識、核心概念和高級用法。 1)基礎知識:C#是微軟開發的面向對象語言,主要用於.NET框架。 2)核心概念:委託和事件允許動態綁定方法,LINQ提供強大查詢功能。 3)高級用法:異步編程提高響應性,表達式樹用於動態代碼構建。

使用C#.NET建築微服務:建築師實用指南使用C#.NET建築微服務:建築師實用指南Apr 06, 2025 am 12:08 AM

C#.NET是構建微服務的熱門選擇,因為其生態系統強大且支持豐富。 1)使用ASP.NETCore創建RESTfulAPI,處理訂單創建和查詢。 2)利用gRPC實現微服務間的高效通信,定義和實現訂單服務。 3)通過Docker容器化微服務,簡化部署和管理。

C#.NET安全性最佳實踐:防止常見漏洞C#.NET安全性最佳實踐:防止常見漏洞Apr 05, 2025 am 12:01 AM

C#和.NET的安全最佳實踐包括輸入驗證、輸出編碼、異常處理、以及身份驗證和授權。 1)使用正則表達式或內置方法驗證輸入,防止惡意數據進入系統。 2)輸出編碼防止XSS攻擊,使用HttpUtility.HtmlEncode方法。 3)異常處理避免信息洩露,記錄錯誤但不返回詳細信息給用戶。 4)使用ASP.NETIdentity和Claims-based授權保護應用免受未授權訪問。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境