<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      用Go寫Windows桌面應用 - 使用窗體設(shè)計器

      目前來說,用Go寫Windows應用還沒有非常成熟的設(shè)計器,習慣了C#那種強大的IDE,再過來看會覺得一朝回到解放前。而且gform現(xiàn)在的設(shè)計思路需要使用者對win32 api非常熟悉,否則用起來會非常難受。吐舌笑臉 這也是我一直在想改善方案的地方,畢竟一個類庫要以好用為目標,只是我充滿了OO思想的頭腦還沒有完全適應Go的設(shè)計方式,很多以前信手拈來的思路用到Go上就會出現(xiàn)問題,或者就算套上去了也會覺得與語言格格不入。最明顯就是在努力了兩周之后,我突然發(fā)現(xiàn)竟然在模擬類的繼承,天!當時就感覺真的需要停下來了,否則按照現(xiàn)在的慣性做出來的東西肯定一塌糊涂。

      關(guān)于gform這個框架我的思考還在繼續(xù)進行,在弄清楚到底怎樣才是Go的設(shè)計模式之后,我相信會對它進行一次大的重構(gòu)。

      好了,現(xiàn)在進入正題,用窗體設(shè)計器做界面。原理是還是MFC的老方法,在資源文件中做好對話框設(shè)計,然后在運行時attach上去。

      打開ResEdit,添加一個對話框,然后在上面放好各種控件。下圖中是一個我做的小工具的實際例子。

      image

      其中,為每個控件都設(shè)置一個有意義的ID。比如,上圖中“過濾”右邊的文本框,ID為“IDC_FILTER”。

      保存之后會發(fā)現(xiàn),ResEdit自動生成了一個與資源文件同名的頭文件,如下所示。

      image

      打開這個頭文件,發(fā)現(xiàn)里面其實只是簡單的定義了控件ID的值,如下所示。

      image

      我們現(xiàn)在新建一個go文件,叫做app.go,把頭文件中的常量定義全都復制進來,變成Go的常量定義,比如:

      const (
          IDD_DIALOG1  = 104
          IDC_CLOSE= 1006
      )

      可以看到,對話框的ID是IDD_DIALOG1,好,我們現(xiàn)在可以用gform.NewDialogFromResId來把這個對話框讀取出來。

      func main() {
          gform.Init()

          mainform := gform.NewDialogFromResId(nil, IDD_DIALOG1)
          mainform.Show()

          gform.RunMainLoop()
      }

      運行一下看看,怎么樣?看到窗體了吧。現(xiàn)在來試試相應按鈕的事件,使用gform.AttachPushButton,之后相應OnLBUp(On Left Button Up即當鼠標左鍵彈起時)。

      btnClose = gform.AttachPushButton(mainform, IDC_CLOSE)
      btnClose.OnLBUp().Attach(btnClose_OnLBUp)

       

      func btnClose_OnLBUp(arg *gform.EventArg) {

      //事件響應代碼寫在這里

      }

      gform中的事件響應函數(shù)很想C#中的委托,每個事件都可以Attach多個事件處理函數(shù),事件激發(fā)是會單線程依次調(diào)用。而事件響應函數(shù)只有一個參數(shù),讓我們來看看gform.EventArg的定義。

      type EventArg struct {
          sender Controller
          data interface{}
      }

      sender顧名思義,代表激發(fā)事件的控件。data里面附帶的就是事件信息,比如,鼠標按鍵事件,data就是MouseEventData類型,定義如下。

      type MouseEventData struct {
          X, Y   int
          Button int
          Wheel  int
      }

      其他的事件都有自己的事件數(shù)據(jù),這里就不一一例舉了。Go的interface{}挺好用的,加上它的靜態(tài)類型檢查,很安全、高效。

       

      這樣就完成了,目前gform支持Label、Button、Combobox、Edit、ListView、ProgressBar(因為我寫的小工具僅用到了這幾個控件微笑)。之后支持的控件會慢慢變多。

      下一篇會講到如何自定義控件,先秀一下近期正在做的小軟件的界面,還遠遠沒有完工,但我自己挺滿意的。呵呵

      image

      posted @ 2012-02-28 22:14  AllenDang  閱讀(9536)  評論(23)    收藏  舉報
      主站蜘蛛池模板: 性色av一区二区三区精品| 大名县| 狠狠亚洲色一日本高清色| 中文字幕日韩一区二区三区不卡| 日日碰狠狠添天天爽五月婷| 欧美成人精品高清在线播放| 亚洲成在人线在线播放无码| 国产综合精品一区二区三区| 国产伦精品一区二区三区| 日本边添边摸边做边爱喷水| 亚洲精品国产美女久久久| 扒开双腿猛进入喷水高潮叫声| 久久热这里只有精品66| 色香欲天天影视综合网| 高清精品一区二区三区| 亚洲精品天堂在线观看| 亚洲爆乳成av人在线视菜奈实| 亚洲男女羞羞无遮挡久久丫| 久久精品国产99久久久古代| 久久天天躁夜夜躁狠狠85| 国产亚洲精品成人av久| 樱花草在线社区WWW韩国| 国产成人午夜福利精品| 国产又色又爽又黄的| 精品无码久久久久久尤物| 亚洲精品理论电影在线观看| 自拍视频在线观看成人| 日韩精品亚洲专在线电影| 99国产精品久久久久久久日本竹| 人人妻人人澡人人爽| 国产午夜福利在线观看播放| 男女扒开双腿猛进入爽爽免费看| 呼和浩特市| 自拍偷拍第一区二区三区| 欧美不卡无线在线一二三区观| 乌克兰美女浓毛bbw| 色呦呦九九七七国产精品| 国产精品一区中文字幕| 国产精品一区中文字幕| 丁香婷婷综合激情五月色| 国产精品多p对白交换绿帽|