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

C# GDI+程式設計(五)

Dec 17, 2016 am 10:09 AM

呼叫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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
c#.net的持續相關性:查看當前用法 c#.net的持續相關性:查看當前用法 Apr 16, 2025 am 12:07 AM

C#.NET依然重要,因為它提供了強大的工具和庫,支持多種應用開發。 1)C#結合.NET框架,使開發高效便捷。 2)C#的類型安全和垃圾回收機制增強了其優勢。 3).NET提供跨平台運行環境和豐富的API,提升了開發靈活性。

從網絡到桌面:C#.NET的多功能性 從網絡到桌面:C#.NET的多功能性 Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#作為多功能.NET語言:應用程序和示例 C#作為多功能.NET語言:應用程序和示例 Apr 26, 2025 am 12:26 AM

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。

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 14, 2025 am 12:06 AM

C#和.NET通過不斷的更新和優化,適應了新興技術的需求。 1)C#9.0和.NET5引入了記錄類型和性能優化。 2).NETCore增強了雲原生和容器化支持。 3)ASP.NETCore與現代Web技術集成。 4)ML.NET支持機器學習和人工智能。 5)異步編程和最佳實踐提升了性能。

將C#.NET應用程序部署到Azure/AWS:逐步指南 將C#.NET應用程序部署到Azure/AWS:逐步指南 Apr 23, 2025 am 12:06 AM

如何將C#.NET應用部署到Azure或AWS?答案是使用AzureAppService和AWSElasticBeanstalk。 1.在Azure上,使用AzureAppService和AzurePipelines自動化部署。 2.在AWS上,使用AmazonElasticBeanstalk和AWSLambda實現部署和無服務器計算。

C#和.NET運行時:它們如何一起工作 C#和.NET運行時:它們如何一起工作 Apr 19, 2025 am 12:04 AM

C#和.NET運行時緊密合作,賦予開發者高效、強大且跨平台的開發能力。 1)C#是一種類型安全且面向對象的編程語言,旨在與.NET框架無縫集成。 2).NET運行時管理C#代碼的執行,提供垃圾回收、類型安全等服務,確保高效和跨平台運行。

See all articles