用java创建窗口程序,创建窗口的应用程序
創建窗口的應用程序
通過前面的基礎知識的學習,已經對ctypes庫的基本功能學會了使用,為了加強這種知識訓練,以及運用剛學習的知識的快樂,我們來創建一個稍稍復雜一點的應用程序。這個應用程序是所有后面應用程序的基礎,只有學會這個程序的基本原理,才可以更進一步學習WIN32的API程序開發。更何況后面所有程序都會在這個程序上修改而成,這個就相當你的爬向高樓頂層的第一個臺階。在所有工程技術里,都會從一個小小的演示程序開始,逐漸地增加功能,慢慢地變成一個強大的應用程序。如果發現這些API函數不清楚,可以參考我寫的另外一本書《Windows API一日一練》,在那本書里有完整的介紹和例子,不過這些例子使用C++來編寫的。
下面就來開始瀏覽整個程序的功能吧,第一步是先把ctypes庫導入,這樣才可以使用它的功能,并且還導入ctypes.wintypes,它有對應WIN32的類型,這樣使用起來更方便,比如消息結構MSG。這段代碼如下:
#windows應用程序
from ctypes import *
from ctypes.wintypes import *
接著下來定義一個Windows的窗口回調函數的原型,因為Windows指定了每個窗口都需要有一個窗口消息函數來處理窗口所有發生的事件消息,這樣你寫的應用程序才有機會去響應窗口所發生的事件或操作。這行代碼如下:
WNDPROCTYPE = WINFUNCTYPE(c_int, HWND, c_uint, WPARAM, LPARAM)
由于WIN32的定義常量全部是在C語言的頭文件里定義,要想在Python中直接使用是不行的。目前只有兩種方法,一個是使用一個轉換程序,把所有SDK里提供的頭文件進行轉換為Python定義的形式的模塊文件;另外一個就是自己使用到那些,就定義那些常量。本例子里,采用的是最后一種方法,使用到那些就定義就定義那些常量,這樣做是為了這個例子保持簡單,這些常量定義如下:
WS_EX_APPWINDOW = 0x40000
WS_OVERLAPPEDWINDOW = 0xcf0000
WS_CAPTION = 0xc00000
SW_SHOWNORMAL = 1
SW_SHOW = 5
CS_HREDRAW = 2
CS_VREDRAW = 1
CW_USEDEFAULT = 0x80000000
WM_DESTROY = 2
WHITE_BRUSH = 0
在這些常量主要是窗口的格式、樣式、以及顯示方式,還有一個消息定義和畫筆。由于每個新創建的窗口都需要在Windows里注冊唯一的名稱,以便創建時從系統內存里找到相應的窗口類,所有其它窗口可以以這個窗口為基本模板,復制N個相同的出來。每個窗口還有一個主題名稱,又叫做窗口名稱,這兩個定義常量如下:
#窗口類的名稱
wclassName = u'ShenzhenCai'
wname = u'Hello World'
第一個常量窗口類名稱,第二個常量是窗口顯示的標題。
窗口的格式、樣式通過定義一個結構的方式傳遞給WIN32的API函數,在這里定義窗口類的結構體如下:
#定義窗口類結構
class WNDCLASSEX(Structure):
_fields_ = [("cbSize", c_uint),
("style", c_uint),
("lpfnWndProc", WNDPROCTYPE),
("cbClsExtra", c_int),
("cbWndExtra", c_int),
("hInstance", HANDLE),
("hIcon", HANDLE),
("hCursor", HANDLE),
("hBrush", HANDLE),
("lpszMenuName", LPCWSTR),
("lpszClassName", LPCWSTR),
("hIconSm", HANDLE)]
這個窗口類的結構體與C語言里描述的結構體是一樣的,通過這樣定義,就可以給窗口說明窗口的類型了。具體每項的值,請參考《Windows API一日一練》。接著下來,查看窗口回調函數,這里定義了處理窗口收到消息。主要處理了當窗口關閉(WM_DESTROY)時就退出程序。調用API函數PostQuitMessage發送消息給主程序循環,需要結束應用程序了。其它的消息都是調用API函數DefWindowProcW來做默認的處理。
#窗口消息處理回調函數
def PyWndProc(hWnd, Msg, wParam, lParam):
if Msg == WM_DESTROY:
windll.user32.PostQuitMessage(0)
else:
return windll.user32.DefWindowProcW(hWnd, Msg, wParam, lParam)
return 0
接著下來是設置窗口類的屬性,注冊窗口的類型,以便后面可以創建這個窗口,這里主要是調用函數RegisterClassExW來實現。同時這里把前面的回調函數WndProc、程序實例句柄hInst、窗口類名稱wclassName組合一起了。
#初始化主窗口
def initwinclass(hInst, WndProc):
wndClass = WNDCLASSEX()
wndClass.cbSize = sizeof(WNDCLASSEX)
wndClass.style = CS_HREDRAW | CS_VREDRAW
wndClass.lpfnWndProc = WndProc
wndClass.cbClsExtra = 0
wndClass.cbWndExtra = 0
wndClass.hInstance = hInst
wndClass.hIcon = 0
wndClass.hCursor = 0
wndClass.hBrush = windll.gdi32.GetStockObject(WHITE_BRUSH)
wndClass.lpszMenuName = 0
wndClass.lpszClassName = wclassName
wndClass.hIconSm = 0
return windll.user32.RegisterClassExW(byref(wndClass))
窗口的回調函數已經定義,窗口類型又已經注冊,接著下來就是創建窗口,并把窗口顯示出來了,代碼如下:
#主函數入口
def main():
hInst = windll.kernel32.GetModuleHandleW(None)
WndProc = WNDPROCTYPE(PyWndProc)
if initwinclass(hInst, WndProc) <= 0:
return False
hWnd = windll.user32.CreateWindowExW(
0, wclassName, wname,
WS_OVERLAPPEDWINDOW | WS_CAPTION,
CW_USEDEFAULT, CW_USEDEFAULT,
800, 600, 0, 0, hInst, 0)
if not hWnd:
print('Failed to create window')
exit(0)
windll.user32.ShowWindow(hWnd, SW_SHOW)
windll.user32.UpdateWindow(hWnd)
msg = MSG()
lpmsg = pointer(msg)
print('Entering message loop')
while windll.user32.GetMessageW(lpmsg, 0, 0, 0) != 0:
windll.user32.TranslateMessage(lpmsg)
windll.user32.DispatchMessageW(lpmsg)
print('done.')
在這個主函數里,融合前面介紹內容。如果對前面介紹都比較了解,那么在這里就很容易理解它,如果還是不懂,請再查看前面的內容,多練習一下。GetModuleHandleW函數是用來獲取當前進程的實例句柄,WNDPROCTYPE是用來轉換回調函數,initwinclass函數是用來初始化窗口類型并注冊,CreateWindowExW函數是用來創建窗口,ShowWindow函數是用來顯示窗口出來,UpdateWindow是用來刷新窗口的顯示客戶區,pointer函數是用來轉換消息指針,GetMessageW函數是獲取窗口的消息,TranslateMessage函數是用來轉換消息,DispatchMessageW函數是把轉換后的消息發送到消息隊列。通過創建窗口、顯示窗口及更新窗口這三步曲,就完成窗口的顯示。后面通過消息循環處理,響應了窗口所有的事件處理。最后還差一個觸發這個主函數main的方式,它的實現如下:
if __name__ == "__main__":
print( "Win32 Application in python" )
main()
這里使用了Python的一個特性,當本文件最先運行加載時,就會設置當前文件運行的名稱為__main__屬性,這樣就會調用main函數運行了。當你運行這個例子時,最激動人心的時刻到來了,它運行的結果如下:
編程已經是目前的主流方向,正在學習編程的小伙伴們努力、加油吧。
http://www.dengb.com/Javabc/866195.htmlwww.dengb.comtruehttp://www.dengb.com/Javabc/866195.htmlTechArticle創建窗口的應用程序 通過前面的基礎知識的學習,已經對ctypes庫的基本功能學會了使用,為了加強這種知識訓練,以及運用剛學習的知識的...
總結
以上是生活随笔為你收集整理的用java创建窗口程序,创建窗口的应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java连接access_关于k8s下使
- 下一篇: keep行走和计步_App Store