Golang、python在window下設計界面UI第一節。

提及界面,這是一道坎,有人或許會說,GO爲何要寫界面UI呢,這原本不是GO擅長的部分,也不是GO該乾的事情,這句話我就不愛聽了。linux

舉個列子,好比咱們用GO語言寫個服務器,這個服務器就是用做直播視頻聊天的服務器,它的功能包含直播房間在線列表人員,固然GO語言設計的時候,服務器記錄了在線列表的 userId、roomId、token、level、ip、chatConent等等。好比咱們要監視某個房間的人員列表,看他是否用協議刷了人氣,其實就是統計一個IP上有多少賬號,或者監控房間裏面是否有機器人在發言,並隨時封禁它,或者統計在線直播列表的人數等等,咱們用命令行是可以操做上述的東西,可是這麼多的動做你能記得住那麼多的命令嗎?git

並且上述那麼多的東西顯示在黑色框子裏面,眼睛看久了不累嗎?一旦命令行用錯了,承擔起後果嗎?github

在命令行裏面去選擇一個用戶或者房間那是一件多麼痛苦的事情啊。golang

並且這些後臺管理員又不是技術人員,極可能會出錯。web

所以界面是必須有的。windows

GO語言中選擇界面是一件糾結的事情,github上面GO-UI要麼項目幾年沒人更新了,要麼簡單的功能讓人很少看一眼。服務器

好比 谷歌自帶gxui已經死掉了,goqt的下載一大堆的東西去配置,go-gtk配置也麻煩,並且功能也是簡單。ui

假如在linux下,我建議仍是選擇後面的兩個,那是沒得選擇的選擇。命令行

在WINODWS 目前推薦https://github.com/lxn/walk 這個東西,目前在GITHUB上最新的版本是須要GO1.8去構建的,不然百分百會出錯。設計

下載下來看下demo

有複製粘帖、數據綁定、圖片顯示、webkit、繪圖、listbox、托盤、tab、滑動條、拖動文件、進度條、按鈕、選擇框、單選框等等。功能挺全面的,能夠去實驗下。

 

先來了解下句柄,什麼叫作句柄?句柄能夠說是windows上集合全部打開了的界面程序上的控件ID同樣,表明了惟一身份,其實底層仍是指針,每次打開程序,句柄由系統隨機分配命名,不存在兩個句柄是同樣的。句柄包含了窗口句柄和控件句柄。

walk下載下來的包這麼小,並且編譯出來的程序也這麼小,那就確定是調用了WINDOWS內置的一些com組件和active控件,這些東西存在於DLL中,通常位於在system32目錄下或者程序運行的當前目錄下,像QT5這些不是調用window內置的,所以QT編譯出來的程序是找不到控件句柄的。好比QQ、YY、迅雷這些軟件是找不到控件的句柄的,只能找到窗口句柄,由於這些控件是DX畫出來了。

句柄是一個相似整數同樣的數值。

在windows設計不一樣語言的交互的時候,dll文件是一條逃不過去的坑,先來看下C/C++、GO的類型不一樣的定義

 

Win32 C/C++ golang 字符對照表

    WIN32類型        C/C++ 類型            GO 類型     HANDLE             void *                    uintptr     BYTE                  unsigned char        uint8, byte     SHORT               short                      int16     WORD               unsigned short       uint16     INT                    int                          int32, int     UINT                 unsigned int           uint32     LONG                long                       int32     BOOL                int                           int     DWORD            unsigned long         uint32     ULONG             unsigned long         uint32     CHAR                char                        byte     WCHAR             wchar_t                   uint16     LPSTR                utf8/char *              *byte     LPCSTR              const utf8/char *     *byte, syscall.StringBytePtr(), xc.UTF8PtrToSting()     LPWSTR             wchar_t *                 *uint16     LPCWSTR           const wchar_t *        *uint16, syscall.StringToUTF16Ptr()     FLOAT               float                          float32     DOUBLE            double                      float64     LONGLONG       __int64                       int64     DWORD64         unsigned __int64        uint64

相關文章
相關標籤/搜索