




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
HiGV圖形組件的基本架構、各模塊的功能特點和流程,場景設計及HiGV圖形組件的基本架構和各模塊的功能,使客戶能夠對
2017-05-4.262017-02-2016-11-2016-09-2016-07-2015-04-2014-12-2014-7-2014-01-2013-11-2013-03- 1 1HiGV架 1 2 3 3 3環境配 1 1 1 2模塊詳 1控 1 1 1 2消 3 3 4 5 6 7 8Xml定義的消息回調事 10繪 11 11 12 14定時 14 資 Xml設置資 ADM使 數據模型 多語 多語言xml描 Xml文件描 Xml界面描 Xml解 控件詳細介 1 1 1窗口與 2 3 4 4 4 5 6 6Label控 6 7 7ImageEx控 8 8 9 9 Edit控 Spin控 Spin箭 Clock控 35 36 37 38 阻塞式顯示 43 HiGV編程技 1 1 1 1 2 2 4 4 5 7 多圖 RLE格式使 輸入 動 圖1-1HiGV架構 圖1-2單擊“OK”按鈕前的界 圖1-3單擊“OK”按鈕后的界 圖3-1控件繼承關系 圖3-2消息回調流程 圖3-3HiGV界面圖 圖3-4OK按鈕繪制流程 圖3-5窗口顯示時序 圖3-6九宮格皮膚示意 圖3-7列表框示 圖3-8控件與數據模型綁定關系 圖4-1界面示 圖4-2非共享模式窗口疊加圖 圖4-3共享模式窗口疊加圖 圖4-4GroupBox圖 圖4-5Normal類型Button圖 圖4-6Switch類型Button圖 圖4-7Toggle類型Button圖 圖4-8Label圖 圖4-9Image圖 圖4-10內存圖片說明圖 圖4-11單元格ListBox圖 圖4-13Edit圖 圖4-15IPEdit圖 圖4-16Spin圖 圖4-17ProgressBar圖 圖4-18圖片密碼框圖 圖4-19時鐘圖 圖4-21ScrollBox圖 圖4-22ComboBox圖 圖4-23Calendar圖 圖4-25MessageBox圖 圖5-1拼音輸入法圖 圖5-2數字軟鍵盤圖 表3-1內部消息處理列 表3-2xml消息回調列 表4-1Clock顯示格式定 HiGVHiGV是一個輕量級的GUI系統,主要是為芯片平臺提供統一的輕量級、高效、易用GUISDKHiGO庫,而HiGO建立在基本的圖形驅動(FrameBuffer、芯片2D加速驅動、圖片編解碼等)之上,如圖1-1所示。HiGVXML標記語言進行界面描述,具有統一高效的系統資源管理功能,并且HiGV還提供了豐富的控HiGVBuilder來圖1-1HiGVTaskTaskMsgWindowResInputMultiHiGVInputInputdeviceHiGVHiGVDependHiGV3圖層(layer:獨立的圖形緩沖區,多個圖層可以使用apha值進行合成輸出,對(surface:surfacesurface搬移至圖層進行表現。視圖(view:xml界面描述文件中的view虛擬作為界面描述xml控件(wiget:界面的基本組成元素,圖形的具體表現載體,我們所看到的界面即由若干個控件組成,例如按鈕、文本框、圖片框等。控件有自己的矩形區域,這決定了它在界面中的顯示位置及大小??丶梢苑譃槿萜黝惪丶头侨萜黝惪丶?,非容器類控件只能布置在容器類控件中。窗口(window:界面基礎元素,容器類控件。窗口內可以放置任何非窗口控件,且窗口本身不能放置在其他容器類控件內。窗口與窗口之間是同級兄弟關系可以互相疊加,窗口內不能再包括窗口,窗口必須附屬在圖層上。children:將B稱為A的父,A稱為B的子。有著相同父容器的控件,建議不要重疊并且同Z序(windowlevel:皮膚(skn:控件的基本外觀描述,控件的每種狀態對應一個皮膚,控件的基本狀態有以下四種,(ADM:Astract默認數據緩沖(DDB:DefalDataBase,為數據模型提供簡單的數據緩沖和管資源(resource:句柄(handle:控件、ADM(msg:生,GUI系統或應用程序會根據消息類型做出響應,并回調用戶注冊的消息事消息回調事件(msgcallback:用戶通過注冊消息回調事件將函數與控件綁定,件作為消息回調,詳見3.2.4HiGV略大量的控件創建代碼,HiGV還會自動生成控件句柄,詳見Xml文件描述。HiGV的接口創建界面控件,接口創建控件需要大量的變量放置這些HelloWorldXML文件、描述界面事件文XML描述文件為: “hellosample” <!—viewname--> “hello <!—windowname-- <!—widgetpos-- “commonpicskincolorkey”<!—normalskin-- “hellowindowonshow”><!—onshowcallback-- “hellobutton <!—okbuttonID-- “commonpicnormalskin “commonpicactiveskinbutton” <!—activestate “IDSTR <!—multilanguageID-- “hellobuttononclick”/><!—onclickcallback-- “hellolabelhelpinfo”<!—labelID-- “commonskin UIXXX.c/**WindowonshowcallHIS32hellowindowonshow(HIHANDLEhWidget,HIU32wParam,HIreturnHIGVPROC}/**OKbuttononclickcallHIS32hellobuttononclick(HIHANDLEhWidget,HIU32wParam,HIU32lParam)HIS32/**Changethelabel HIGVWidgetSetText(hellolabelhelpinfo,“HelloreturnHIGVPROC}#defineSCREENWIDTH1280#defineSCREENHEIGHTHIS32main(HIS32argc,HICHAR{HIS32HIS32ghApp/**Thelayerinfo,layerwidthis1280andheightis720.ThepixelformatisHIGOPF8888,Eachpixeloccupies32bits,andtheA/R/G/Bcomponentseachoccupies8bits.UseDualbufferssupported.*/HIGOLAYERINFOSLayerInfo {SCREENWIDTH,SCREENHEIGHT,SCREENWIDTH,SCREENHEIGHT,SCREENWIDTH,SCREENHEIGHT,(HIGOLAYERFLUSHTYPEE)(HIGOLAYERBUFFER HIGOLAYERDEFLICKER HIGOPF8888,HIGOLAYERHD/**higv HIGVif(HISUCCESS! return/**Initparsermoduletoparserbinaryfilefrom HIGVPARSERif(HISUCCESSif(HISUCCESS!{printf("HIGVPARSERInitfailed!Return:return}/**Load HIGVPARSERif(HISUCCESS!/**Load HIGVPARSERif(HISUCCESS!{HIGVHIGVPARSERreturn}/**CreatelayerfordrawHIHANDLELAYER INVALID HIGVLayerCreate(&LayerInfo,&LAYERif(HISUCCESS!{printf("HIGVLayerCreateExfailed!Return:%xHIGVHIGVPARSERreturn}printf("LAYER0createok/**Loadview,PROJECTIDis/**Loadview,PROJECTIDisviewIDfromxmlfile.CreateallwidgetofPROJECT HIGVPARSERLoadViewById(PROJECTif(HISUCCESS!{printf("HIGVPARSERLoadViewByIdfailed!Return:HIGVHIGVPARSERreturn}/**CreateHiGV/**CreateHiGV HIGVAppCreate("MainApp",(HIHANDLE*)&gif(HISUCCESS!{ printf("HIGVAppCreatefailed!Return: HIGV HIGVPARSER return/**Show HIGVWidgetShow(PROJECTif(Ret! printf("HIGVWidgetShow()failed....:%d HIGVWidgetActive(PROJECTif(Ret! printf("HIGVWidgetActive()failed....:%d/*StartHiGVHIGVAppStart(g/**IftheHiGVappover,theHIGVAppStartwillbeHIGVAppDestroy(gHIGVPARSERHIGVAppStop(greturn}程序運行后,當按下“OKonclickhellobuttononclick函數,在該函數中修改文本框內容為“HelloWorld!1-2、圖1-3所示。開發所需要的頭文件全部位于SDKpub/include驅動文件(ko形式)SDKrootboxkmodSDKHiGV,而要在HiGVHiGV的開發庫和工具xml2bin、HiGVBuilderEclipsePC路徑等,并且最終可自動生成界面布局和資源XML描述文件。xml2binHiGV提供的可以將界面和資源XML描述文件轉換成HiGV可識別的二進制文件(higv.bin)C代碼文件(higvcextfile.c)的工具。HiGVlibhigvfastboot、hikernel(Linux內核、rootbox映像文件。詳細請參見《Hi3559V100/Hi3556V100開發環境用戶指南》和《HiTool工具快速入門視HiGV依賴的內核驅動模塊。在運行程序之前,需要正確加載圖形系統依賴內核驅動模塊,如TDE、FB等。運行程序。進入“xxxsample”文件夾,執行可執行程序“./xxxsample”,即可HiGVSDKHiGOSampleHiGOHiGV的繪制基
過識別handle找到對應的實例。件《higvwidget.h》包含了控件的公共接口,消息定義及控件其他公共屬性。使用控件前需要先創建一個控件。應用程序示例展示了使用xml創建控件的方法。此外,也可以調用HiGV的創建接口生成控件,如下是一段簡單的窗口創建代碼:HIGVWCREATESinfoWindow;HIGVWINCREATESWinCreate;HIHANDLEmemset(&infoWindow,0x00,sizeof(infoWindow)); HD0;//窗口所屬圖層 infoWindow.pPrivate&WinCreate; INVALIDHANDLE;//窗口沒有父容器 if(HI HIGVWidgetCreate(&infoWindow,{HIGVWidgetSetSkin(hWindow,HIGVSKINNORMAL,window}HIGVWidgetShowHIGVWidgetHideHIGVWidgetSetTextHIGVWidgetPaintHIGVWidgetDestroyWindow、Spin、Listbox等控件組合而成。HiGVC++3-1所
消息是由GUI系統或用戶觸發的能引起系統行為改變的事件。當消息產生,GUI系統HiGVHIGVAppStart開始至調用接口HIGVAppStop停止。HiGV獲取到消息后,將消息傳至焦點控件進行處理,完成后HiGV消息定義在頭文件《higvwidget.h》中,有統一的前綴“HIGVMSG按鍵、鼠標、觸摸屏等輸入設備產生的消息事件。由HiGV適配或用戶適配接收HIGVMSGKEYDOWN。遙控器、前面板等按鍵設備抬起產生HIGVMSGKEYUP。HIGVMSGMOUSEDOWN鼠標雙擊產生HIGVMSGMOUSEDBCLICK。鼠標移入某控件范圍產生HIGVMSGMOUSEIN。HIGVMSGMOUSEOUT。HIGVMSG觸摸屏上某控件范圍進行輕觸并抬起操作產生HIGVMSGGESTURETAP觸摸屏上某控件范圍進行長按操作產生HIGVMSGGESTURELONGTAP觸摸屏上某控件范圍進行輕掃操作產生HIGVMSGGESTUREFLINGHIGVMSGGESTUREHIGVMSGGESTURE理觸摸事件。手勢事件是Touch事件的高級包裝,其判斷的依據是Touch事件HIGVGESTURELONGTAP:長按手勢,超過兩秒觸發。HIGVGESTURESCROLL:滑動手勢,手指在觸摸屏上滑動。所有消息發送接口見頭文件《higvmsg.hHiGVHIGVWidgetShowHIGVMSG和HIGVMSGPAINT,HIGVListSetSelItem產生HIGVMSGITEMSELECT。HIGVMSGTIMER控件內部數據改變產生的事件,如控件獲取焦點觸發HIGVMSGGETHIGVMSGLOSTFOCUSHIGVMSGPAINTHIGVMSGREFRESHWINDOWHIGVMSGFORCEREFRESHWINDOWHIGVMSGTIMERHIGVMSGDATACHANGEHIGVMSGSTUPDATE滾動字幕更新消息。HIGVMSGMOUSEMOVE鼠標移動消息。HIGVMSGMOUSEWHEEL鼠標滾輪消息。不同的消息參數意義不一樣,具體請參考頭文件《higvwidget.h但輸入設備觸發的輸入事件(鼠標、按鍵)在產生時不會指定目標控件,HiGV對這類1.將按鍵消息分發給當前焦點窗口2.如果焦點窗口有孩子控件,窗口將按鍵傳遞給子控件,若子控件為容器類控件則繼續3.4.如果用戶注冊的按鍵消息回調函數返回值為HIGVPROCGOON,消息會逐層向當前HIGVPROCSTOP3.4.如果用戶注冊的鼠標消息回調函數返回值為HIGVPROCGOON,消息會逐層向當前HIGVPROCSTOPHiGV息回調流程如圖3-2所示。HiGVCallCallHIGVWidgetSetMsgProcHIGVPROCORDERBEFORE表示CustomProcHIGVPROCORDERAFTERCustomProc在控件內部處理之后回調。typedefHIS32(*HIGVMSGPROC)(HIHANDLEhWidget,HIU32wParam,HIU32lParam)用到該參數,具體請參考《higvwidget.hHIGVPROCGOON表示該條消息繼續傳遞,影HIGVPROCSTOP可以結束事HIGVMsgSendAsync(HIHANDLEhWidget,HIU32MsgId,HIU32Param1,HIU32Param2)HIGVMsgSendAsyncWithData(HIHANDLEhWidget,HIU32MsgId,HI*pBuf,HIU32控件接口觸發:HIGVWidgetShow接口可以使隱藏狀態的控件顯示出來,它同HIGVMSGSHOWwParamlParam都為0。HIGVU32PARAMTORECTHIRECTHIGVPROCORDERBEFORE的回調事件返回值如果不為HIGVPROCGOON會中斷控件繪制。HIGVPROCORDERBEFORE的回調事件。如果返回值不為HIGVPROCGOON會中斷控件對該消息的響應;HIGVPROCGOON消息會繼續傳遞給控件父容器輸入設備觸發:wParamTOUCH事件結構體長度,lParamTOUCH事件結構HIGVPROCORDERBEFORE的回調事件。如果返回值不為HIGVPROCGOON會中斷控件對該消息的響應;HIGVPROCGOON消息會繼續傳遞給控件父容器輸入設備觸發:wParamGESTURE事件結構體長度,lParamTOUCH事件結HIGVPROCORDERBEFOREHIGVPROCGOON會中斷控件對該消息的響應;HIGVPROCGOON消息會繼續傳遞給控件父容器。MsgHiGVHIGVMSGMsgHiGVHIGVMSGHIGVMSGHIGVMSGHIGVMSGSwitchHIGVFOCUSSTATEMsgHiGVHIGVMSGLANHIGVMSGDATAHIGVMSGSTATEChangeHIGVSTATENAMEHIGVMSGSTHIGVMSGSCROLLBARHIGVMSGREFRESHHIGVMSGFORCEREFRESHHIGVMSGSwitchHIGVSKINHIGVMSGSwitchHIGVSKINHIGVMSGLostHIGVMSGHIGVMSGLostHIGVMSGHIGVMSGMoveHIGVMSGHIGVMSGHIGVMSGHIGVMSGHIGVMSGGESTUREHIGVMSGGESTUREHIGVMSGGESTUREHIGVMSGGESTUREHIGVMSGHIGVMSGHIGVMSGUnlockHIGVMSGMoveMsgHiGVHIGVMSGKickbacktooriginXmlHIGVWidgetSetMsgProc(沒有的可以通過接口注冊,適用于所有控件的回調事件如表3-2所示。XmlMsgMessageHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGGETHIGVPROCORDERHIGVMSGLOSTHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGFOCUSEDITEXIHIGVPROCORDERHIGVMSGLANHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGGESTUREHIGVPROCORDERHIGVMSGGESTURELONGTHIGVPROCORDERHIGVMSGGESTUREHIGVPROCORDERHIGVMSGGESTURESCROLHIGVPROCORDERHIGVMSGVALUEONCHANGHIGVPROCORDERXmlMsgMessageHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDERHIGVMSGHIGVPROCORDER
HIGVWidgetPaint接口觸發的繪制為異步繪制,其基本流程如下:步驟1.計算繪制區域。2.發送繪制消息,區域為步驟14.回調優先級為HIGVPROCORDERBEFORE的消息回調事件。5.6.繪制控件的其他內容(圖片、文字等)7.HIGVPROCORDERAFTERHIGVWidgetUpdateHIGVWidgetPaint,因為該接口異步繪制不會阻塞主線程的其他處理,在部分特殊場景要求控件同步繪制的,可以調用HIGVWidgetUpdate。3-3OKSchedulingReminder,在父窗PaintPaintDrawGetactiveDrawonshowHIGVWidgetIsShow獲取該窗口顯示狀態,此時繪制還未成onshow中隱藏自己,這會導致接下去的繪制和顯示圖3-5窗口顯示時序圖SendpaintonshowcallreturnPaintmsgonrefreshcallafterrefreshmsgrefreshlayersendafterrefreshmsgrefreshmsgDrawsendrefreshMsgUI1.HIGVWidgetShow,如果該窗口為隱藏狀態且可以顯示,則向自己發送一個異onshow事件后返回接口,用戶可以在onshow做窗口繪制之前的準備工作。2.收到繪制消息后,窗口繪制自己,再繪制顯示狀態的孩子控件,然后向自己發送一個3.繪制和刷新圖層都是異步消息,因此收到步驟2發送的刷新圖層消息后,窗口會檢查4.窗口收到步驟3發送的afterrefreshonrefresh事件,用戶可以在onrefresh做窗口繪制完成后的其他處理。隱藏和顯示是對應的,HIGVWidgetHide示時,可以顯示或隱藏Button。
定時器的作用是延期或定期觸發事件。HiGV的定時器是與控件綁定的,一個定時器只1.HIGVTimerCreate(HIHANDLEhWidget,HIU32TimerIDHIU32Speed)接口 著不同的TimerID,不同控件的定時器TimerID可以相同。步驟2.注冊定時器回調事件。XmlontimerHIGVWidgetSetMsgProc接口為定時器事件注冊一個回調函數,OnTimer(HIHANDLEhWidget,HIU32wParamHIU32lParam)。步驟3.使用定時器。HIGVTimerStart(HIHANDLEhWidgetHIU32TimerID)啟動定時器,如果定時HIGVTimerStop(HIHANDLEhWidgetHIU32TimerID)停止定時器,如果非首HIGVTimerReset(HIHANDLEhWidgetHIU32TimerID)重啟定時器,定時器處于啟動狀態時重新計時,多用于在OnTimer中調用實現循環定時器。4.HIGVTimerDestory(HIHANDLEhWidgetHIU32TimerID)接口可以實現定時HiGV定時器啟動(HIGVTimerStart)后計算時間,定時器到達時間點后,向綁定的控件發送HIGVMSGTIMER事件。HiGV主線程收到HIGVMSGTIMER后,分發至綁OnTimerHiGV主線程中執行的,保證HiGV主線程順暢才能保證準時地進入定時器回調函數,一些耗時較長的業務會
HiGV提供了統一資源管理機制,主要資源包括:字體、圖片和皮膚。資源管理模塊通成系統內存和性能的浪費。HiGV資源管理的對外接口統一在《higvresm.h》中。HIGVResCreateID(constHICHAR*pFileNameHIGVRESTYPEEResType,HIRESID*pResID)根據資源路徑和選擇的資源類型創建res,并為其分配一個exportHIGVRESIMAGEPATH=xxxexportHIGVRESFONTPATH=xxxexportHIGVRESIMAGEPATH=./res/image/,pFileName為“button.png”,那么HiGV會以“./res/image/button.png”作為資源路徑,注意“/”不要重復。配置了資源環境變量后,接口HIGVResCreateIDNoPrefixPath可以創建不讀取環境變量的typedefstructhiHIGVFONT{HIRESIDHIRESIDHIU32HIBOOLHIBOOL}HIGVFONTHIGVFONTSSbFontIDMbFontIDID,由HIGVResCreateID得來。#defineSBFONTFILE"./res/sbfont.ttf"#defineMBFONTFILEHIS32AppCreateSysFont(HIHANDLE{HIS32HIRESIDSbFont,HIHANDLEHIGVFONTS HIGVResCreateID(SBFONTFILE,HIGVRESTYPEFONT,if(HISUCCESS! return HIGVResCreateID(MBFONTFILE,HIGVRESTYPEFONT,if(HISUCCESS! HIGVRes return HI HI HIGVFontCreate((constHIGVFONTS*)&FontInfo,if(HISUCCESS! HIGVRes HIGVRes return returnHI}
typedefstructhiHIGVSTYLE{HIGVSTYLETYPE HIGVSTYLEMEMBERUHIGVSTYLEMEMBERUHIGVSTYLEMEMBERUHIGVSTYLEMEMBERUHIGVSTYLEMEMBERUHIGVSTYLEMEMBERUHIGVSTYLEMEMBERUHIGVSTYLEMEMBERUHIGVSTYLEMEMBERUHI HI HI }HIGVSTYLEHIGVSTYLES是創建皮膚的信息結構,HiGV控件皮膚由九宮格組成,分為色塊皮HIGVSTYLEMEMBERU為十六進制的ARGB顏色值;如果是圖片皮膚,則HIGVSTYLEMEMBERU為圖片資源ID。圖3-6九宮格皮膚示意圖HIHIGVResDestroyHiGV完成,非常便捷。id"commonfonttextsbnamembnamesizeisboldisitalicid"buttontypebtmlineidx"./res/default/buttontoplineidx"./res/default/buttonllineidx"./res/default/buttonrlineidx"./res/default/buttonltopidx"./res/default/buttonrbtmidx"./res/default/buttonrtopidx"./res/default/buttonlbtmidx"./res/default/buttonbgidx"./res/default/buttonisnodrawbglinewidthfgidxid"graytypebtmlineidxtoplineidxllineidxrlineidxltopidxrbtmidxrtopidxlbtmidxbgidxisnodrawbglinewidthfgidxXml屬性設置對應接口的結構屬性,如下示例中的commonfonttext18、HIGVWidgetSetFont(hButton0,commonfonttext18);//為hButton0控件設置字體HIGVWidgetSetSkin(hButton0,HIGVSKINNORMAL,buttondefault);//為接口創建控件,可以在創建控件時將HIGVWCREATES結構的style成員設為HIGVSTYLEHIDEUNLODRES。顯示控件必須要調用接口HIGVWidgetShow(),如果顯示的是一個容器控件,則會加載該容器所有顯示狀態的子控件。前文的消息介紹中提到過HIGVMSGSHOW事事件、發送消息HIGVMSGPAINT的觸發順序是:隱藏不釋放資源風格是在控件接收到HIGVMSGPAINT事件后,第一次繪制時加載資源再進行HIGVResSetResident(HIRESIDResID)可以將圖片及字體資源設為常駐,常駐資源HIGVWidgetShow顯示新界HIGVWidgetHide隱藏老界面,避免兩個界面共用的資源釋放后重新加ADM(AbastractDataModel)抽象數據模型,主要是為了顯示批量的數據,使用控件ListBox、Spin、ScrollGrid等。HiGV采用界面顯示與數據管理分離的原則,由控件實例顯示數據,ADM控制數據。據管理,用戶還可以指定外部數據庫,例如SQLiteDB或者在嵌入式領域常用的BerkeleyDB等。定的控件自動刷新。數據模型的頭文件為《higvadm.h3-7所示,這是一個綁定了數據模型的列表框,該列表框中的所有字串和圖片都typedefstructhiHIGVCELLATTR{HIGVDTEHIU32}HIGVFIELDATTRtypedef{HIGVDT 0,/**<charHIGVDT /**<unsignedcharHIGVDT /**<shortHIGVDT /**<unsignedshortHIGVDT /**<intHIGVDT /**<unsignedintHIGVDT /**<longlongHIGVDT /**<unsignedlonglongHIGVDT /**<floatHIGVDT /**<doubleHIGVDTSTRING,/**<char*HIGVDTHIMAGE,/**<imagehandleHIGVDTSTRID,/**<multi-langugaestringHIGVDT}HIGVDTHIGVDTS8HIGVDTD648HIGVDTS8長度為1,HIGVDTD64長度為8;HIGVDTSTRING4的整數HIGVDTHIMAGE和HIGVDTSTRID為圖片資源IDID,長度為4。ADMOwnDB:HiGVDDBDB中,靜態或數量較無論是哪種方式,控件與ADM綁定,ADM與數據庫綁定,再由數據庫管理數據。
ADMtypedefstructhiADMOPT{HIU32 HIU32 HIGVFIELDATTRS HIU32 GetCountFuncGetRowValueFunc RegisterDataChangeFuncUnregisterDataChangeFunc}HIGVADMOPTHIGVADMOPTSDBSource:OwnDB時,ADMHiGV的DB句柄,UserDBBufferRows:OwnDB不使用,UserDB時決定了每次從數據庫獲取的數據條目OwnDBDBHIGVDDBCreate(HIU32FieldCount,constHIGVFIELDATTRS*pFieldAttr,HIHANDLE*phDDB)phDDBHiGVDBDB將DB句柄作為HIGVADMOPTS的Dbsource(即設置為ADM的數據源??梢酝ㄟ^HIGVDDBAppend、HIGVDDBModify、HIGVDDBInsert等接口操作DB
據時,通知綁定的ADM通過用戶注冊的回調事件直接獲取數據。typedefHIS32*GetCountFunc)(HIU32DBSourceHIU32*RowCnt)是獲取數據總數DBSource:ADMDB句柄,因為用到的是用戶指定的數據庫,往往回調函自己實現這個函數,在函數中將數據總條數以*RowCnt傳出。typedefHIS32(*GetRowValueFunc)(HIU32DBSource,HIU32Row,HIU32HIVOID*pDataHIU32*pRowNum)是獲取具體數據的回調函數,需要用戶實現這個函數,在此函數中把外部數據庫的數據傳給HiGV控件。listbox翻頁以后。pRowNum:實際傳出的數據行數,可能小于參數Num,還需要告知HiGV真實的
目前可以綁定ADMADM的控件使用著相同的數據源。HIGVWidgetBindDataSource可以將控件和ADMHIGVWidgetUnbindDataSource
HIGVWidgetSyncDBHIGVADMSync同步ADMADMHIGVMSGDATACHANGE1ADMHIGVMSGADMDATACHANGE2ADMADM創xmlADM、DB、空的回調函數,并在控件創建時就綁定ADM,非常便捷簡單。 field" HIGVADMOPTSdatamodelidADMDBsourceDDBHIGVFIELDATTRSu32HIGVDTU32,具{HIU32HICHARHIU32HICHARHIRESID}這是一個綁定了數據模型“datamodelrecord”,有著五列數據的listbox,從第0 "commonskin "allwidgetwindow "allwidgetwindow "allwidgetwindow "allwidgetwindow "allwidgetwindow ontimer"allwidgetwindow onlanchange"allwidgetwindow "LAYER0" "listbox "commonskin "allwidget "spin "datamodel "commonpicskin "commonpicskin "listboxrecord "listboxrecord "listboxrecord "listboxrecord "listboxrecord "listboxrecord typedefstructHIU32HICHARHIBOOLHICHARHIHANDLEstaticHIS32ListBoxGenerateRecord(HIU32{HIS32TestRecordHIU32HIGVDBROWSHIHANDLE INVALIDListBox HIGVADMGetDDBHandle(datamodelrecord, printf(“hDDBis%d\n",HIGVDDBEnableDataChange(hDDBHIFALSE);// 0;i<Num; snprintf(Record.Name,20,"Name%d",snprintf(Record.Mobile,snprintf(Record.Mobile,20,"Tel%d", s(HI HIGVDDBAppend(hDDB&DBRow);// HIHIGVDDBEnableDataChange(hDDBHITRUEreturn}HIS32main(HIS32argc,HICHAR{…HIGVWidgetHIGVWidget ListBox HI HIGVAppif(HISUCCESS! HIGVPARSER (HIVOID)HIGVApp HIGV returnHIGVPARSER(HIVOID)HIGVAppHIGVreturn}“Text:string:12”代碼中寫入數據的字串長度必須為12
HIGVWidgetSyncDB同步某個控件的DBHIGVADMSync同步綁定該數據模型的所有控件;如果是非HIGV線程同步數據,直接調用以上接口可能發生段錯誤,正確做法是向控件發送HIGVMSGADMDATACHANGE消息,通知控件同步DB。HiGV部分控件(Label、Button、Multiedit等)可以設置并顯示文本字串。HiGV提供了整體界面切換語言環境的功能,即多語言。多語言頭文件請參見《higvlan.hxml多語言功能采用xml描述語言種類和多語言字符串,并利用xml2bin工具自動生成字多語言字串ID,在不同的語言環境下就能顯示對應的字符串文本。目前HiGV只支持xml生成多語言字串。多語言XML "language "STRIDAMPM "STRIDAMPM "STRSET "STRIDAMPMAM;STRIDAMPM "TIMEFMTSHORT "<tt> "<tt>多語言字串的詳細描述。示例中的STRIDAMPMAM、STRIDAMPMPMidIDHIGVWidgetSetTextByID為控件設置多語言ID,en、zh、ar對應Languageinfo中描述的語言環境。空HiGV會找到locale代替它。<strset和言字串ID組合,timefmt為不同語言環境的時間顯示順序。Xmlc代碼中通過接口注冊和使用它們。Xml文件通過HIGVLanRegisterHiGVHIGVLanChange方向也發生切換時,可能希望整體的控件布局也發生對應的改變。HiGV為此提供了便HIGVWidgetEnableMirror(HIHANDLEhWidget,HIBOOLxml文件可以用于描述界面控件、皮膚、多語言字串、字體、數據模型和常用回調事柄頭文件、回調事件的頭文件和回調事件的空函數c文件。FontxmlUIXml設置資ViewxmlHiGV控件并注冊常用的消息回調事件。通xmlxml內,根據控件的功能為xml文件命名。 “hellosample” “hello “commonpicskincolorkey”普通皮膚 “hellowindowonshow”><!—注冊的窗口onshow事件回調-- “hellobutton “commonpicnormalskin “commonpicactiveskin “IDSTR “hellobuttononclick”/><!—按鈕的onclick事件回調 “hellolabelhelpinfo”<!—文本框ID “commonskin View:view并不是一個控件實例,viewxml提供一個身份標識,HiGVHIGVPARSERLoadViewByIdviewID創建該view內包含的的所有控件實例。higvcextfile.hhigvlanguage.hhigvcextfile.h對應的higvcextfile.c;如果在視xmlcview.xmlview.c文件,這些文件中有回調事件的空函數,另外數據模型也會生成一個c文件。Xmlhigv.bin中,通過調用接口HIGVPARSERLoadFile加載higv.bin文件,可以獲得除多語言字串外的所有xml描述信息。44Window可以同時存在若干個窗口,他們之間可以互相重疊。由HiGO統一管理窗口的重疊關控件關聯起來。窗口的頭文件為《higvwin.h起,重疊一定有上下層關系。A、B兩個窗口有重疊部分時,這兩個窗口的Z序(windowlevel)決定了它們顯示的上下層關系。Z0~1516層,Z序ZZ序相同,焦點存。如圖4-2所示。LevelLevelnWinnWinWinWinLevelWinWinLevel4-3所示,共享模式A窗口無法繪制被B窗口覆蓋的區域,當B窗口為透明或半透明時,A窗口被覆蓋區域的更新是無法體現的。共享模式下繪制不會擦除surface原有數據,透明窗口疊加場景須通過透明的圖片資源實現,在B窗口隱藏狀態下先顯示A窗口,待A窗口刷新到圖層后再顯示B窗口,即可表現出透明效果。而非共享模式顯示,surface即是一塊顯存。創建Surface需要一定的MMZ內存,大小為“寬度*高度*像素格式的字節數(如ARGB8888為四字節非共享模式每一個窗口都有和它一樣大的獨立surfacesurface上繪xmlisrelease=”yes”(HIGVSTYLEHIDEUNLODRES時一并創建,直至控件銷毀(HIGVWidgetDestroy)時釋放。0~255,0為全透明,255為完全不透明。xmlopacity或接口HIGVWinSetOpacity可以設置該值。32位的顏色值作為colorkey,窗口上所有colorkey的顏色都會透明到圖層。Xml屬性colorkey可以設置該值。onshow事件,非窗口可以調用接口HIGVWidgetSetMsgPorc注冊HIGVMSGSHOW圖4-1中彈出框的圓角,需要保證彈出框是在背景窗口刷新到圖層后再繪制。假如彈HIGVSTYLEFORCEPAINTPARENTxmlisskinforcedraw屬性。該屬GroupBox4-4ProgressBar控件和一個LabelGroupBox。圖4-4GroupBox圖示理的交互。按鈕的頭文件為《higvbutton.hButton可支持不同狀態下背景皮膚設置,同時還支持顯示前景文字,其中前景文字的常用的Button類型。check狀態,但它與單選按check狀態,也因值,具體了解請參考5.7輸入法。checkedmousedown五種皮膚用于匹配check時的各種狀態。Button內的繪制區域,文本以繪制區域對齊。應的是HIGVMSGBUTTONSTATUSCHANGE。特的屬性和事件。Label的頭文件為《higvlabel.h置作為Image的顯示內容。Image的頭文件為《higvimage.hMMZ內存中的圖片數據。只HIGVImageDrawMemImage(HIHANDLEhImage,HIGVMemInfo*MemInfo,HIU32ImageHeight,HIU32ImageWidth,HIRECT*pSrcRect,HIRECT*pDstRect,HIGOBLTOPTS*pBlitOpt,HIBOOLTransparent)
HIGVImageFreeMemSurface將內存圖片釋放。遵循誰申請誰釋放的原則,接口HIGVImageFreeMemSurfaceMemInfo,該接口只會釋放貼圖過程中生成的圖片surface。ImageEx主要用于顯示動態GIF圖片,圖片顯示支持居中和拉伸處理,如果待顯示區《higvimageex.h頭文件為《higvlistbox.h4-11為ListBox,其功能包括:圖4-11ListBox圖示typedef{HIU32HIU32HIBOOLHIBOOLHIBOOLHIBOOLHIBOOLHIBOOLHIU32HIU32HIU32HIGVGETWIDTHCBHIGVLISTCOLATTRS}HIGVLISTATTRIBUTEListBox在界面顯示的行數RowNumListBoxListBox的內部焦點切換。ListBox內部焦點分顏色,對應ListBox的字段索引等。為了區分內部焦點和非焦點區域,要設置焦點的皮膚,包括ListBox獲得界面焦點時的rowselectskin皮膚和ListBox未獲得界面焦點時的rownormalskin皮膚。內部焦點切換事件onselectHIGVMSGITEMSELECT,當內部焦點變化oncellselectHIGVMSGLISTBOXCELLSEL,當焦點被按ondatachangeHIGVMSGDATACHANGE,同步數據時發Xml屬性iscellactive=”yes”可設置單元格焦點模式,接口創建須設置IsCellActive。單取函數GetWidthCb如下:typedefHIS32(*HIGVGETWIDTHCB)(HIHANDLEhList,HIU32Item,HI該回調函數在ListBox同步數據時調用,調用次數為ListBox的總列數乘以總行數。每GetWidthCb函數,用戶以返回值回饋希望設置的單元格寬度。返回值的取值范圍是0~100,意為占總行的百分比,0表示隱藏單元格,100表示該單元格占滿整果返回值不在0~100范圍內,該單元格寬度使用前一次的值。onkeydown事件中通過接收按鍵調用接口設置。因為寬度元格上。也可以設置AutoSwitchCell讓HiGV內部處理焦點切換。ListBox提供了單元格內設置小圖標作為標記的功能。在很多場景中,ListBox的某個圖片。這些圖片的資源句柄也是通過ADM獲取的。將列屬性的類型設置為LISTCOLTYPETXTICONLEFTLISTCOLTYPETXTICONRIGHT,Fgidx用a|texticonADMiconXML isreleaseid"testlistbox01"top"20"left"20"width"200"normalskin"blackskin" activeskin"buttondefault"transparent"no"iscellactive"no"widgetposmirror"yes"widgetinteriormirror"yes"oncellselect"listboxcellselect"rownum"5"colnumfont"commonfonttext22"datamodel"testdatamodel1"rowselectskin"commonskincomboboxrowselect"rownormalskin"commonskincomboboxrowselect"leftorderobj""rightorderobj""onkeydown"" hlineheight"1"vlinewidth"1"scrollbar"" ontimer""noframe""ongetfocus""onlostfocus""onselect"">的形式描述字段id"testlistcol01"coltype"texticonleft"colwidth"100"colbinddb"yes"fgidx""coldbindex"0|1"coldataconv的形式描述字段id"testlistcol02"coltype"texticonright"colwidth"100"colbinddb"yes"fgidx""coldbindex"2|3"coldataconvid"testfielddatasourcegetrowcountgetrowvaluecacherowsregisterdatachangeunregisterdatachange""列屬性中可以注冊回調函數HIGVLISTCONVCBConvString,在xml中為coldataconv屬性。該回調本來是用作字符串的轉換。當列表框繪制每一個單元格內容typedefHIS32(*HIGVLISTCONVCB)(HIHANDLEhList,HIU32Col,HIItem,constHICHAR*pSrcStr,HICHAR*pDstStr,HIU32當某列的數據都是同一個圖片資源的時候,可以不綁定ADM字段,直接設置結構HIGVLISTCOLATTRShImage,因為此時并不依賴數據庫,列表框對這種用前界面顯示區域在整個需要顯示的區域中的位置。ScrollBar不能獲得焦點。ScrollBar的頭文件為《higvscrollbar.hEdit用于編輯和顯示簡單字符,包括拼音、英文、數字及標點符號的編輯,不可編輯置。Edit的頭文件為《higvedit.hHIGVMSGEDITINPUTENDEidt可以設置掩碼風格,掩碼風格和密碼風格互斥。掩碼風格需要設置掩碼,掩表示前三個字符可以編輯,MHz為不可編輯字符。除了密碼、掩碼風格,Eidt還可以設置數字風格、循環風格、刪除風格和只讀風
HiGV字符編輯采用UTF-81-4個字節的字符編輯。常用的ASCII編碼都是單字節字符,而中日韓文、阿拉伯文等復雜文字的一個字符對應2個以上字節。HiGV的編輯是以字符為單位的??冢斠姟秇igvedit.hHIGVMSGMULTIEDITSELECTEND。MultiEdit的頭文件為《higvmultiedit.hIPEditIP地址。該控件支持設置/IPIP地址檢IP地址值獲?。恢С止鈽俗詣犹D。IPEdit的頭文件為《higvipedit.hIPEdit432IP,對應每個字節對應一個IP段。如:0xFFFFFFFF表示IP55。Spin用戶添加,獲得焦點時左右按鍵可切換當前條目。Spin的頭文件為《higvspin.h圖4-16Spin32,條目總數為4,那么旋鈕中的內容依次為3、5、7、9四個條目。HIGVSpinAddItemHIGVSpinAddItemByID為旋鈕添加多語言字串ID作為內容。需要注意直接字ID只能選擇一種方式,不可混合使用。Xml文件可以直接設置字串xmlHIGVSpinSetButtonImg設置旋鈕的上下箭頭,鼠標點擊箭HIGVMSGITEMSELECT。節目播放進度等信息,ProgressBar中的格子是用圖片填充的。ProgressBar頭文件為《higvprogressbar.h應HIGVMSGITEMSELECT。xml中直接設置。ScrollText完成一次滾動后會產生滾動結束事件,對應HIGVMSGSTSCROLLONETIME。SmoothMoveHIGOScrolltext相似,HIHANDLEshSmoothMove1 HIGVSMOOTHMOVEINFOECreateInfo;/**Theparamisscrolltextlayer,ifhavenotscrolltextlayer,setHIGOLAYERBUTTplease*/ HIGVSmoothMoveInit(HIGOLAYERif(HISUCCESS!{return}/**Setsmoothmove HIGVSMOOTHMOVEDIRRIGHT; CreateInfo.IsScrollHITRUE; CreateInfo.FgColor0xfffff000;CreateInfo.BgColor0x0; HIGVSmoothMoveCreate((constHIGVSMOOTHMOVEINFOE*)&CreateInfo,&shSmoothMove1,"Testsmoothmove,stepis3.",HINULL);if(HI {returnHIGVSmoothMoveShow(s}HIGVSmoothMoveImageCipherImageCipher是用圖片顯示密碼的密碼框,主要是為了增加密碼顯示時的界面美觀效的頭文件為《higvimagecipher.h輸入密碼完成會產生事件,對應HIGVMSGICINPUTEND。Clock顯示。時鐘的頭文件為《higvclock.hClockClock顯示之前,需為Clock設置最小單位。xml創建時鐘須指定屬性minunit;接口創建時鐘,調用HIGVClockInit初始化時鐘后還須要調用當時鐘是HIGVSTYLEHIDEUNLODRES風格時,在顯示時創建定時器,隱藏當時鐘不是HIGVSTYLEHIDEUNLODRESClock的同時會創建HIGVMSGTIMER(ontimer)事件,定時器ID為0x1001。接口HIGVClockRun控制Clock定時器的啟動和停止,非HIGVSTYLEHIDEUNLODRES風格往往要先停止,顯示控件時再啟動。ClockClockdispmodeHIGVCLOCKMODEEDispMode;xml文件創建時為屬性dispmode。
DispModeHIGVCLOCKMODETEXTHIGVWidgetSetTextHIGVWidgetSetTextByIDClock
DispModeHIGVCLOCKMODEFORMATClock設置固定的顯示格式,目前只支持xml設置顯示格式。顯示格式通常定義在多語言xml文件中,以timefmt作為標簽,將timefmt的ID作為控件的text屬性。Y[MY[],<dY[N<HY[hY[mY[sY[-N<[<strset>fmt]類型表示fmt09IDstrsetstrset一定要是10個,順序代替0到9。補全格式會顯示完整的字串,缺省格式會將多余字符省略,比如“2015yyyy顯示為2015而yy則顯示為15”,又比如“9號用dd會顯示為09而d則顯示為9。 id"STRSET"STRIDMMJAN;STRIDMMFEB;STRIDMMMAR;STRIDMMAPR;STRIDMMMAY;STRIDMMJUN;STRIDMMJUL;STRIDMMAUG;STRIDMMSEP;STRIDMMOCT;STRIDMMNOV;STRIDMMDEC;" id"STRSETSHORT"STRIDMMJAN;STRIDMMFEB;STRIDMMMAR;STRIDMMAPR;STRIDMMMAY;STRIDMMJUN;STRIDMMJUL;STRIDMMAUG;STRIDMMSEP;STRIDMMOCT;STRIDMMNOV;STRIDMMDEC;" "STRSET "STRIDAMPMAM;STRIDAMPM "STRSET "STRSETDIGIT0;STRSETDIGIT1;STRSETDIGIT2;STRSETDIGIT3;STRSETDIGIT4;STRSETDIGIT5;STRSETDIGIT6;STRSETDIGIT7;STRSETDIGIT8;STRSETDIGIT9;" "STRSETDIGIT "STRSETDIGIT "STRSETDIGIT "STRSETDIGIT "STRSETDIGIT "STRSETDIGIT "STRSETDIGIT "STRSETDIGIT "STRSETDIGIT "STRSETDIGIT "STRSETDIGIT "STRSETDIGIT "STRIDAMPM "STRIDAMPM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDMM "STRIDWEEK "STRIDWEEK "STRIDWEEK ? "STRIDWEEK ??? "STRIDWEEK ! "STRIDWEEK "# "STRIDWEEK $%& "STRIDWEEKSHORT "STRIDWEEKSHORT "STRIDWEEKSHORT ?? "STRIDWEEKSHORT ????" "STRIDWEEKSHORT ! "STRIDWEEKSHORT "# "STRIDWEEKSHORT $%& "STRSETSHORT "STRIDWEEKSHORTSUN;STRIDWEEKSHORTMON;STRIDWEEKSHORTTUE;STRIDWEEKSHORTWED;STRIDWEEKSHORTTHUR;STRIDWEEKSHORTFRI;STRIDWEEKSHORTS "STRSET "STRIDWEEKSUN;STRIDWEEKMON;STRIDWEEKTUE;STRIDWEEKWED;STRIDWEEKTHUR;STRIDWEEKFRI;STRIDWEEKSAT;"/> "TIMEFMT "[yyyy]-<MM>-[dd]week: "<dddd>,[dd] "TIMEFMT "<tt> "TIMEFMT "[yyyy].<MM>.[dd]week:<dddd> "[<digit>yyyy]年<MMdd]日<dddd>tt> "<dddd>,[dd]<MM>,[yyyy]<tt> "TIMEFMTSHORT "<tt> "<tt> "TIMEFMTSHORT "[yy]-<M>-[d]week: "[yy]-<M>-[d] "<ddd>,[d] "TIMEFMTSHORT "[yy].<M>.[d] "[<digit>yy]/<M>/[d]<tt> "<ddd>,[d]<M>,[yy]<tt> 時間格式 "TIMEFMT "[yyyy].<MM>.[dd]week:<dddd> "[<digit>yyyy]年<MMdd]日<dddd>tt> "<dddd>,[dd]<MM>,[yyyy]<tt> <MM>表示一到十二月,因為是strset中的MM id"STRSET"STRIDMMJAN;STRIDMMFEB;STRIDMMMAR;STRIDMMAPR;STRIDMMMAY;STRIDMMJUN;STRIDMMJUL;STRIDMMAUG;STRIDMMSEP;STRIDMMOCT;STRIDMMNOV;STRIDMMDEC;" strsetid=STRSETMONTH,這個ID并不會被使用,xml2bin工具會自動尋找MM替換尖括號中的內容。在不同的語言環境下,<MM>會被翻譯成十二個月的多語言字串,如一月對應的STRIDMMJANen環境下會找到“January”,zh環境下會找到“一月”,ar環境下因為缺省會使用“January。串,strset中使用分號把每個多語言字串ID分隔開來。 "STRSET "STRIDWEEKSUN;STRIDWEEKMON;STRIDWEEKTUE;STRIDWEEKWED;STRIDWEEKTHUR;STRIDWEEKFRI;STRIDWEEKSAT;"/>[mm]表示0~59分鐘,補全格式顯示為“0059[s]表示0~59秒,缺省格式顯示為“059境下的字符。如2015年在zh環境下會顯示為“貳零壹伍”。20154715:40:05"[yyyy].<MM>.[dd]week:<dddd> [HH]:[mm]:[s]"作為en語言環境的顯示格式,最后會顯示為“2015.April.07week:Tuesday15:40:5。"[<digit>yy
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年貴州省貴陽市青巖貴璜中學中考一模英語試題
- 車輛消毒合同協議書范本
- 出差人員疫情應急方案范文
- JAVA圖形化編程能力試題及答案
- 2025年計算機二級Web考試行動計劃試題及答案
- TACE術后護理要點
- 關于燈具合同的協議書
- 剩余合同金額終止協議書
- 2025年初級會計師《經濟法基礎》黃金押題卷三
- 材料供貨合同框架協議書
- 湖北省武漢市2025屆高三年級五月模擬訓練試題數學試題及答案(武漢五調)
- 醫師掛證免責協議書
- DL∕T 5210.6-2019 電力建設施工質量驗收規程 第6部分:調整試驗
- D503-D505防雷與接地(下冊)彩色版
- 2023年科技特長生招生考試試卷word
- GB/T 34560.1-2017結構鋼第1部分:熱軋產品一般交貨技術條件
- GB/T 29318-2012電動汽車非車載充電機電能計量
- VSTi音源插件列表
- 安全文明施工措施費清單五篇
- 醫院感染暴發報告處理流程圖
- 中等職業學校學生實習鑒定表
評論
0/150
提交評論