在 Windows 上不用 Win32 API 可以繪製出乙個視窗麼?

時間 2021-05-11 23:58:27

1樓:

Qt 貌似沒用?你找了沒?

以 Qt 5.15.2 版本為例,檔案在 qtbase 的 src/plugins/platforms/windows/qwindowswindow.cpp 裡

2樓:tristan

import

queue

import

threading

import

tkinter

astk

import

wxfrom

component

import

draw_rect=wx

.(False)q

=None

defprepare_refresh_screen():root=tk

.Tk()root

.overrideredirect

(True

)root

.attributes

('-alpha'

,0.01

)root

.state

('zoomed'

)root

.withdraw

()draw_rect.q

.put

(root

)root

.mainloop

()def

refresh_screen

():root

=draw_rect.q

.get

()draw_rect.q

=queue

.LifoQueue

()root

.state

('zoomed'

)root

.update

()root

.deiconify

()root

.withdraw

()draw_rect.q

.put

(root

)draw_rect.q

=queue

.LifoQueue

()threading

.Thread

(target

=prepare_refresh_screen).

start

()def

do_draw(x

,y,width

,height

,is_need_confirm

=True

):dc=wx

.ScreenDC

()transparent_colour=wx.Colour

(255

,255

,255,0

)red_colour=wx

.Colour

(255,0

,0,0

)normal_pen=wx

.Pen

(red_colour

,width=3

)brush=wx

.Brush

(transparent_colour

,style=wx

.BRUSHSTYLE_TRANSPARENT)dc.SetBackgroundMode(wx.TRANSPARENT)if

notis_need_confirm

:refresh_screen

()dc

.DrawRectangleList

([(x,y

,width

,height

)],normal_pen

,brush)

3樓:捷郭

這個是syser核心偵錯程式的gui庫的demo 因為是應用層的demo 建立視窗確實用了winapi 建立最外面的視窗後獲取顯示區的buffer和引數後裡面的軟鍵盤啥的都是自己畫的確實沒呼叫任何系統相關繪圖api 如果是核心裡用只需要通過hook方式獲取顯示快取位址以及顯示相關引數後這個gui庫就是自封閉的不需要依賴任何系統相關的介面直接和顯示卡互動把介面畫上去

4樓:馬之人

樓主是想問這種程式吧?雖然執行在windows 上(xp 及舊版),但是它是個dos 程式,肯定沒用windows 的api,但它有圖形介面。

shanecoughlan/OpenGEM

5樓:雲天明

不用win32 api,用nt api(native api)不行麼……

按說lxss也是具備直接繪製圖形的能力的啊

win32 api說的是kernel32和user32等dll匯出的,用於win32 subsystem的api啊……

6樓:影子LEON

Windows平台不熟悉,不知道是否windows系統能否直接提供出一塊用來顯示的記憶體,如果可以的話完全可以用圖形庫繪製出乙個視窗出來。

對比android,只要拿到gralloc分配出來顯示buffer,在上面怎麼繪製介面你用什麼圖形庫都可以,老版本android用libskia,新版本用opengl es,或者你想用個什麼新的理論上都可以。

7樓:發發啊喂

你可以用Direct2D的介面來自己實現乙個繪製視窗. 這部分介面是CreateWindow 之外的. 雖然視窗是你實現的, 但是你顯示這個視窗的視窗還是要用CreateWindow.

8樓:龍泉寺掃地僧

顯然可以。

不但可以,而且挺有意義。

我大學的時候一直在研究這個問題,最後發現

syser這個核心單機偵錯程式做的最完善。

所以我去研究這個偵錯程式的實現,它的繪製部分是在核心裡通過hook dx驅動裡的api來寫屏,這個相容性最好,可以相容win7以上,以及各種顯示卡。我大學時候想過用hw相關api來寫屏,但相容性比較差。鍵盤滑鼠訊息也有很多方法,簡單點可以掛過濾驅動,複雜點可以hook中斷。

能寫屏能獲取訊息,剩下就是擼一套介面庫的事情了,我還試過把ucgui這個小嵌入式介面庫擼進核心裡,實現完全不依賴win的介面。另外還有幾個開源的核心偵錯程式也實現了,只是很粗糙,只畫了個字元介面。這方面syser實現的最完善,作者擼完後就去追逐人生其他理想了,讓人羨慕…

另外聽說冰刃作者後來也擼了套屌炸天的東西,可以在win裡跑起另外套核心,還能和win同時共存,不知最近咋樣了。

9樓:乾雨稠

請檢視 qtbase/src/plugins/platforms/windows/qwindowswindow.cpp 下的WindowCreationData::create函式實現,其實呼叫了windows原生API。

不光windows,qt在各個平台的原生API呼叫都可以在qtbase/src/plugins/platforms下找到。

10樓:素組公尺亞馬灑脫

繪製視窗的目的是什麼? 視覺化互動。

輸入-鍵盤滑鼠等。

輸出-螢幕。

而驅動這些硬體就是Windows在做的,如果你不想用win32 api就只能自己去驅動。

盜一張WPF的架構圖,處理輸入輸出的部分就在User 32裡如SDL就是對各平台底層api的封裝。

圖形部分簡單分為IMGUI和RMGUI兩種。

所以,用SDL做事件互動, 圖形部分自己寫乙個軟體渲染器,這樣就可以寫乙個自己覺得很厲害但根本沒人用的跨平台GUI了。

11樓:Godbird

如果你要追求奇淫巧技,可以嘗試在DeskTopWindow上繪製乙個視窗(或者說類似乙個視窗的東西),然後不停重新整理,當然,我覺得這樣做毫無意義。

12樓:諸葛不亮

誰說沒用,開源的庫,自己翻下QWidget和QWindow的原始碼不行麼?再不濟,全文搜尋下HWND不行麼?

不用系統api,不可能畫出東西的。要麼調系統的widget,要麼調gdi之類自行繪製

13樓:Belleve

我記得有幾個 XP 年代的彙編偵錯程式(似乎就是 ollydbg?)是直接操縱顯示卡繪圖的,對,直接疊繪在最上方

算不用 WINAPI 了吧

14樓:alphabet

可以計算機底層是如何訪問顯示卡的? http://www.

(分享自知乎網)

Windows是在Windows上開發出來的麼?

小亨利 看到這個問題我立刻回頭問了我們組乙個印度大哥。大哥曾在巨硬幹了十多年,從windows NT 3.1開始參與windows系統開發一直到windows 8。大哥快五十歲了。我 Quick question Guru,is Windows developed on Windows?大哥 Why...

在Windows上安裝Oracle VM VirtualBox Linux系統,共享目錄的原理是什麼?

肖騏 剛才特意跑去實驗了一下,VirtualBox 的目錄共享是不依賴網路的。注意一下你是怎麼掛載 VirtualBox 共享目錄的 mount t vboxsf share name mount point 這個命令背後的 backend 實際上就是 vboxsf,這是乙個核心模組,你 lsmod...

在 Windows 系統上做 Objective C 開發,要用到什麼工具?

傅晗 純學習objc,利用GNUstep就可以了。cygwin不好用像這類標頭檔案找不到。而GNUstep就很全了,而且自帶了乙個make巨集,編譯程式很方便 武龍飛 在windows下首先得配置開發環境,最要命的是速度非常慢,建議還是買個mac mini itouch 開發者帳戶,只有投資才有回報...