`PB`應用程式就是由許多共同協作完成特定任務的視窗組成的集合。 視窗在應用程式的開發工作中占有很大的比重,是非常重要的一個 `PB `對象 ### 一、視窗類型 ![視窗類型](https://img2023.cnblogs.com/blog/2381533/202307/2381533-2023 ...
PB
應用程式就是由許多共同協作完成特定任務的視窗組成的集合。
視窗在應用程式的開發工作中占有很大的比重,是非常重要的一個 PB
對象
一、視窗類型
視窗類型 | 描述 |
---|---|
Main |
①可以覆蓋其他視窗,也可以被其他視窗覆蓋 ②可以最大、最小化,可以用滑鼠改變其 大小 ③可以有邊框,可以有菜單 ④常用於應用主操作視窗 |
Child |
①可以被其他視窗覆蓋,也可以覆蓋其他視窗 ②可以最大或最小化,也可以用滑鼠改變 其大小,父視窗最小或最大化時, Child 類型的視窗也相應的被最大或最小化 ③可以 有邊框,但不能有菜單 ④位置是相對於其父視窗而言,用滑鼠拖放其位置不能超過其 父視窗的範圍 ⑤常被其他視窗打開 |
Response |
①不能最大、最小化,沒有邊框,不能用滑鼠改變其大小 ②在繼續執行程式之前,必須 對這種類型的視窗做出響應 ③常用於顯示非常重要的信息 |
Popup |
①可以最大或最小化,在對這種類型的視窗響應之前,可以操作其他視窗 ②不隨父視窗 最大和最小化 ③可以擁有菜單、邊框 ④常用於顯示其他視窗的輔助信息 |
二、視窗屬性
-- General 屬性頁屬性 | --Scroll 屬性頁屬性 |
---|---|
-- ToolBar 屬性頁屬性 | --Other 屬性頁 |
2.1 General 屬性頁屬性
屬性 | 簡介 |
---|---|
Title |
視窗的標題 |
Tag |
和視窗相關的一個文本屬性,可以理解成視窗的註釋 |
MenuName |
和視窗相連的菜單 |
Visibl |
視窗是否可見 |
Enabled |
確定視窗的功能是否可用 |
TitleBar |
確定視窗是否有標題欄 |
ControlMenu, MaxBox, MinBox |
三個屬性確定在視窗的標題欄是否顯示最大、最小化以及關閉按鈕 |
ClientEdge |
是否顯示用戶工作區邊框 |
PaletteWindow |
該屬性只用於 Popup 類型的視窗,確定是否顯示標題欄圖標和最大、最小化按鈕 |
ContextHelp |
只用在 Response 類型的視窗上。確定是否支持上下文幫助。如果支持就在視窗的右上角顯示一個問號圖標 |
RightToLeft |
確定由右到左顯示 |
Center |
視窗居中顯示,不管屏幕解析度如何設置。該屬性在 PB 7.0 中沒有,新增 |
Resizable |
決定視窗在運行時是否可以改變其大小 |
Border |
決定視窗是否有邊框 |
WindowType |
確定視窗的類型,可用取值的含義,從字面意思可以理解。該屬性在視窗打開時起作用 |
BackColor |
設置視窗的背景顏色 |
MdiClientColor |
用來確定 MDI 用戶區的顏色 |
Icon |
用來設置視窗標題欄的圖標 |
2.2 Scroll 屬性頁屬性
屬性 | 簡介 |
---|---|
HscrollBar, VscrollBar |
是否需要顯示水平或垂直滾動條 |
UnitsPerLine |
用戶在垂直滾動條上每次單擊移動的 PB單位數。預設為 0,表示每次 滾動視窗高度的 1/100 |
UnitsPerColumn |
用戶在水平滾動條上每次單擊向左或者向右移動的 PB單位數。預設為 0,表示每次滾動視窗寬度的 1/100 |
ColumnsPerPage |
表示每頁顯示的列數。預設為 0,表示顯示 10 列 |
LinesPerPage |
表示每頁顯示的行數。預設為 0,表示顯示 10 行 |
2.3 ToolBar 屬性頁屬性
屬性 | 簡介 |
---|---|
ToolBarVisible |
工具條是否可見 |
ToolBarAlignment |
確定工具條在視窗上的初始位置。 有 5 個可用的枚舉型取值: AlignAtBootom!(底部)、AlignAtLeft!(左)、 AlignAtRight!(右)、 AlignAtTop!(頂部)、 Floating!(浮動) |
ToolBarX, ToolBarY, ToolBa rHeight 和 ToolBarWidth |
用來設置當工具條浮動顯示時工具條的起始位置及高寬。預設取值都是 0 |
2.4 Other 屬性頁中的屬性
用來設置視窗的真實坐標、寬高和滑鼠的預設指針。
當屏幕解析度是 800 × 600 時,全屏顯示的視窗 X, Y, Width 和 Height 分別是 0, 0, 3658, 2407。
三、11種常用控制項
視窗可以看作是一個容器,所以在視窗上可以放各種控制項,來完成用戶與程式的交互
控制項 | 說明 |
---|---|
Button |
用來執行特定的命令,接受用戶的鍵盤或滑鼠操作。 該控制項的 Text 屬性一般用來 向用戶說明該按鈕的功能。 典型事件是 Clicked |
Picture button |
和控制項 Button 相同,只是在它的上面還可以顯示圖形,提供更漂亮友好的界面。 典型事件也是 Clicked |
Static text |
顯示指示性或解釋性信息,文字只能單行顯示。 一般很少在該控制項上編程 |
Singlelineedit |
單行編輯,一般用來接受用戶比較少的文字輸入。 典型事件是 Modified,通常在該 事件上判斷用戶的輸入是否符合既定規則,如是否是數字等 |
Multilineedit |
多行編輯,用來接收用戶比較多的文字輸入。 典型事件也是 Modified,通常在該事 件上判斷用戶的輸入是否符合既定規則 |
Check box |
覆選框,用來界定用戶的輸入,一般輸入信息作為其他命令執行時的選項。 當有多個覆選框時,它們間的連接符習慣性認為是“ and”。 重要屬性是 Checked,通常用來判斷該控制項是否選中 |
Radio box |
單選按鈕,用來界定用戶的輸入只能是給定值中的一個。 它的輸入信息通 常用來選擇其他命令互斥的執行方式。 重要屬性 是 Checked,true 表示選中 |
Dropdownlistbox |
以緊湊列表框的形式給用戶顯示信息,通常在該控制項中進行單選。 經常和游標 ( cursor ) 配 合 使 用 , 顯 示 從 數 據 庫 中 提 取 的 數 據 。 典 型 事 件 是 SelectionChanged ,通常在該事件上讀取當前用戶的選擇信息 |
Listbox |
列表框,是顯示信息的,但其顯示格式不如 Dropdownlistbox 緊湊,也通常和光 標(cursor)配合使用,顯示從資料庫中提取的數據。但是,該控制項經常可以同時 選中多行。典型事件也是 SelectionChanged ,通常在該事件上讀取當前用戶的選 擇信息 |
DataWindow |
是 PB中最重要的、也是 PB最具特色的一個控制項。 可以 完成對資料庫中的所有數據操作 |
Group box |
將功能類似的或在功能模塊上關係緊密的部件放置在一起,界面美觀,可以 給用戶一個操作上的暗示。很少在該控制項上編程 |
四、視窗事件
4.1 常用事件
事件 | 事件說明 |
---|---|
open |
在視窗打開之後,顯示之前發生。 調整視窗大小、設置視窗實例變數、初始化一些控制項 |
close |
視窗被關閉時發生。觸發該事件後,沒有辦法阻止視窗的關閉 |
closequery |
在開始關閉視窗時發生,該事件返回一個0或1的返回值 如果返回值為1,則視窗不關閉,close事件也不會產生 如果返回值為0,則視窗被關閉 |
resize |
當視窗大小發生變化時變化,視窗被打開時也觸發此事件 |
key |
當用戶在鍵盤上按下一個鍵且插入點不在編輯區域時發生 |
activate |
在視窗成為活動視窗之前、 Open 事件觸發完後觸發 ,此事件發生後,Tab 值最小的對象得到焦點,如果沒有 排序號,則視窗本身獲得焦點 |
deactivate |
視窗變為不活動時發生 |
clicked |
戶單擊視窗的空白區域時發生,此區域不能有任何的空間或數據視窗 |
doubleclicked |
用戶雙擊視窗的空白區域時發生,此區域不能有任何的空間或數據視窗 |
dragleave |
當可拖放對象或控制項,離開空白區時發生 |
dragleave |
當可拖放對象或控制項,在視窗中被拖動時發生 |
hotlinkalarm |
在動態數據交換(DDE)伺服器應用發送了新的(修改後)的數據,且客 戶DDE應用程式已經接收到數據時發生 |
mousedown |
空白區,單擊滑鼠左擊時發生。 此事件與click事件相同,flags的值總為1 |
mousemove |
滑鼠在視窗中移動時發生 |
mouseup |
放開滑鼠左鍵時發生 |
rbuttondown |
空白區,按下滑鼠右鍵時發生 |
remoteexec |
當一個DDE客戶應用程式發送了一條命令時發生 |
remotehotlinkstart |
當一個DDE客戶應用程式要開始一個熱連接(hotlink)時發生 |
remotehotlinkstop |
當一個DDE客戶應用程式要結束一個熱鏈接時發生 |
remoterequest |
當一個DDE客戶應用程式請求數據時發生 |
remotesend |
當一個DDE客戶應用程式已經發送了數據時產生 |
systemkey |
當插入點不在編輯框中且用戶按下【alt】或【alt+其他組合鍵時發生】 |
timer |
調用timer函數,啟動定時器、設定時間後發生 |
toolbarmoved |
當MDI視窗中的工具欄被移動時發生 |
4.2 舉個慄子
① open事件
Cb_Save.Enabled=False //禁用“保存”按鈕的功能
SetPointer(HourGlass!) //將滑鼠形狀置為沙漏形
Dw_1.SetTransObject(SQLCA) //為數據視窗設置事務對象
Dw_1.Retrieve() //檢索數據
② 避免用戶因疏忽退出視窗而丟掉在數據視窗中的修改數據 ,通常在 CloseQuery
事件中判
斷某些工作是否完成,並顯示一個提示視窗詢問用戶,根據用戶的確認,返回一個值來決定
是否觸發視窗的 Close 事件。
返回值為 1,表示取消關閉動作;返回值為 0,表示繼續執行Close 事件
Int li_flag
//如果數據視窗中沒有修改,則允許執行 Close,直接返回
If dw_1.ModifiedCount() <= 0 And dw_1.DeletedCount() <= 0 Then Return 0
//如果數據視窗有修改,詢問用戶是否保存
li_flag = MessageBox("提示","數據已經修改,是否保存? ",Question!,YesNoCancel!,1)
Choose Case flag_i //根據用戶選擇執行
Case 1 //用戶選擇要保存數據
If dw_1.Update() = 1 Then //如果修改數據成功
Commit; //提交
Return 0 //繼續執行 Close 事件
Else //修改數據不成功
rollback; //回退事務
li_flag = MessageBox("提示","數據錯誤,是否繼續關閉!",Question!,YesNoCancel!,2) //顯示錯誤
If li_flag = 1 Then
Return 0 //允許關閉
Else
Return 1 //不允許關閉
End If
End If
Case 2 //用戶選擇不保存數據
Rollback; //回退事務
Return 0 //允許執行 Close 事件
Case 3 //用戶選擇取消
Return 1 //不允許關閉
End Choose //用戶所有的選擇情況處理完畢
③ 在視窗的 Resize 事件中編寫腳本,當用戶調整視窗大小時,根據用戶調整的
比例對視窗上的控制項大小進行調整。首先定義兩個實例變數用來保存調整之前的視窗大小
//open事件中代碼
ii_width = This.width
ii_height = This.height
//Resize事件中代碼
Int li_index //迴圈變數
DragObject lobj_every //用來獲取視窗上的控制項
For li_index = 1 To UpperBound(this.control[]) //對視窗中的所有控制項逐一處理
lobj_every = control[li_index] //保存當前控制項
lobj_every.x = lw_obj.x * (newwidth / ii_width) //重新設置 x 坐標
lobj_every.width = lobj_every.width * (newwidth / ii_width) //重新設置寬度
lobj_every.y = lobj_every.y * (newheight / ii_height) //重新設置 y 坐標
lobj_every.height = lobj_every.height * (newheight / ii_height) //重新設置高度
Next
ii_width = newwidth //保存當前寬度
ii_height = newheight //保存當前高度
五、視窗常用函數
5.1 open 函數
函數用來打開其他的視窗
① 語法
Open ( Windowvar)
② 參數
Windowvar
是一個Window
類型的參數,是要打開的視窗名稱
③ 返回
- 成功時返回1,否則返回-1
- 數為 Null, 則返回 Null
④ 舉個慄子
//打開主視窗
Open(w_main)
註:連續調用Open函數,視窗不會被打開兩次,只是第二次調用時會再次觸發視窗 Activate 事件。為了避免這種情況,可以將腳本修改如下
If Not IsValid(w_main) Then //如果視窗沒有打開
Open(w_main) //則打開該視窗
Else //如果視窗已經打開
W_main.BringToTop = True //將該視窗顯示在最頂層
End If
竟然open函數調用兩次也不能打開兩個視窗,那麼問題來了,怎麼才能打開多個視窗呢?代碼如下
① 打開和 w_edit 完全相同的一個視窗
w_edit lws_edit //定義一個視窗變數
Open(lws_edit) //創建視窗實例
②通過數組,打開多個實例視窗
w_edit lws_edit[3]
Int li_index
For li_index =1 To 3
Open(lws_edit[li_index])
Next
5.2 close 函數
函數的作用是關閉視窗,釋放視窗及其上面的控制項所占用的記憶體空間,視窗的
CloseQuery
事件和Close
事件觸發
① 語法
Close ( Windowname )
② 參數
Windowname
是要關閉的視窗名稱,是一個Window
類型的變數- 成功返回 1,否則返回-1
- 參數為 Null,則返回 Null
5.3 MessageBox 函數
函數可以打開一個小信息視窗,不僅可以以多種方式給用戶顯示提示信息,還可以將用戶的選擇信息返回 。
小信息視窗有標題、提示信息、圖標、按鈕等 4 個元素,可以通過不同的參數來決定顯示哪些或者顯示哪種樣式。
① 簡單模式
只能顯示提示信息,並有一個確認按鈕,不能讓用戶進行選擇
- 語法
MessageBox(title,text)
-
參數
- title 為信息視窗標題
- text 為提示信息
-
舉個慄子
MessageBox(“錯誤提示” ,“數據保存錯誤! ” )
② 複雜模式
-
語法
MessageBox ( title, text {, icon {, button {, default } } } )
-
參數
- title 為信息視窗標題
- text 為提示信息
- icon 用來表示使用哪種圖標
- button 用來表示提供哪些按鈕
圖標icon取值如下
按鈕button取值如下
參數取值 | 顯示樣式 | 返回值 |
---|---|---|
OK! |
顯示 【確定】 按鈕,該取值為預設值 | 總返回 1 |
OKCancel! |
顯示 【確定】 和 【取消】按鈕 | 1-【確定】, 2-【取消】 |
YesNo! |
顯示 【是】 和 【否】按鈕 | 1-【是】, 2-【否】 |
YesNoCancel! |
顯示 【是】、 【否】 和 【取消】 三個按鈕 | 1-【是】, 2-【否】, 3-【取消】 |
RetryCancel! |
顯示 【重試】 和 【取消】按鈕 | 1-【重試】, 2-【取消】 |
AbortRetryIgnore! |
顯示 【放棄】、 【重試】和 【忽略】三個按鈕 | 1-【放棄】, 2-【重試】, 3-【忽略】 |
-
舉個慄子
li_flag = MessageBox("提示","是否保存數據? ",Question!,YesNoCancel!,1) Choose Case li_flag Case 1 //用戶選擇 Yes,保存數據 . . . . . . //處理語句 Case 2 //用戶選擇 No,不保存 . . . . . . //處理語句 Case 3 //用戶選擇了 Cancel,不進行任何操作 . . . . . . //處理語句 End Choose
六、值傳遞與接收
6.1 字元串
① 打開一個視窗,並傳遞一個字元串
string ls_str
ls_str = '個人公眾號:XiezhrSpace'
openwithparm( 視窗名,ls_str)
② 接收字元串
string ls_str
ls_str = message.stringparm
6.2 數值
① 打開一個視窗,並傳遞一個數值
openwithparm( 視窗名,1)
② 接收數值
long ll_row
ll_row = message.doubleparm
6.3 結構體
① 打開一個視窗,並傳遞一個結構體
st_parameter s_pm
s_pm.a = 1
openwithparm( 視窗名,s_pm)
② 接收結構體
st_parameter s_pm
s_pm = message.powerobjectparm
messagebox('提示',s_pm.a)
6.4 用戶對象
① 打開一個視窗,並傳遞一個用戶對象
//(1)、創建類用戶對象u_parameter,並定義實例變數
//(2)、給用戶對象賦值,並傳遞該用戶對象
u_parameter u_pm
u_pm.a = '1'
openwithparm(視窗名,u_pm)
② 接收用戶對象
u_parameter u_pm
u_pm = message.powerobjectparm
messagebox('提示',u_pm.a)
6.5 exe應用程式
① 打開一個exe,並傳遞參數
ls_exe = 'a.exe' + '|值1|' + '|值2|'
run(ls_exe)
② 接收exe傳遞的參數
string ls_parameter
ls_parameter = commandparm()
6.6 傳遞消息和接收消息
① 傳遞string消息
w_main.triggerevent('ue_open',0,'test')
//在用戶自定義事件ue_open中接收消息:
string ls_msg
ls_msg = string(message.longparm,'address')
② 傳遞long消息
w_main.triggerevent('ue_open',100,0)
//在用戶自定義事件ue_open中接收消息:
long ll_msg
ll_msg = message.wordparm
6.7 可視化類傳值
u_customvisual u_cv
u_cv = create u_customvisual
openuserobjectwithparm(u_cv,1)
6.8 關閉視窗傳遞數據
① 語法
CloseWithReturn ( windowname, Returnvalue )
② 參數
windowname
是要關閉的視窗的名稱Returnvalue
要返回的數值
註:只有被關閉的視窗是 response 類型才能有效地獲取返回參數
七、觸發事件
7.1 立即觸發
obj.triggerevent(clicked!)
obj.trigger event ue_init()
obj.trigger function wf_init()
7.2 在事件隊列最後觸發
obj.postevent(clicked!)
obj.post event ue_init()
obj.post function wf_init()
7.3 動態綁定觸發
obj.dynamic event ue_init()
obj.dynamic function wf_init()
註:
動態調用和靜態調用的區別
靜態調用就是在編譯代碼時就對函數進行徹底編譯
動態調用就是在程式執行的時候才回去查找和調用相應的函數
7.4 規定的時間內觸發某事件
idle(60) //如果60秒沒有操作的話就觸發application對象的idle事件
timer(60) //每隔60秒就觸發一次視窗的timer事件
八、視窗使用技巧
8.1 創建視窗實例
① 創建視窗實例
w_edit lws_edit
Open(lws_edit)
② 打開多個視窗實例
w_edit lws_edit[3]
Int li_index
For li_index =1 To 3
Open(lws_edit[li_index])
Next
8.2 使用視窗屬性編程
根據 tag 的取值對各個控制項進行初始化
Int li_index,li_total
DataWindow ldw_temp
DropDownListbox lddlb_temp
RadioButton lrb_temp
li_total = Upperbound(Parent.Control[])
For li_index = 1 To li_total
Choose Case Lower(Parent.Control[li_index].Tag)
Case "DataWindow"
ldw_temp = Parent.Control[li_index]
ldw_temp.Reset()
Case "DropDownListbox"
lddlb_temp = Parent.Control[li_index]
lddlb_temp.SelectItem(0)
Case "radiobutton"
lrb_temp = Parent.Control[li_index]
lrb_temp.Checked = False
Case Else
…
End Choose
Next
8.3 視窗最小化時設置動態圖標
當程式最小化時打開 timer(在 deactive 中加入 timer(1)語句),併在 timer 事件中編寫
程式激活時關閉 Timer 事件(在 Active 事件中加入 timer(0)語句)
If This.Icon = "appico.ico" Then
This.Icon = "reverse.ico"
Else
This.Icon = "appico.ico"
End If
8.4 放置閃爍文字
以閃爍文字顯示重要信息可以吸引用戶的註意力,避免這些重要信息被忽略。通過周期性修改 visible 屬性,可以實現閃爍效果
在視窗中,假設放置一個靜態文本 st_1,在視窗的 Open 事件中定義 Timer 事件的間隔:Timer(1)
Timer 事件 中代碼如下
If Mod(Second(Now()),2) = 1 Then
st_1.visible = False
Else
st_1.Visible = True
End If
8.5 提高視窗的打開速度
視窗的 Open 事件中經常編寫腳本來進行初始處理工作,如果這些工作花費的時間比較長,在視窗顯示之前用戶就得等待很長的時間
這時,可以如下腳本優化
第一種方案:
① open
事件中添加代碼
PostEvent("ue_openpost")
② ue_openpost
事件中添加代碼
SetPoInter(HourGlass!)
dw_1.SetTransObject(SQLCA)
dw_1.Retrieve()
SetPoInter(Arrow!)
第二種方案:
open
事件中添加如下代碼
dw_1.SetRedraw(False)
TriggerEvent("ue_openpost")
Dw_1.SetRedraw(True)
8.6 移動不帶標題欄的視窗
在開發應用程式中,可能要用到不帶標題欄的視窗,而帶有標題欄的視窗可以通過拖放
標題欄來移動視窗,如何移動沒有標題欄視窗呢?
在要拖放視窗的 MouseDown
事件中編寫代碼,代碼如下
Send(handle(this),274,61458,0)
8.7 給視窗添加自動滾動條功能
視窗的 Resize 事件中編寫腳本,根據當前視窗的大小來設置是否顯示滾動條
① 聲明函數
Subroutine GetScrollRange(Uint hWindow,Int nScrollBarFlag,ref Int nMin,ref Int nMax) Library "user.exe"
Function Int GetScrollPos(Uint hWindow,Int nScrollBarFlag) Library "user.exe"
② 定義實例變數
Int ii_width,ii_height
③ open
事件中添加代碼
ii_width = This.Width
ii_height = This.Height
④ Resize
事件中實現
Uint hwindow
Int nScrollPos,nMinPos,nMaxPos
If This.WindowState = Minimized! Then //如果正在進行最小化,則直接返回
Return
End If
HWindow = Handle(This) //獲取當前視窗的句柄
//下麵開始處理水平滾動條
If This.Width < i_Width Then //如果小於打開時的寬度
This.HscrollBar = True //則顯示水平滾動條
Elseif This.HscrollBar Then //如果大於或等於打開時的寬度,並且已經有滾動條
NScrollPos = GetScrollPos(hwindow,0) //使用 API 函數獲取當前滾動條位置
GetScrollRange(hwindow,0,nMinPos,nMaxPos) //使用 API 函數獲取滾動範圍
If nScrollPos > nMinPos Then //如果用戶滾動了滾動條並且此時不需要顯示滾動條
Post(hwindow,276,6,0) //則在水平方向調整視窗中的內容到原來的位置
End If
This.HscrollBar = False //取消滾動條特性
End If
//下麵開始處理垂直滾動條
If This.Height < i_Height Then //如果小於打開時的高度
This.VscrollBar = True //則顯示垂直滾動條
Elseif This.VscrollBar Then //如果大於或等於打開時的高度,並且已經有滾動條
NScrollPos = GetScrollPos(hWindow,1) //使用 API 函數獲取當前滾動條位置
GetScrollRange(hwindow,1,nMinpos,nMaxPos) //使用 API 函數獲取滾動範圍
If nScrollPos > nMinPos Then //如果用戶滾動了垂直滾動條且不需再顯示
Post(hwindow,277,6,0) //則垂直調整視窗中的內容到原來的位置
End If
This.VscrollBar = False //取消滾動條特性
End If
8.8 自動調整視窗
實現視窗居中
//***************************************************************
//* 功能: 將視窗移到屏幕的中央
//* 參數 1: aw_window 要處理的視窗
//* 返回值: (none)
//* 調用舉例: gf_window_center(w_pay_mode) //將視窗置於屏幕的中央
//***************************************************************
Environment le_env
Int li_ScreenHeight, li_ScreenWidth
Long ll_posx,ll_posy
GetEnvironment(le_env)
li_ScreenHeight = PixelsToUnits(le_env.ScreenHeight,YPixelsToUnits!)
li_screenwidth = PixelsToUnits(le_env.ScreenWidth,XPixelsToUnits!)
If aw_window.width > li_ScreenWidth Then //如果視窗超寬
ll_posx = 1
Else
ll_posx = (li_ScreenWidth - aw_window.Width) / 2
End If
If aw_window.height > li_ScreenHeight Then //如果視窗超高
ll_posy = 1
Else
ll_posy = (li_ScreenHeight - aw_window.Height) / 2
End If
aw_window.Move(ll_posx ,ll_posy)
以上就是本期內容的全部,希望對你有所幫助。我們下期再見 (●'◡'●)