第一篇:Java AWT編程總結
1.什么是GUI? a)GUI是Graphics User Interface的全稱,意思是圖形用戶界面.2.為什么需要GUI? a)圖形用戶界面能夠讓最終用戶通過鼠標拖動、單擊等動作就可以操作整個應用,從而提高應用的用戶體驗效果,使程序受到用戶的歡迎.3.Java通過AWT和SWING來完成GUI圖形用戶界面編程.4.AWT a)AWT是SUN公司提供的一個基本的GUI類庫,被稱為抽象工具集(Abstract Window-Toolkit),它為Java應用程序提供了基本的組件.b)AWT組件需要調用運行平臺的圖形界面來創建和平臺一致的對等體,所以AWT只能使用所有平臺都支持的公共組件,因此AWT只能夠提供一些 常用的GUI組件.5.AWT的主要組成部分
a)Component,代表一個具體圖形表示能力的對象,可以在屏幕上顯示,并與用戶交互.通常我們把它稱為”組件”.b)MenuComponent,代表圖形界面的菜單.i.MenuBar,代表菜單條.ii.Menu,代表一個菜單項的集合.iii.MenuItem,代表一個菜單項.c)Container,代表一個AWT組件容器,可以盛裝其他Commponent組件,它繼承自Component抽象類,本身也代表一個Component組件.i.Window,可獨立存在的頂級窗口.1.Frame,代表一個窗體.2.Dialog,代表一個對話框
a)FileDialog代表一個文件對話框,用于打開或保存文件.Panel,可容納其他組件,但不能獨立存在,必須被添加到其他容器中.ii.iii.ScrollPane,帶滾動條的容器.d)LayoutManager,布局管理器,表示容器管理其他組件的方式.i.ii.iii.iv.v.vi.FlowLayout,流式布局,類似于Window平臺記事本的文本布局方式.BorderLayout,邊框布局,只能盛裝5個組件,這5個組件分別位于邊框布局容器的東西南北中五個方位.GridLayout,網格布局,將組件以網格形式顯示在容器中.GridBagLayout,網格包布局,一種較為復雜的布局管理器,依賴GridBagConstraints來約束組件.CardLayout,卡片布局,以時間來管理容器內的組件,將組件看作是一張張卡片,每次顯示最外面一張卡片(組件).BoxLayou,箱式布局,通常與Box容器結合使用.6.AWT 的事件
a)應用程序響應用戶的某個動作或請求,如用戶單擊了一下鼠標,用戶請求關閉應用程序窗口等.b)AWT編程中,所有事件的處理都必須交給特定的對象來完成,我們將這個特定的對象稱為事件監聽器.c)AWT的事件處理機制是一種委派式的事件處理方式,通過將某個事件監聽器注冊到用戶指定的組件,當用戶進行某個操作并觸發指定事件時,應用程序會自動產生一個事件(Event)對象并作為參數傳給事件監聽器中的事件處理器,然后由事件監聽器通知事件處理器來響應用戶,完成用戶的請求.d)不同的事件需要不同的事件監聽器,不同的監聽器需要實現不同的監聽器接口.e)事件監聽器接口:為某個特定事件定義了響應用戶請求的方法,當用戶將某個事件監聽器注冊到指定組件上以響應特定的事件時,則該事件監聽器必須實現對應的事件監聽器接口才能對用戶的請求進行有效處理.例如,用戶點擊了鼠標右鍵,希望打開某個應用程序的右鍵菜單,則注冊到該應用程序上的事件監聽器必須實現鼠標事件監聽器接口,并實現該接口內部某些方法來完成用戶的請求.f)事件適配器,很多時候,我們只需要實現某個事件監聽器接口中個別方法就能完成應用程序的實際需求,但實現該事件監聽器接口的類必須實現該接口中所有的抽象方法,這會造成代碼的冗余.而事件適配器可以幫我們解決這個問題,事件適配器實現了所有的擁有多個抽象方法的事件監聽器接口,并空實現了這些接口中所有的抽象方法,所謂空實現,就是方法中沒有任何實現代碼,因此,我們可以通過繼承對應事件監聽器接口的事件適配器抽象類,并實現我們感興趣的方法來完成應用需求即可.g)Java事件處理過程中主要涉及的三類對象 i.事件源,通常為普通組件.ii.事件,通常指用戶的某個操作,如單擊了一下鼠標,按了一下回車鍵.iii.事件監聽器,負責監聽事件源上所發生的事件,并作出響應.h)AWT事件監聽器的實現形式 i.ii.內部類形式 頂級類形式
iii.類本身作為事件監聽器 iv.匿名內部類形式 v.注:目前最為流行的事件監聽器的實現形式是內部類形式和匿名內部類形式.7.AWT繪圖
a)AWT繪圖的實現過程.i.重寫畫布類的paint方法,繪圖圖形.ii.注冊事件監聽器到指定的組件.iii.調用Component類的repaint方法繪制圖形.b)AWT實現繪圖主要涉及的對象 i.ii.c)Component類的子類Canvas類,它代表一個畫布.Graphics,代表一個畫筆,可以在Canvas的子類中繪制用戶自訂的圖形.Image類代表了位圖,它的一個主要的實現類BufferedImage是可以訪問圖形數據緩沖區,并可以返回一個Graphics對象來繪制該BuuferedImage.d)可以使用ImageIO工具類的ImageReader和ImageWriter讀寫磁盤上的位圖文件.8.AWT的優缺點
a)AWT在許多非桌面環境,如嵌入式設備中有著自己的優勢,它的主要優點如下:
i.ii.iii.iv.更少的內存:對運行在有限環境中的GUI程序的開發,是合適的。
2.更少的啟動事件:由于AWT組件是本地由操作系統實現的。絕大多數的二進制代碼已經在如系統啟動的時候被預裝載了,這降低了它的啟動事件。3.更好的響應:由于本地組件由操作系統渲染。4.成熟穩定的:能夠正常工作并很少使你的程序崩潰。
b)同樣它也有不少的缺點 i.ii.iii.更少組件類型:表和樹這些重要的組件缺失了。它們是桌面應用程序中普遍使用的。
2.缺乏豐富的組件特征:按鈕不支持圖片。
3.無擴展性:AWT的組件是本地組件。JVM中的AWT類實例實際只是包含本地組件的引用。唯一的擴展點是AWT的Canvas組件,可以從零開始創建自定義組件。然而無法繼承和重用一個已有的AWT組件
9.AWT總結:AWT是SUN不推薦使用的工具集,實際開發中很少使用AWT而是使用SUN公司和Netscape公司共同開發的一個新的用戶界面庫-Swing來開發GUI應用程序,AWT是圖形用戶界面編程的基礎,它的布局管理、事件機制、剪貼板操作等內容仍然適用于Swing GUI編程.
第二篇:編程題總結
大家必須掌握每種類型的1-3題。
題號考點要求
48、將兩個兩位數的整數合并成一個整數
65、兩個正整數合并成一個整數
71、兩個正整數合并成一個整數
77、兩個正整數合并成一個整數
81、兩個正整數合并成一個整數
84、兩個正整數合并成一個整數
87、兩個正整數合并成一個整數
91、兩個正整數合并成一個整數
8、s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+.....+n)
9、p=m!/(n!*(m-n)!)
26、連加
68、s=1+1/1!+1/2!+1/3!+........70、s=1/(1*2)+1/(2*3)+...+1/(n*(n+1))
76、s=1+0.5*x+(0.5*(0.5-1)*x*x/2!+......86、連加
90、連加
92、連加
93、連加
97、連加
100、連加
(2、)
類似素數或者閏年算法
2、求出1到1000之間能被7或11整除、但不能同時被7和11整除的所有整數,并將他們放在a所指的數組中,通過n返回這些數的個數。
58、求n以內同時能被3與7整除的所有自然數之和的平方根s3、求出能整除x且不是偶數的各整數,并按從小到大的順序放在pp所指的數組中,這些除數的個數通過形參n返回。
27、求出1到m之間能被7或11整除的整數,放在數組中,通過n返回這些數的個數
63、求n的所有因子(不包括1與自身)
98、計算n以內能被5或9整除的所有自然數的倒數之和
15、w是大于10的無符號整數,若w是n(n>=2)位的整數,則函數求出w的后n-1位的數作為函數值返回。
24、將數字字符串轉化為一個整數
16、對變量中的值保留兩位小數,對第三位四舍五入
(3、)
1、一維數組中,將低于平均分的人數作為函數值返回,低于平均分的分數放在below所指的數組中。
82、計算一維數組中n門課程的平均分
96、一維數組中每相鄰元素之平均值的平方根之和
28、找出一維數組中最大的值和它所在的下標,兩者通過形參返回
7、求出數組的最大元素在數組中下標并存放在k所指的存貯單元中。
43、從num個字符串中找出最長的一個字符串,并通過形參指針傳回
39、移動數組中的內容,前p個數移動到數組后面
40、移動數組中的內容,前m個字符移動到后面
5、將大于整數m且緊靠m的k個素數存入xx所指的數組中。
20、求出小于變量m的所有素數并放在一個數組中
51、將大于1小于m的非素數存入xx所指數組中,個數通過形參返回
99、計算3到n之間所有素數的平方根之和
29、將字符串中下標為奇數位置上的字母轉化為大寫
47、字符串中所有下標為奇數的字母轉為大寫
31、將字符串中除了下標為偶數、同時ASCII碼也為偶數的字符外,其余的全都刪除;串中剩余字符放在t字符串中
32、除了下標為奇數、同時ASCII碼也為奇數的字符外,其余的全都刪除;串中剩余字符放在t字符串中
49、將字符串中下標為偶數且ASCII碼為奇數的字符刪除
19、從字符串中刪除指定字符
64、將字符串中ASCII值為奇數的字符刪除,剩余字符放在t所指字符串中
72、將字符串中下標為偶數的字符刪除
78、字符串中ASCII為偶數的字符刪除
35、刪除字符串中所有空格
6、刪除一個字符串中指定下標的字符。
60、刪去一維有序數組中所有相同的數,使之只剩一個
33、刪除字符串中尾部*號,使不超過n個
36、把字符串中的前導*號全部移到字符串尾部
45、刪除字符串中前導和尾部的*號
56、字符串中,除了尾部*號外,字符串中其余*號全部刪除
73、刪除字符串中除了前導和尾部*號外的所有*號
83、字符串中尾部*號刪除
88、字符串中除了前導*外,刪除其余*號
94、字符串中,前導*號全部刪除
95、字符串中前導*號不得多于n個
66、刪除字符串中所有*號
(4、)
17、字符串內容逆置
23、判斷字符串是否為回文
25、比較兩個字符串的長度(不能用strlen)
52、實現兩個字符串連接
59、將字符串數組中的字符串依次合并到一個字符串中
21、字符串中字符按降序排列(選擇法排序)
4、統計在tt字符串中“a”到“z”26個字母各自出現的次數,并依次放在pp所指數組中。
38、求出字符串中指定字符的個數
44、統計長度為2的字符串在另一個字符串出現的次數
62、統計一行字符串中單詞個數
11、二維數組構成矩陣,使數組左下半三角元素中的值全部置成042、二維數組,將右上半角元素中的值乘以m80、二維數組中左下半三角中元素中的值乘以312、求出數組周邊元素的平均值
14、求出二維數組周邊元素之和
18、矩陣行列互換
53、矩陣B=A+A130、求出二維數組中最大元素的值,此值返回給調用函數
55、M行N列的二維數組中的數據,按行的順序依次放到一維數組中
41、將二維數組中的字符,按列的順序依次放到一個字符串中
75、二維數組中數按列的順序放到一維數組中
13、求出二維數組每列中最小元素,并依次放在pp所指一維數組中
37、結構體數組(學號、8門成績、平均成績),求出每個學生的平均成績
34、把結構體數組(學號、成績)中分數最高的學生放到h數組中,函數返回人數
74、把結構體數組(學號、成績)中分數最低的學生數據放在h所指數組中
50、結構體數組(學號、成績),找出成績最高的學生記錄,通過形參返回
54、結構體數組(學號、成績),低于平均分的學生數據放在b所指數組中
89、結構體數組(學號、成績),高于等于平均分的學生人數通過形參返回
57、結構體數組(學號、姓名),把指定范圍內的學生數據放在所指數組中
67、結構體數組(學號、成績)返回指定學號的學生數據(查找)
46、結構體數組(學號、成績),按分數降序排列(選擇法排序)
22、鏈表結構中,找出數值最大的結點,并由函數值返回
85、鏈表中,求出平均成績
10、迭代法求方程的實根
61、統計各年齡段人數(建議采用if else)
69、遞歸函數
第三篇:plc編程學習總結
1:PLC編程語言有5種,即順序功能圖(SFC),梯形圖(STL),功能塊圖,指令表,和結構文本。其中順序功能圖(SFC)是最容易理解的,按照時間的先后順序執行。然后轉換成梯形圖,因為梯形圖是PLC普遍采用的編程語言。不過SFC轉換梯形圖是很簡單的。
2:就好比是開關在合上時兩觸點接觸的一瞬間繼電器就有動作了,這叫上升沿。
下降沿就好比開關兩觸點始終保持接觸時,繼電器沒有動作,只有開關兩點斷開時的瞬間繼電器才動作。
第四篇:一點Duilib編程總結
一點Duilib編程總結
1.duilib簡介
duilib是一個開源的DirectUI界面庫,簡潔但是功能強大。而且還是BSD的license,所以即便是在商業上,大家也可以安心使用。
現在大家可以從這個網站獲取到他們所有的源碼:/p/duilib/ 為了讓我們能更簡單的了解其機制,我們按照如下順序一步一步的來對他進行觀察:
工具庫:用于支撐整個項目的基礎
控件庫:這是dui最關鍵的部分之一,相信也是大家最關注的部分之一,另外這里也來看看它是如何管理這些控件的
消息流轉:有了控件庫,我們需要將Windows窗口的原生消息流轉給這些控件,另外在這里也來看看Focus,Capture等等的實現
資源組織和皮膚加載:有了上面所有的這些,我們再來看看它是如何自動創建皮膚的
簡單使用:最后,來看看到底要如何使用它
以下是duilib工程帶的一副總體設計圖,在看代碼之前看看這幅圖,對看代碼會很有幫助。
duilib: 2.工具庫
由于duilib沒有對外部的任何庫進行依賴,所以在其內部實現了很多用于支撐項目的基礎類,這些類分布在Util文件夾中:
UI相關:CPoint/CSize/CDuiRect 簡單容器:CStdPtrArray/CStdValArray/CStdString/CStdStringPtrMap 上面這些類看名字就基本能夠理解其具體的含義了,當然除了基本的基礎庫,還有一些和窗口使用相關的工具的封裝:
窗口工具:WindowImplBase,這個工具我們在這里不詳述,后面會再次提到。3.控件庫
控件庫在duilib的實現中被分為了兩塊:Core和Control:
Core中包含的是所有控件公用的部分,里面主要是一些基類和繪制的封裝。Control中包含的就是各個不同的控件的行為了。Core部分和控件相關的類圖非常簡單: duilib-core: 3.1.控件基類:CControlUI CControlUI在整個控件體系中非常重要,它是所有控件的基類,也是組成控件樹的基本元素,控件樹中所有的節點都是一個CControlUI。
他基本包括了所有控件公共的屬性,如:位置,大小,顏色,是否有焦點,是否被啟用,等等等等。當然這個類中還提供了非常多的基礎函數,用于重載來實現子控件,如獲取控件名稱和ClassName,是否顯示,等等等等。
另外為了方便從XML中直接解析出控件的各個屬性,這個類中還在提供了一個SetAttribute的方法,傳入字符串的屬性名稱和值對特定的屬性進行設置,內部其實就是挨個比較字符串去完成的,所以平時使用的時候就還是不要使用的比較好了,因為每個屬性實際上都有特定的方法來獲取和設置。
另外每個控件中還有幾個事件管理的對象——CEventSource,這些對象會在特定的時機被觸發,如OnInit,調用其中保存的各個回調函數。3.1.1.控件類型轉換
這里我們就碰到一個問題,控件樹中的每一個節點都是CControlUI,但是其實這些節點可能是文字,可能是圖像,也有可能是列表,那么他怎么在這些控件指針之間進行轉換呢?
強制轉型不是一個好的選擇,duilib中使用的是CControlUI::GetInterface,傳入一個字符串,傳出指向控件的指針。類似于COM的QueryInterface。
LPVOIDCControlUI::GetInterface(LPCTSTRpstrName){ if(_tcscmp(pstrName,_T(“Control”))==0)returnthis;returnNULL;} 3.2.容器基類:CContainerUI 有了基本的控件基類之后,我們就需要容器來將他管理起來,這個容器就是CContainerUI,其內部用一個數組來保存所有的CControlUI的對象,后續的所有工作,就都是基于這個對象來進行的了。
這樣在CContainerUI里面,主要實現了一下幾個功能: 子控件的查找:CContainerUI::FindControl 子控件的生命周期管理:是否銷毀(在Remove的時候自動銷毀)/是否延遲銷毀(交給CPaintMangerUI去一起銷毀)。
滾動條:所有的容器都支持滾動條,在其內部會對鍵盤和鼠標滾輪事件進行處理(CContainerUI::DoEvent),對其內部所有的元素調整位置,最后在繪制的時候實現滾動的效果
繪制:由于容器中有很多元素,所以為了加快容器的繪制,繪制的時候會獲取其真正需要繪制的區域,如果子控件不在此區域中,那么就不予繪制了
3.3.控件實現
有了普通的基類和容器的基類之后,我們就可以在其之上搭建控件了。其類圖大致如下:
duilib-control: 3.3.1.基本控件
duilib實現了非常多的基本控件,他們分布在Control文件夾下,每一個頭文件就是一個控件,主要有:
CLabelUI/CTextUI/CEditUI/CRichEditUI CButtonUI/CCheckBoxUI/COptionUI(RadioButton)CScrollBarUI/CProgressUI/CSliderUI CListUI CDateTimeUI/CActiveXUI/CWebBrowserUI 3.3.2.Layout 除了基本控件之外,duilib為了輔助大家對界面元素進行布局,還在中間實現了專門用于Layout的元素:
CChildLayoutUI CHorizontalLayoutUI/CVerticalLayoutUI/CTileLayoutUI:縱向排列,橫向排列格子排列
CTabLayoutUI:Tab 3.3.3.控件繪制
繪制控件實際上有很多代碼都是可以抽取出來的,比如:九宮格拉伸圖片,平鋪圖片等等工作,我們實際上都不需要每次都去重寫。所以這部分代碼被抽取出來,形成了CRenderEngine,這個類在Core/UIRender下。在這個里面,我們可以看到很多的用于繪制方法。
classUILIB_APICRenderEngine { public: //......staticvoidDrawLine(HDChDC,constRECT&rc,intnSize,DWORDdwPenColor);staticvoidDrawRect(HDChDC,constRECT&rc,intnSize,DWORDdwPenColor);staticvoidDrawRoundRect(HDChDC,constRECT&rc,intwidth,intheight,intnSize,DWORDdwPenColor);staticvoidDrawText(HDChDC,CPaintManagerUI*pManager,RECT&rc,LPCTSTRpstrText, DWORDdwTextColor,intiFont,UINTuStyle);staticvoidDrawHtmlText(HDChDC,CPaintManagerUI*pManager,RECT&rc,LPCTSTRpstrText, DWORDdwTextColor,RECT*pLinks,CDuiString*sLinks,int&nLinkRects,UINTuStyle);//......};3.4.控件管理:CPaintManagerUI 當所有這些基本的控件都準備好了之后,我們就只要將這些控件管理起來,這樣一個基本的控件庫就完成了,而這個管理就是CPaintManagerUI來負責的。
在duilib中,一個Windows的原生窗口和一個CPaintManagerUI一一對應。其主要負責如下幾個內容,后面會分開來細說,現在先了解一個概念就行:
控件管理 資源管理
轉化并分發Windows原生的窗口消息 為了實現上面這些功能,其中有幾個用于管理控件和資源的關鍵的數據結構: m_pRoot:保存根控件的節點
m_mNameHash:保存控件名稱Hash和控件對象指針的關系
m_mOptionGroup:保存控件相關的Group,這個Group并不是TabOrder,他用于實現Option控件
m_aCustomFonts:用來管理字體資源 m_mImageHash:用來管理圖片資源
這些結構基本都可以看作是一堆列表和Map,這樣可以用其來實現控件和資源的管理了。
4.消息流轉 有了控件,現在我們的問題是,如何將原生的窗口消息分發給界面中所有的控件,使其行為和原生的一樣呢?
4.1.窗口基礎類:CWindowWnd 在duilib中,用來表示窗口的最基礎的類是CWindowWnd,在這個類中實現了如下基本的內容:
原生窗口的創建(CWindowWnd::Create)Subclass(CWindowWnd::Subclass)
最基本的消息處理函數(CWindowWnd::__WndProc)和消息分發(CWindowWnd::HandleMessage)
模態窗口(CWindowWnd::ShowModal)
duilib通過這個類,將原生窗口的消息分發給其派生類,最后傳給整個控件體系。另外在duilib中,需要進行消息處理的基本控件,都是從這個類繼承出來的。
4.2.消息分發
一旦我們使用CWindowWnd類創建了窗口之后,消息就會通過CWindowWnd::HandleMessage進行分發,我們可以和WTL等其他的庫一樣,在此對原始的窗口消息進行處理。
LRESULTCWindowWnd::HandleMessage(UINTuMsg,WPARAMwParam,LPARAMlParam){ return?0?2::CallWindowProc(m_OldWndProc,m_hWnd,uMsg,wParam,lParam);} 當然如果我們覺得這樣麻煩,我們也可以使用CPaintManagerUI來對其進行默認處理。我們上面提到CPaintManagerUI還會對所有的控件進行管理,這樣,消息就傳遞給了窗口內部特定的控件了。
這些默認處理集中在CPaintManagerUI::MessageHandler()中,其內部會對很多窗口消息進行處理,并將其分發到對應的控件上去,比如對WM_LBUTTONDOWN的處理。
caseWM_LBUTTONDOWN: { //......POINTpt={GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam)};m_ptLastMousePos=pt;CControlUI*pControl=FindControl(pt);//......TEventUIevent={0};event.Type=UIEVENT_BUTTONDOWN;//......pControl->Event(event);} break;4.2.1.Focus&Capture 通過上面這個最簡單的例子,我們基本可以猜到duilib對Focus和Capture的處理方法了:用一個成員變量保存對應的控件,在消息到達時直接轉發消息。
在CPaintMainagerUI中,大家可以找到一個成員變量:m_pFocus,這個就是用來保存焦點控件的。在WM_KEYDOWN等鍵盤消息發生時,duilib就會模擬Windows行為,將消息直接轉給當前Focus的控件。caseWM_KEYDOWN: { if(m_pFocus==NULL)break;TEventUIevent={0};event.Type=UIEVENT_KEYDOWN;//...m_pFocus->Event(event);//...} break;但是很奇怪的是,duilib里面并沒有對Capture做處理,分發鼠標消息到對應的子控件上,可能是還沒有完善的原因。
4.2.2.其他消息分發方式 除了Event以外,CPaintManagerUI還提供了其他幾種用于處理消息的方法: Notifier:在窗口上處理一些控件的邏輯,可以將其看成和WM_NOTIFY差不多的功能
PreMessageFilter:消息預處理,這個大家肯定不陌生了。PostPaint:繪制后的回調
TranslateAccelerator:快捷鍵的處理
這里需要注意的是:PreMessageFilter和TranslateAccelerator是通過全局數組來實現的,這并不符合多線程的窗口編程要求,所以duilib對多線程的支持并不是很好!
4.3.WindowImplBase 為了簡化duilib的使用,庫中提供了一個非常方便的工具:WindowImplBase。這個類將常用的功能封裝在其內部,比如Notifier和PreMessageFilter,并在其中提供了各種默認的虛回調函數,供派生類重載。通過這個類,我們可以非常方便的來實現一個簡單的界面。
classUILIB_APIWindowImplBase :publicCWindowWnd ,publicCNotifyPump ,publicINotifyUI ,publicIMessageFilterUI ,publicIDialogBuilderCallback { //......virtualUINTGetClassStyle()const;//......virtualLRESULTOnClose(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL&bHandled);virtualLRESULTOnDestroy(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL&bHandled);//......5.資源組織和皮膚加載
好了,現在我們已經有了控件管理和控件庫,現在我們需要讓UI框架來幫忙組織這些資源,并且自動的來幫我們創建皮膚,減少我們的開發量。
duilib中的皮膚文件主要有幾個部分組成: xml描述文件:描述窗口中控件的布局和樣式 各種資源如圖片
我們把這些資源放在一個文件夾中,這樣就形成了基礎的皮膚包。當然我們還可以將其組合成一個zip包,從而加快IO訪問,但是修改起來就會相對麻煩。所以我們可以在debug中使用前者,而在release中使用后者。
我們可以在binskin下面找到duilib中自帶demo的所有的皮膚包。皮膚中,最關鍵的部分就是這個xml描述文件了,一個xml描述文件對應著一個窗口的信息,如:控件的類型和樣式等等。為了有一個直觀的印象,我截取了duilib中ListDemo的xml描述文件的一部分放在這里:
... 為了通過配置文件自動創建皮膚,duilib提供了一個類:CDialogBuilder(DuiLibCoreUIDlgBuilder.h)。
這個類提供了從皮膚包(文件夾和zip格式)中的xml中創建皮膚的方法:CDialogBuilder::Create。內部實際上就是一個xml的解析,依次創建各式控件。除了創建控件,這個類還將一些可以復用的資源提取出來放入CPaintManagerUI中統一管理,如字體和圖片等等。
6.簡單使用
由于項目里面實在是帶了太多太多的demo,而且在duilib的工程中,還有一個doc的目錄,里面也非常詳細的描述了要如何使用duilib來創建一個簡單的工程。
所以關于duilib的簡單使用,這里就不再詳述了,這里就只列出GameDemo的main函數,這個函數非常的簡單,但是已經基本可以表達了。
intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCE/*hPrevInstance*/,LPSTR/*lpCmdLine*/,intnCmdShow){ CPaintManagerUI::SetInstance(hInstance);CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()+_T(“skin”));CPaintManagerUI::SetResourceZip(_T(“GameRes.zip”));HRESULTHr=?0?2::CoInitialize(NULL);if(FAILED(Hr))return0;CGameFrameWnd*pFrame=newCGameFrameWnd();if(pFrame==NULL)return0;pFrame->Create(NULL,_T(""),UI_WNDSTYLE_FRAME,0L,0,0,1024,738);pFrame->CenterWindow();?0?2::ShowWindow(*pFrame,SW_SHOWMAXIMIZED);CPaintManagerUI::MessageLoop();?0?2::CoUninitialize();return0;} 7.總結
總的來說,duilib還是一個很小巧好用的皮膚引擎的,但是他仍然有其不好的地方:對多線程的支持不好,不支持動畫。但是無論如何,它還是不錯的,所以如果你已經看到了這里,那么接下來跑到vs里面建一個工程,玩一把才是正經事~
第五篇:描述性編程總結(范文)
一、描述性編程
1、QTP的運行原理
封裝被測對象(TO)到對象倉庫
對比對象倉庫里的對象屬性(TO)和運行時的真實被測對象的屬性(RO)對比一致后,找得到相應的對象(RO),按照腳本驅動對象
2、RO & TO
TO:Test object 倉庫對象
Ro:Runtime object 運行時對象
TO包含RO
Cancel button
text:TO:Cancel|取消
text:RO:Cancelor取消
3、GetTOProperty獲取TO的屬性值
屬性值=GetTOProperty(“屬性名”)
4、GetROProperty 獲得RO的屬性值
屬性值=GetROProperty(“屬性名”)
5、GetTOProperties 返回值是對象的集合(Set)
Set pops=GetTOProperties
For i=0 to pops.count-1
Pops(i).name獲得屬性名
Pops(i).value獲得屬性值
Next
.Count獲得組合的總數
6、SetToProperty設置TO屬性值
SetTOProperty “屬性名”,”屬性值”(runtime)
二、描述性編程
1、初級描述性編程(直描)
Object.(“屬性名:=屬性值”,” 屬性名:=屬性值”…)
Object:被測對象(類型)
Index2、代碼簡化
A.賦值給變量(set)
B.With…End With
With object
.statements
End With3、高級描述性編程(description)
Set mydes=description.create()
Mydes(“屬性名”).value=”屬性值”
Mydes(“屬性名”).value=”屬性值”
Dialog(“Login”).WinButton(mydes).Click4、ChildObjects
Set ChildO=ChildObjects(mydes)
Set ChilO=Dialog(“Login”).ChildObjects(mydes).count
For i=0 to ChildO.count-1
ChildO(i).click
next