使用c 建立windows視窗(基於api)

2021-06-02 16:18:25 字數 1679 閱讀 7069

看到這個標題,你也許會驚訝:c#也能這樣建立?是的,沒錯,大多數使用api來建立視窗的是c/c++,當然也有其他的語言,但是幾乎沒有看到使用c#來建立的(不包括.net框架的),因為.net有著非常高效的開發方式,所以大部分人選擇了規避。

傳統的win32視窗程式入口點是 winmain 函式,但是我們在使用c#開發程式的時候,無論是控制台還是視窗應用程式,入口點永遠是 main 函式,我們熟悉的 hinstance 這些引數不見了,至於去了**不是這篇文章所**的,沒有了 hinstance 這個引數我們是無法建立的,但是.net框架依然能夠使用我們平時所建立的窗體跑起來,說明這個引數在main函式之前被獲取到了,我花了點時間查閱了很多資料,在網上找到了解決辦法,有 marshal 這樣的乙個類,裡面有個靜態函式 gethinstance,引數是module,這樣一來似乎找到了解決方案,確實如此,至於 module 的獲取辦法更是簡單了 typeof(你的類名).module,障礙清除了,接下來就好辦多了,按照正常的建立流程來寫,不過你必須得事先宣告api函式才行。接下來,筆者帶你建立乙個視窗程式。

1.建立乙個控制台應用程式,修改專案的屬性,改為視窗應用程式。

2.在你的 main 函式裡面新增一些**:

static void main(string args)

記得新增命名空間:

using system.runtime.interopservices;

using system.reflection;

接下來是註冊視窗類,不過還得先宣告好視窗類

struct wndclass 

public delegate int wndproc(intptr hwnd,uint umsg,intptr wparam,intptr lparam);
然後宣告api函式:

[dllimport("user32.dll", entrypoint = "registerclassa")]

public static extern intptr registerclass(ref wndclass cls);

再然後你僅僅只是對這個結構進行填充再註冊:

wndclass cls = new wndclass();

cls.cbcl***tra = 0;

cls.cbwndextra = 0;

cls.hbrbackground = intptr.zero;

cls.hcursor = intptr.zero;

cls.hicon = intptr.zero;

cls.hiconsm = intptr.zero;

cls.hinstance = hinstance;

cls.lpszclassname = "dotnet_window";

cls.lpszmenuname = null;

cls.proc = windowproc;

cls.style = classstyle.cs_vredraw|classstyle.cs_hredraw;

registerclass(ref cls);//註冊視窗類

...

Windows建立視窗程式

windows中建立乙個視窗程式 必須 經過幾個步驟 1.設計 winmain函式 2.設計wndclass視窗類 3.註冊視窗類registerclass 4.建立視窗 createwindow 5.顯示 更新視窗 showwindow updatewindow 6.編寫訊息迴圈 getmessa...

DirectX建立Windows視窗

過程 winmain 視窗類 註冊視窗類 建立視窗 顯示和更新視窗 訊息迴圈 視窗過程 include define window class ugpdx define window title demo window lresult winapi msgproc hwnd hwnd,uint ms...

Windows執行機理 建立視窗

windows執行機理這系列文章都是來至於 零基礎學qt4程式設計 吳迪,個人覺得寫得很好,所以進行了搬運和個人加工 windows 視窗在建立之前,其屬性必須設定好,所謂屬性包括類的名字 圖示 游標及視窗過程處理函式等屬性。為了設定這些屬性,windows 要求註冊視窗類,一經註冊,就可以建立更多...