首先你應(yīng)該建立一個(gè)WIN32程序項(xiàng)目,而不是控制臺(tái)項(xiàng)目。在添加這些代碼:#include#include#include#include#definepi3.1415LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函數(shù)說(shuō)明//--------------------以下初始化窗口類-----------------//intWINAPIWinMain(HINSTANCEhInstance,//WinMain函數(shù)說(shuō)明HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){HWNDhwnd;MSGMsg;WNDCLASSwndclass;charlpszClassName[]="窗口";//窗口類名charlpszTitle[]="窗口示例程序";//窗口標(biāo)題名//窗口類的定義wndclass.style=0;//窗口類型為默認(rèn)類型wndclass.lpfnWndProc=WndProc;//窗口處理函數(shù)為WndProcwndclass.cbClsExtra=0;//窗口類無(wú)擴(kuò)展wndclass.cbWndExtra=0;//窗口實(shí)例無(wú)擴(kuò)展wndclass.hInstance=hInstance;//當(dāng)前實(shí)例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//使用默認(rèn)圖標(biāo)wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//窗口采用箭頭光標(biāo)wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景為白色wndclass.lpszMenuName=NULL;//窗口中無(wú)菜單wndclass.lpszClassName=lpszClassName;//窗口類名為“窗口示例”//--------------------以下進(jìn)行窗口類的注冊(cè)-------------if(!RegisterClass(wndclass))//若注冊(cè)失敗則發(fā)出警告聲音{MessageBeep(0);returnFALSE;}//創(chuàng)建窗口操作hwnd=CreateWindow(lpszClassName,//窗口類名lpszTitle,//窗口實(shí)例的標(biāo)題名WS_OVERLAPPEDWINDOW,//窗口的風(fēng)格CW_USEDEFAULT,CW_USEDEFAULT,//窗口左上角的坐標(biāo)為默認(rèn)值CW_USEDEFAULT,CW_USEDEFAULT,//窗口的高和寬為默認(rèn)值NULL,//此窗口無(wú)父窗口NULL,//此窗口無(wú)主菜單hInstance,//應(yīng)用程序的當(dāng)前句柄NULL);//不使用該值ShowWindow(hwnd,nCmdShow);//顯示窗口UpdateWindow(hwnd);//繪制用戶區(qū)while(GetMessage(Msg,NULL,0,0))//消息循環(huán){TranslateMessage(Msg);DispatchMessage(Msg);}returnMsg.wParam;//程序終止時(shí)將信息返回系統(tǒng)}//窗口函數(shù)LRESULTCALLBACKWndProc(HWNDhWnd,UINTiMessage,WPARAMwParam,LPARAMlParam){switch(iMessage){//此處添加消息處理代碼}switch(iMessage){caseWM_DESTROY:PostQuitMessage(0);//調(diào)用該函數(shù)發(fā)出WM_QUIT消息default:returnDefWindowProc(hWnd,iMessage,wParam,lParam);}return0;}
創(chuàng)新互聯(lián)公司專注于延平網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供延平營(yíng)銷型網(wǎng)站建設(shè),延平網(wǎng)站制作、延平網(wǎng)頁(yè)設(shè)計(jì)、延平網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造延平網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供延平網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
cobra是一個(gè)提供簡(jiǎn)單接口來(lái)創(chuàng)建強(qiáng)大的現(xiàn)代CLI界面的庫(kù)類似git git tools,cobra也是一個(gè)應(yīng)用程序,它會(huì)生成你的應(yīng)用程序的腳手架來(lái)快速開發(fā)基于cobra的應(yīng)用程序
cobra提供:
cobra建立在命令、參數(shù)、標(biāo)志的結(jié)構(gòu)之上
commands代表動(dòng)作,args是事物,flags是動(dòng)作的修飾符
最好的應(yīng)用程序在使用時(shí)讀起來(lái)就像句子,因此,用戶直觀地知道如何與它們交互
模式如下:APPNAME VERB NOUN --ADJECTIVE. or APPNAME COMMAND ARG --FLAG(APPNAME 動(dòng)詞 名詞 形容詞 或者 APPNAME 命令 參數(shù) 標(biāo)志)
一些真實(shí)世界的好例子可以更好地說(shuō)明這一點(diǎn)
kubectl 命令更能體現(xiàn)APPNAME 動(dòng)詞 名詞 形容詞
如下的例子,server 是command,port是flag
這個(gè)命令中,我們告訴git 克隆url
命令是應(yīng)用程序的中心點(diǎn),應(yīng)用程序支持的每一個(gè)交互都包含在一個(gè)命令中,命令可以有子命令,也可以運(yùn)行操作
在上面的例子中,server是命令
更多關(guān)于cobra.Command
flag是一種修改命令行為的方式,cobra支持完全兼容POSIX標(biāo)志,也支持go flag package,cobra可以定義到子命令上的標(biāo)志,也可以僅對(duì)該命令可用的標(biāo)志
在上面的命令中,port是標(biāo)志
標(biāo)志的功能由 pflag library 提供,pflag library是flag標(biāo)準(zhǔn)庫(kù)的一個(gè)分支,在添加POSIX兼容性的同時(shí)維護(hù)相同的接口。
使用cobra很簡(jiǎn)單,首先,使用go get按照最新版本的庫(kù),這個(gè)命令會(huì)安裝cobra可執(zhí)行程序以及庫(kù)和依賴項(xiàng)
下一步,引入cobra到應(yīng)用程序中
雖然歡迎您提供自己的組織,但通常基于Cobra的應(yīng)用程序?qū)⒆裱韵陆M織結(jié)構(gòu):
在Cobra應(yīng)用程序中,main.go文件通常非常簡(jiǎn)單。它有一個(gè)目的:初始化Cobra。
使用cobra生成器
cobra提供了程序用來(lái)創(chuàng)建你的應(yīng)用程序然后添加你想添加的命令,這是將cobra引入應(yīng)用程序最簡(jiǎn)單的方式
這兒 你可以發(fā)現(xiàn)關(guān)于cobra的更多信息
要手動(dòng)實(shí)現(xiàn)cobra,需要?jiǎng)?chuàng)建一個(gè)main.go 和rootCmd文件,可以根據(jù)需要提供其他命令
Cobra不需要任何特殊的構(gòu)造器。只需創(chuàng)建命令。
理想情況下,您可以將其放在app/cmd/root.go中:
在init()函數(shù)中定義標(biāo)志和處理配置
例子如下,cmd/root.go:
創(chuàng)建main.go
使用root命令,您需要讓主函數(shù)執(zhí)行它。為清楚起見,Execute應(yīng)該在根目錄下運(yùn)行,盡管它可以在任何命令上調(diào)用。
在Cobra應(yīng)用程序中,main.go文件通常非常簡(jiǎn)單。它有一個(gè)目的:初始化Cobra。
可以定義其他命令,通常每個(gè)命令在cmd/目錄中都有自己的文件。
如果要?jiǎng)?chuàng)建版本命令,可以創(chuàng)建cmd/version.go并用以下內(nèi)容填充它:
如果希望將錯(cuò)誤返回給命令的調(diào)用者,可以使用RunE。
然后可以在execute函數(shù)調(diào)用中捕獲錯(cuò)誤。
標(biāo)志提供修飾符來(lái)控制操作命令的操作方式。
由于標(biāo)志是在不同的位置定義和使用的,因此我們需要在外部定義一個(gè)具有正確作用域的變量來(lái)分配要使用的標(biāo)志。
有兩種不同的方法來(lái)分配標(biāo)志。
標(biāo)志可以是“持久”的,這意味著該標(biāo)志將可用于分配給它的命令以及該命令下的每個(gè)命令。對(duì)于全局標(biāo)志,在根上指定一個(gè)標(biāo)志作為持久標(biāo)志。
也可以在本地分配一個(gè)標(biāo)志,該標(biāo)志只應(yīng)用于該特定命令。
默認(rèn)情況下,Cobra只解析目標(biāo)命令上的本地標(biāo)志,而忽略父命令上的任何本地標(biāo)志。通過(guò)啟用Command.TraverseChildren,Cobra將在執(zhí)行目標(biāo)命令之前解析每個(gè)命令上的本地標(biāo)志。
使用viper綁定標(biāo)志
在本例中,持久標(biāo)志author與viper綁定。注意:當(dāng)用戶未提供--author標(biāo)志時(shí),變量author將不會(huì)設(shè)置為config中的值。
更多關(guān)于 viper的文檔
Flags默認(rèn)是可選的,如果希望命令在未設(shè)置標(biāo)志時(shí)報(bào)告錯(cuò)誤,請(qǐng)根據(jù)需要進(jìn)行標(biāo)記:
持久性Flags
可以使用命令的Args字段指定位置參數(shù)的驗(yàn)證。
內(nèi)置了以下驗(yàn)證器:
在下面的示例中,我們定義了三個(gè)命令。兩個(gè)是頂級(jí)命令,一個(gè)(cmdTimes)是頂級(jí)命令之一的子命令。在這種情況下,根是不可執(zhí)行的,這意味著需要一個(gè)子命令。這是通過(guò)不為“rootCmd”提供“Run”來(lái)實(shí)現(xiàn)的。
我們只為一個(gè)命令定義了一個(gè)標(biāo)志。
有關(guān)標(biāo)志的更多文檔,請(qǐng)?jiān)L問(wèn)
對(duì)于一個(gè)更完整的例子更大的應(yīng)用程序,請(qǐng)檢查 Hugo 。
當(dāng)您有子命令時(shí),Cobra會(huì)自動(dòng)將help命令添加到應(yīng)用程序中。當(dāng)用戶運(yùn)行“應(yīng)用程序幫助”時(shí),將調(diào)用此函數(shù)。此外,help還支持所有其他命令作為輸入。例如,您有一個(gè)名為“create”的命令,沒有任何附加配置;調(diào)用“app help create”時(shí),Cobra將起作用。每個(gè)命令都會(huì)自動(dòng)添加“-help”標(biāo)志。
以下輸出由Cobra自動(dòng)生成。除了命令和標(biāo)志定義之外,不需要任何東西。
幫助就像其他命令一樣。它周圍沒有特殊的邏輯或行為。事實(shí)上,你可以提供你想提供的。
您可以為默認(rèn)命令提供自己的幫助命令或模板,以用于以下功能:
當(dāng)用戶提供無(wú)效的標(biāo)志或無(wú)效的命令時(shí),Cobra通過(guò)向用戶顯示“用法”來(lái)響應(yīng)。
你可以從上面的幫助中認(rèn)識(shí)到這一點(diǎn)。這是因?yàn)槟J(rèn)幫助將用法作為其輸出的一部分嵌入。
您可以提供自己的使用函數(shù)或模板供Cobra使用。與幫助一樣,函數(shù)和模板也可以通過(guò)公共方法重寫:
如果在root命令上設(shè)置了version字段,Cobra會(huì)添加一個(gè)頂級(jí)的'--version'標(biāo)志。運(yùn)行帶有“-version”標(biāo)志的應(yīng)用程序?qū)⑹褂冒姹灸0鍖姹敬蛴〉綐?biāo)準(zhǔn)輸出??梢允褂胏md.SetVersionTemplate(s string)函數(shù)自定義模板。
可以在命令的主運(yùn)行函數(shù)之前或之后運(yùn)行函數(shù)。PersistentPreRun和PreRun函數(shù)將在運(yùn)行之前執(zhí)行。PersistentPostRun和PostRun將在運(yùn)行后執(zhí)行。如果子函數(shù)不聲明自己的函數(shù),則它們將繼承Persistent*Run函數(shù)。這些函數(shù)按以下順序運(yùn)行:
輸出:
當(dāng)發(fā)生“未知命令”錯(cuò)誤時(shí),Cobra將打印自動(dòng)建議。這使得Cobra在發(fā)生拼寫錯(cuò)誤時(shí)的行為類似于git命令。例如:
基于注冊(cè)的每個(gè)子命令和Levenshtein距離的實(shí)現(xiàn),建議是自動(dòng)的。匹配最小距離2(忽略大小寫)的每個(gè)已注冊(cè)命令都將顯示為建議。
如果需要在命令中禁用建議或調(diào)整字符串距離,請(qǐng)使用:
or
您還可以使用SuggestFor屬性顯式設(shè)置將為其建議給定命令的名稱。這允許對(duì)在字符串距離方面不接近的字符串提供建議,但在您的一組命令中是有意義的,并且對(duì)于某些您不需要?jiǎng)e名的字符串。例子:
Cobra可以基于子命令、標(biāo)志等生成文檔。請(qǐng)?jiān)?docs generation文檔 中閱讀更多關(guān)于它的信息。
Cobra可以為以下shell生成shell完成文件:bash、zsh、fish、PowerShell。如果您在命令中添加更多信息,這些補(bǔ)全功能將非常強(qiáng)大和靈活。在 Shell Completions 中閱讀更多關(guān)于它的信息。
Cobra is released under the Apache 2.0 license. See LICENSE.txt
go 可以開發(fā)桌面應(yīng)用,但并不是很舒適。
可以使用的GUI庫(kù)有:
1、goqt,LiteIDE作者出品,Go和QT的綁定,還未發(fā)布
2、go.uik,純Go實(shí)現(xiàn)的并發(fā)UI工具
3、walk,Windows Application Library Kit
4、gform,Windows GUI framework
目前的話walk用得比較多
不過(guò)go的GUI庫(kù)用起來(lái)沒有C#、C/C++的那么順手。
這個(gè)問(wèn)題不久之后應(yīng)該會(huì)有所改善,畢竟用Go開發(fā)桌面的需求在不斷增加。
目前我采用的是用go http 做后端,Webkit+HTML5 做界面,表現(xiàn)力很好,前端不需要學(xué)習(xí)新知識(shí),一般的管理類應(yīng)用都能搞定。
先給出項(xiàng)目地址:
lazygit 是一個(gè)用于 Git 命令行的簡(jiǎn)單終端 UI,使用 Go 語(yǔ)言編寫,用到了 gocui 庫(kù),目的是在命令行提供 Git 的圖形界面。lazygit 讓你有一種源自 Sourcetree 的感覺,但是在以終端為中心的環(huán)境中。Lazygit 快速且易于使用,你只需在 git 存儲(chǔ)庫(kù)中的終端中調(diào)用 lazygit 即可。lazygit 可以在Linux、macOS、FreeBSD和Windows上運(yùn)行。
還記得咱們之前推薦的 Go 語(yǔ)言實(shí)現(xiàn)的帥帥的 Docker 終端 UI:lazydocker嗎?這是同一個(gè)作者哦,lazygit 的 star 數(shù)達(dá)到 12.5k+。
看下作者錄制的視頻:
是不是挺棒的!
可以直接在這里下載二進(jìn)制文件 ,或者按照如下方式安裝,比如 Mac 下通過(guò) Homebrew 安裝
沖突解決
Interactive Rebasing
趕緊試試吧~