在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【產(chǎn)品應(yīng)用】用 AWTK 和 AWPLC 快速開(kāi)發(fā)嵌入式應(yīng)用程序 (4)- 自定義功能塊(上)

ZLG致遠(yuǎn)電子 ? 2022-11-02 09:56 ? 次閱讀

AWPLC 是 ZLG 自主研發(fā)的 PLC 系統(tǒng)(兼容 IEC61131-3),本文用定時(shí)器為例介紹一下如何擴(kuò)展自定義功能塊。

d64143d8-578f-11ed-b116-dac502259ad0.jpg 背景

AWTK 全稱(chēng) Toolkit AnyWhere,是 ZLG 開(kāi)發(fā)的開(kāi)源 GUI 引擎,旨在為嵌入式系統(tǒng)、WEB、各種小程序、手機(jī)和 PC 打造的通用 GUI 引擎,為用戶(hù)提供一個(gè)功能強(qiáng)大、高效可靠、簡(jiǎn)單易用、可輕松做出炫酷效果的 GUI 引擎。

AWPLC 是 ZLG 自主研發(fā)的 PLC 系統(tǒng)(兼容 IEC61131-3),其中 AWPLC 的運(yùn)行時(shí)庫(kù)(Runtime)基于 ZLG TKC 開(kāi)發(fā),可以移植到到任何主流 RTOS嵌入式系統(tǒng)。AWPLC 的集成開(kāi)發(fā)環(huán)境(IDE)基于 AWTK 開(kāi)發(fā),可以運(yùn)行在 Windows、MacOS 和 Linux 系統(tǒng)之上。AWPLC 的主要目標(biāo)之一是把 PLC 中低代碼開(kāi)發(fā)方法引入到嵌入式軟件,從而提高嵌入式軟件的開(kāi)發(fā)效率和可靠性。

d64143d8-578f-11ed-b116-dac502259ad0.jpg 簡(jiǎn)介

在前一篇文章中,我們說(shuō)過(guò),AWPLC 的重要特色之一就是高度可擴(kuò)展,而且會(huì)內(nèi)置 ZLG 多年在嵌入式系統(tǒng)開(kāi)發(fā)中積累的功能塊,包括各種算法、協(xié)議和實(shí)用功能,這將大大簡(jiǎn)化嵌入式軟件的開(kāi)發(fā)。

那怎么去開(kāi)發(fā)自定義的功能塊呢?本文以 ZTIMER 為例介紹一下開(kāi)發(fā)自定義功能塊的方法。ZTIMER 是一個(gè)帶計(jì)數(shù)功能的定時(shí)器,在前一篇文章中,我們用它實(shí)現(xiàn)了一個(gè)走馬燈的演示,其使用方法如下:

d64dfbe6-578f-11ed-b116-dac502259ad0.png

在 AWPLC 中,自定義功能塊和內(nèi)置功能塊具有同等待遇,因?yàn)樗鼈兌际前赐瑯拥姆绞郊尤脒M(jìn)來(lái)的。在進(jìn)入正題前,我們先聊一下,系統(tǒng)的可擴(kuò)展性以及實(shí)現(xiàn)方法。1.可擴(kuò)展性的好處在設(shè)計(jì)一個(gè)復(fù)雜軟件的架構(gòu)時(shí),可擴(kuò)展性是必須考慮的因素。可擴(kuò)展性至少帶來(lái)以下幾個(gè)好處:

  • 可擴(kuò)展性將軟件的框架與具體的實(shí)現(xiàn)分離開(kāi)來(lái),有助于降低系統(tǒng)的復(fù)雜度。系統(tǒng)的復(fù)雜性太高,會(huì)帶來(lái)一系列的問(wèn)題,比如讓可理解性、可維護(hù)性和可靠性的降低,很多項(xiàng)目因此陷入無(wú)法掙脫的焦油坑里,最后士氣低落,人員流失,項(xiàng)目取消,公司蒙受巨大損失。在設(shè)計(jì)復(fù)雜軟件時(shí),一定要存有敬畏之心;
  • 可擴(kuò)展性將軟件變化的部分隔離開(kāi)來(lái),不但可以讓擴(kuò)展的功能獨(dú)立變化,也可以方便的擴(kuò)展新功能。在 AWPLC 中,以后會(huì)擴(kuò)展各種協(xié)議和算法的功能塊,必須保證 AWPLC 框架和這些擴(kuò)展的功能塊是獨(dú)立的,才能讓開(kāi)發(fā)工作順利進(jìn)行;
  • 可擴(kuò)展性有利于團(tuán)隊(duì)的協(xié)作。不同的通訊協(xié)議和算法,需要不同團(tuán)隊(duì)的專(zhuān)家去開(kāi)發(fā),可擴(kuò)展性讓大家只要按相應(yīng)的接口去實(shí)現(xiàn),就可以方便的集成起來(lái),不需要太多跨團(tuán)隊(duì)的交互。

2.如何保證可擴(kuò)展性

讓軟件系統(tǒng)具有可擴(kuò)展性,通常并不是什么難事,只要做到下面兩點(diǎn)就可以了:

  • 針對(duì)接口編程。這個(gè)是大家都知道的,在《軟件設(shè)計(jì)模式》等書(shū)里,都反復(fù)強(qiáng)調(diào)了,這里不再贅述;
  • 利用工廠模式隔離組件的創(chuàng)建。工廠模式也是人人都知道的,而且大家都覺(jué)得很"簡(jiǎn)單"。但是能把工廠模式用好的程序員其實(shí)并不多見(jiàn),一個(gè)主要原因就是很多人只會(huì)套用《軟件設(shè)計(jì)模式》的工廠模式,而《軟件設(shè)計(jì)模式》里幾個(gè)工廠模式在現(xiàn)實(shí)中并不實(shí)用。利用這些這些工廠模式,無(wú)法滿(mǎn)足 SOLID 原則中的開(kāi)放封閉原則,增加一個(gè)新的擴(kuò)展時(shí),仍然需要修改對(duì)應(yīng)的工廠。

d64143d8-578f-11ed-b116-dac502259ad0.jpg AWPLC功能塊的接口

要讓 AWPLC 支持?jǐn)U展各種自定義的功能塊,首要條件條件是定義好功能塊的接口。

1.功能塊的基類(lèi)在面向?qū)ο蟮?C 語(yǔ)言編程中,我們用結(jié)構(gòu)(struct)來(lái)模擬類(lèi)和接口。這里所說(shuō)的接口是廣義的接口,而不是 C++或其它語(yǔ)言中只包含純虛函數(shù)的 interface,因?yàn)槌颂摵瘮?shù)指針外,這里還有一些數(shù)據(jù)成員。

/**
*@classaw_plc_fb_t
* AWPLC 功能塊接口。
*/
struct_aw_plc_fb_t{
/**
*@property{bool_t}en
*是否啟用。
*/
uint8_ten:1;
/**
*@property{bool_t}eno
*是否啟用輸出。
*/
uint8_teno:1;

/*private*/
constaw_plc_fb_vtable_t*vt;

};

2.功能塊的虛函數(shù)

在功能塊的虛函數(shù)表中,還定義了一些描述性的常量,讓對(duì)象具有一點(diǎn)反射的能力,方便在運(yùn)行時(shí)查詢(xún)它的一些狀態(tài)。順便說(shuō)一下,在定義接口的虛函數(shù)時(shí),通常不會(huì)有創(chuàng)建函數(shù),因?yàn)閯?chuàng)建之前對(duì)象之前,是拿不到這個(gè)虛表對(duì)象的。但也不是絕對(duì)的,有時(shí)為了方便 clone,也可能提供一個(gè) clone 函數(shù)或者 create 函數(shù)。

任何接口都要定義析構(gòu)函數(shù)(destroy),在對(duì)象需要銷(xiāo)毀時(shí),框架可以以統(tǒng)一的方式銷(xiāo)毀它。

typedefstruct_aw_plc_fb_vtable_t{
/*功能塊的類(lèi)型名*/
constchar*type;
/*輸入?yún)?shù)名稱(chēng)列表,以NULL結(jié)束的字符串?dāng)?shù)組*/
constchar*const*ins;
/*輸出參數(shù)名稱(chēng)列表,以NULL結(jié)束的字符串?dāng)?shù)組*/
constchar*const*outs;
/*輸入輸出參數(shù)名稱(chēng)列表,以NULL結(jié)束的字符串?dāng)?shù)組*/
constchar*const*in_outs;
/*執(zhí)行函數(shù)*/
aw_plc_fb_exec_texec;
/*執(zhí)行函數(shù)(帶參數(shù))*/
aw_plc_fb_exec_ex_texec_ex;
/*獲取屬性(輸入輸出參數(shù))的值*/
aw_plc_fb_get_prop_tget_prop;
/*獲取輸出的值*/
aw_plc_fb_get_output_tget_output;
/*設(shè)置輸出的值*/
aw_plc_fb_set_input_tset_input;
/*析構(gòu)函數(shù)*/
aw_plc_fb_destroy_tdestroy;

}aw_plc_fb_vtable_t;

* 這個(gè)虛函數(shù)表和 AWTK/TKC 中的 object 虛函數(shù)表很相似,考慮到 object 為了做得通用,有點(diǎn)臃腫了,所以決定重新定義一套。


d64143d8-578f-11ed-b116-dac502259ad0.jpg AWPLC功能塊的工廠

前面我們說(shuō)過(guò),可擴(kuò)展性除了針對(duì)接口編程外,離不開(kāi)工廠模式的支持。功能塊的工廠其任務(wù)當(dāng)然是創(chuàng)建功能塊了,所以提供了一個(gè)創(chuàng)建功能塊的函數(shù)。參數(shù) type 指定功能塊的類(lèi)型,函數(shù)返回對(duì)應(yīng)類(lèi)型的功能塊:

/**
*@methodaw_plc_fb_factory_create_fb
*創(chuàng)建 fb。
*@param {const char*} type 類(lèi)型。
*
*@return {aw_plc_fb_t*}返回 fb 對(duì)象。
*/

aw_plc_fb_t*aw_plc_fb_factory_create_fb(constchar*type);

有了這個(gè)創(chuàng)建函數(shù),確實(shí)把創(chuàng)建任務(wù)與功能塊的實(shí)現(xiàn)分開(kāi)了。但是請(qǐng)想一下,如果每次增加新的功能塊,都要修改這個(gè)創(chuàng)建函數(shù),而這個(gè)函數(shù)又屬于框架的一部分,框架是不是還是依賴(lài)于具體實(shí)現(xiàn)了呢?為了解決這個(gè)問(wèn)題,我們需要提供一種注冊(cè)機(jī)制來(lái)實(shí)現(xiàn)依賴(lài)倒置,讓功能塊的實(shí)現(xiàn)者主動(dòng)將創(chuàng)建函數(shù)注冊(cè)進(jìn)來(lái):

/**
*@methodaw_plc_fb_factory_register
*注冊(cè)創(chuàng)建函數(shù)。
*@param {const char*} type 類(lèi)型。
*@param {aw_plc_fb_create_t} create 創(chuàng)建函數(shù)。
*
*@return {ret_t}返回 RET_OK 表示成功,否則表示失敗。
*/

ret_taw_plc_fb_factory_register(constchar*type,aw_plc_fb_create_tcreate);

這種機(jī)制非常好用,真正滿(mǎn)足了 SOLID 原則中的開(kāi)放封閉原則(OCP):擴(kuò)展新的功能無(wú)需修改框架代碼。在 ZLG 開(kāi)源 GUI 引擎中,也大量使用了這種帶注冊(cè)功能的工廠模式,有興趣的朋友可以去看看 AWTK 的代碼。


d64143d8-578f-11ed-b116-dac502259ad0.jpg ZTIMER

前面我們說(shuō)過(guò),可擴(kuò)展性除了針對(duì)接口編程外,離不開(kāi)工廠模式的支持。功能塊的工廠其任務(wù)當(dāng)然是創(chuàng)建功能塊了,所以提供了一個(gè)創(chuàng)建功能塊的函數(shù)。參數(shù) type 指定功能塊的類(lèi)型,函數(shù)返回對(duì)應(yīng)類(lèi)型的功能塊:

1.ZTIMER的結(jié)構(gòu)

在 C 語(yǔ)言中,一般用結(jié)構(gòu)來(lái)模擬類(lèi),把基類(lèi)作為結(jié)構(gòu)的第一個(gè)成員來(lái)模擬繼承。這里必須讓 aw_plc_fb_t 作為 aw_plc_fb_ztimer_t 的第一個(gè)成員。

/**
*@classaw_plc_fb_ztimer_t
*@parentaw_plc_fb_t
*@annotation["fb"]
*循環(huán)定時(shí)器。
*
*>當(dāng)輸入 IN 為 TRUE 時(shí),開(kāi)始計(jì)時(shí),輸出 Q 為 FALSE,ET 開(kāi)始記錄過(guò)去的時(shí)間。
*>定時(shí)時(shí)間到時(shí),COUNT 增加 1,輸出 Q 在本次循環(huán)為 TRUE,ET 重置為0。
*>輸入 IN 為 FALSE 時(shí)重置定時(shí)器。
*/
typedefstruct_aw_plc_fb_ztimer_t{
aw_plc_fb_tfb;

/**
*@property{bool_t}in
*@annotation["in"]
*為 TRUE 開(kāi)始計(jì)時(shí),為 FALSE 時(shí)重置定時(shí)器。
*/
bool_tin:1;

/**
*@property{iec_time_t}pt
*@annotation["in"]
*預(yù)設(shè)時(shí)間(ms)。
*/
iec_time_tpt;

...

}aw_plc_fb_ztimer_t;

這里的 API 注釋采用了 AWTK 中定義的格式,但是對(duì) annotation 做了一點(diǎn)擴(kuò)展,增加了 3 個(gè)新的取值:

fb 表示這是一個(gè)功能塊;

in 表示這是一個(gè)輸入?yún)?shù);

out 表示這是一個(gè)輸出參數(shù)。

2.ZTIMER的實(shí)現(xiàn)

每個(gè)功能塊必須提供虛函數(shù)表中定義的函數(shù),不過(guò)主要代碼集中 exec 函數(shù)里(其它函數(shù)可以自動(dòng)生成出來(lái)):

staticret_taw_plc_fb_ztimer_exec(aw_plc_fb_t*fb){
aw_plc_fb_ztimer_t*ztimer=AW_PLC_FB_ZTIMER(fb);

if(aw_plc_fb_before_exec(fb)==RET_OK){
ztimer->current_time=aw_plc_now_ms();
if(ztimer->state==0&&!ztimer->prev_in&&ztimer->in){
ztimer->state=1;
ztimer->q=FALSE;

ztimer->et=0;
ztimer->count=0;
ztimer->start_time=ztimer->current_time;
}else{
if(!ztimer->in){
ztimer->q=FALSE;
ztimer->state=0;

ztimer->et=0;
ztimer->count=0;
ztimer->start_time=ztimer->current_time;
}elseif(ztimer->state==1){
if((ztimer->start_time+ztimer->pt)<=?ztimer->current_time){
ztimer->q=TRUE;

ztimer->et=0;
ztimer->count++;
ztimer->start_time=ztimer->current_time;
}else{
ztimer->q=FALSE;
ztimer->et=ztimer->current_time-ztimer->start_time;
}
}
}
ztimer->prev_in=ztimer->in;
}

returnRET_OK;

}

3.注冊(cè)ZTIMER

功能塊需要注冊(cè)到前面介紹的功能塊工廠:

aw_plc_fb_factory_register(AW_PLC_FB_TYPE_ZTIMER,aw_plc_fb_ztimer_create);

坦白的講,本文只是介紹了實(shí)現(xiàn)自定義功能塊的關(guān)鍵步驟,實(shí)際工作要麻煩很多。如果手工去做這些工作,開(kāi)發(fā)一個(gè)功能塊還覺(jué)得好玩,而開(kāi)發(fā)幾十個(gè)甚至幾百個(gè)功能塊,人不會(huì)變瘋就會(huì)變傻。下一篇文章會(huì)我們介紹一下,如何用代碼生成器來(lái)完成這些單調(diào)的工作,讓開(kāi)發(fā)自定義功能塊成為一項(xiàng)快樂(lè)的工作。

AWPLC 目前還處于開(kāi)發(fā)階段的早期,寫(xiě)這個(gè)系列文章的目的,除了用來(lái)驗(yàn)證目前所做的工作外,還希望得到大家的指點(diǎn)和反饋。如果您有任何疑問(wèn)和建議,請(qǐng)?jiān)谠u(píng)論區(qū)留言。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5133

    文章

    19497

    瀏覽量

    314137
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何添加自定義單板

    開(kāi)發(fā)過(guò)程中,用戶(hù)有時(shí)需要?jiǎng)?chuàng)建自定義板配置。本節(jié)將通過(guò)一個(gè)實(shí)例講解用戶(hù)如何創(chuàng)建屬于自己的machine,下面以g2l-test.conf為例進(jìn)行說(shuō)明。
    的頭像 發(fā)表于 03-12 14:43 ?443次閱讀

    AWTK-WEB 快速入門(mén)(6) - JS WebSocket 應(yīng)用程序

    WebSocket可以實(shí)現(xiàn)雙向通信,適合實(shí)時(shí)通信場(chǎng)景。本文介紹一下使用Javacript語(yǔ)言開(kāi)發(fā)AWTK-WEB應(yīng)用程序,并用WebSocket與服務(wù)器通訊。AWTKDesigner
    的頭像 發(fā)表于 02-26 11:42 ?282次閱讀
    <b class='flag-5'>AWTK</b>-WEB <b class='flag-5'>快速</b>入門(mén)(6) - JS WebSocket <b class='flag-5'>應(yīng)用程序</b>

    AWTK-WEB 快速入門(mén)(5) - C 語(yǔ)言 WebSocket 應(yīng)用程序

    導(dǎo)讀WebSocket可以實(shí)現(xiàn)雙向通信,適合實(shí)時(shí)通信場(chǎng)景。本文介紹一下使用C語(yǔ)言開(kāi)發(fā)AWTK-WEB應(yīng)用程序,并用WebSocket與服務(wù)器通訊。AWTKDesigner新建一個(gè)
    的頭像 發(fā)表于 02-19 11:49 ?346次閱讀
    <b class='flag-5'>AWTK</b>-WEB <b class='flag-5'>快速</b>入門(mén)(5) - C 語(yǔ)言 WebSocket <b class='flag-5'>應(yīng)用程序</b>

    如何快速創(chuàng)建用戶(hù)自定義Board和App工程

    可將該文件夾復(fù)制到用戶(hù)自定義的工作目錄(workspace)中,基于此模板進(jìn)行開(kāi)發(fā)。本模板主要牽涉到的用戶(hù)自定義的文件有:用戶(hù)板級(jí)文件Board用戶(hù)應(yīng)用程序App
    的頭像 發(fā)表于 02-08 13:38 ?357次閱讀
    如何<b class='flag-5'>快速</b>創(chuàng)建用戶(hù)<b class='flag-5'>自定義</b>Board和App工程

    AWTK-WEB 快速入門(mén)(4) - JS Http 應(yīng)用程序

    導(dǎo)讀XMLHttpRequest改變了Web應(yīng)用程序與服務(wù)器交換數(shù)據(jù)的方式,fetch是其繼任者。本文介紹一下如何使用JS語(yǔ)言開(kāi)發(fā)AWTK-WEB應(yīng)用程序,并用fetch訪問(wèn)遠(yuǎn)程數(shù)據(jù)。
    的頭像 發(fā)表于 01-22 11:31 ?355次閱讀
    <b class='flag-5'>AWTK</b>-WEB <b class='flag-5'>快速</b>入門(mén)(<b class='flag-5'>4</b>) - JS Http <b class='flag-5'>應(yīng)用程序</b>

    自定義Modbus通信指令的搭建教程

    和歐姆龍E5EZ的智能溫控儀表作為從站為例,為大家分享如何使用自定義的Modbus RTU的通信程序,來(lái)實(shí)現(xiàn)快速高效的Modbus通信程序
    的頭像 發(fā)表于 01-20 10:37 ?900次閱讀
    <b class='flag-5'>自定義</b>Modbus通信<b class='flag-5'>塊</b>指令的搭建教程

    think-cell:自定義think-cell(四)

    C.5 設(shè)置默認(rèn)議程幻燈片布局 think-cell 議程可以在演示文稿中使用特定的自定義布局來(lái)定義議程、位置和議程幻燈片的其他形狀,例如標(biāo)題或圖片。通過(guò)將此自定義布局添加到模板,您
    的頭像 發(fā)表于 01-13 10:37 ?402次閱讀
    think-cell:<b class='flag-5'>自定義</b>think-cell(四)

    AWTK-WEB 快速入門(mén)(2) - JS 應(yīng)用程序

    導(dǎo)讀AWTK可以使用相同的技術(shù)棧開(kāi)發(fā)各種平臺(tái)的應(yīng)用程序。有時(shí)我們需要使用Web界面與設(shè)備進(jìn)行交互,本文介紹一下如何使用JS語(yǔ)言開(kāi)發(fā)AWTK-
    的頭像 發(fā)表于 12-05 01:04 ?384次閱讀
    <b class='flag-5'>AWTK</b>-WEB <b class='flag-5'>快速</b>入門(mén)(2) - JS <b class='flag-5'>應(yīng)用程序</b>

    AWTK-WEB 快速入門(mén)(1) - C 語(yǔ)言應(yīng)用程序

    導(dǎo)讀AWTK可以使用相同的技術(shù)棧開(kāi)發(fā)各種平臺(tái)的應(yīng)用程序。有時(shí)我們需要使用Web界面與設(shè)備進(jìn)行交互,本文介紹一下如何使用C語(yǔ)言開(kāi)發(fā)AWTK-W
    的頭像 發(fā)表于 11-27 11:46 ?573次閱讀
    <b class='flag-5'>AWTK</b>-WEB <b class='flag-5'>快速</b>入門(mén)(1) - C 語(yǔ)言<b class='flag-5'>應(yīng)用程序</b>

    TPS659xx應(yīng)用程序自定義工具

    電子發(fā)燒友網(wǎng)站提供《TPS659xx應(yīng)用程序自定義工具.pdf》資料免費(fèi)下載
    發(fā)表于 11-06 10:02 ?0次下載
    TPS659xx<b class='flag-5'>應(yīng)用程序</b><b class='flag-5'>自定義</b>工具

    創(chuàng)建自定義的基于閃存的引導(dǎo)加載程序(BSL)

    電子發(fā)燒友網(wǎng)站提供《創(chuàng)建自定義的基于閃存的引導(dǎo)加載程序(BSL).pdf》資料免費(fèi)下載
    發(fā)表于 09-19 10:50 ?0次下載
    創(chuàng)建<b class='flag-5'>自定義</b>的基于閃存的引導(dǎo)加載<b class='flag-5'>程序</b>(BSL)

    七大嵌入式GUI盤(pán)點(diǎn)

    采用純C語(yǔ)言開(kāi)發(fā)。它的作者是來(lái)自匈牙利的Gabor Kiss-Vamosikisvegabor,LVGLC語(yǔ)言編寫(xiě),以實(shí)現(xiàn)最大的兼容性(與C++兼容),模擬器可在沒(méi)有嵌入式硬件的PC
    發(fā)表于 09-02 10:58

    AWTK使用經(jīng)驗(yàn)】如何添加中文輸入法

    AWTK是基于C語(yǔ)言開(kāi)發(fā)的跨平臺(tái)GUI框架。《AWTK使用經(jīng)驗(yàn)》系列文章將介紹開(kāi)發(fā)AWTK過(guò)程中一些常見(jiàn)問(wèn)題與解決方案,例如:如何加載外部資
    的頭像 發(fā)表于 06-20 08:25 ?1391次閱讀
    【<b class='flag-5'>AWTK</b>使用經(jīng)驗(yàn)】如何添加中文輸入法

    AWTK使用經(jīng)驗(yàn)】如何響應(yīng)物理按鍵

    AWTK是基于C語(yǔ)言開(kāi)發(fā)的跨平臺(tái)GUI框架。《AWTK使用經(jīng)驗(yàn)》系列文章將介紹開(kāi)發(fā)AWTK過(guò)程中一些常見(jiàn)問(wèn)題與解決方案,例如:如何加載外部資
    的頭像 發(fā)表于 06-06 08:25 ?1044次閱讀
    【<b class='flag-5'>AWTK</b>使用經(jīng)驗(yàn)】如何響應(yīng)物理按鍵

    AWTK使用經(jīng)驗(yàn)】如何自定義combo_box下拉框樣式

    AWTK是基于C語(yǔ)言開(kāi)發(fā)的跨平臺(tái)GUI框架。《AWTK使用經(jīng)驗(yàn)》系列文章將介紹開(kāi)發(fā)AWTK過(guò)程中一些常見(jiàn)問(wèn)題與解決方案,例如:如何加載外部資
    的頭像 發(fā)表于 05-23 08:25 ?707次閱讀
    【<b class='flag-5'>AWTK</b>使用經(jīng)驗(yàn)】如何<b class='flag-5'>自定義</b>combo_box下拉框樣式
    主站蜘蛛池模板: 成人在线a| 97影院午夜在线观看视频 | 456影院第一 | 国产激爽大片在线播放 | 99综合在线 | 天天干在线免费视频 | 91高清在线成人免费观看 | 国产精品午夜国产小视频 | 97人洗澡人人澡人人爽 | 男男浪荡双性受hplay | 欧美乱码视频 | 天天摸天天碰色综合网 | 亚洲国产情侣偷自在线二页 | 欧美高清激情毛片 | 美女久久久久久 | 最新黄色地址 | 2022第二三四天堂网 | 啪啪免费视频网站 | 亚洲视频四区 | 午夜久久精品 | 午夜视频黄 | 精品黄色片 | 特级无码毛片免费视频尤物 | 男人天堂网在线观看 | 日韩一区二区视频 | 欧美精品福利 | 国产三级日本三级美三级 | 天天曰天天爽 | 激情五月亚洲色图 | 国产亚洲综合色就色 | 1000部又爽又黄的做黄禁片 | a毛片成人免费全部播放 | 亚洲成人免费看 | 拍真实国产伦偷精品 | 国产精品理论片在线观看 | 天天干天天狠 | 在线观看亚洲天堂 | 国产人免费人成免费视频 | 国产秦先生大战白丝97在线 | 小草影院亚洲私人影院 | 免费午夜在线视频 |