遠端控制軟體中視窗管理主要有兩種模式,一種是以灰鴿子遠控為代表的單視窗單任務管理模式,一種是以黑洞遠控為代表的多視窗多工管理模式。前一種比較簡單,本文講第二種方案的實現。這裡著重講視窗多開,多工另起篇幅講述。
假如我們需要同時對3臺遠端主機進行檔案管理,那麼需要開啟3個檔案管理的對話方塊,這3個對話方塊相同的是什麼?不同的又是什麼?相同的是對話方塊介面和處理過程,不同的是通訊物件。好了,下面讓我們思考下如何實現同與不同。要實現在不同的視窗自由切換,非模式對話方塊的效果自然是最理想。要實現不同的通訊物件,只要繫結不同的socket就行。下面是筆者根據開發和應用的經驗,總結得三種方案,希望能對其他朋友有所幫助。
方案一:視窗陣列
視窗陣列比較好理解,你要3個對話方塊,正好我那有3個一樣的對話方塊,只要拿過來綁上不同的通訊物件就行了。視窗陣列流程就是啟動的時候建好對話方塊陣列,需要的時候顯示視窗並繫結乙個通訊物件,不需要的時候隱藏視窗並移除通訊物件。
首先主視窗類中新增對話方塊陣列ctestdlg1 m_testdlg[10],在主對話方塊的oninitdialog()中建立對話方塊陣列,注意這裡建立的是非模式對話方塊。
for (int i=0;i<10;i++)
上面要注意到需要有個標識變數來表示對話方塊是否在使用中。另外由於是非模式對話方塊,所以我們需要在對話方塊的destroywindow()中銷毀它們,不然會造成資源洩露。
for (int i=0;i<10;i++)
下面看看如何利用這些對話方塊,主要是對話方塊的顯示和隱藏。在顯示的時候繫結通訊物件,在關閉對話方塊的時候隱藏視窗和移除通訊物件
//查詢乙個沒有在使用的對話方塊
for (int i=0;i<10;i++)
} //過載m_testdlg對話方塊的oncancel()函式,同時設定使用標識為未使用
void ctestdlg1::oncancel()
總體來說這個方案比較容易理解,過程也比較清晰,也是我最初想出來的方案。
方案二:多執行緒加訊息迴圈
//具體執行緒實現,具體需要轉換pparam並繫結通訊物件
uint workerthread(lpvoi***aram)
dlg.destoywindow();
return 0;}
要使用的時候,直接建立執行緒,傳入通訊物件就行了。值得注意的建立ui執行緒要使用afxbeginthread而不是createthread。
方案三:訊息通知主視窗建立
主視窗是個ui執行緒,可以建立非模式對話方塊而且參與到主視窗的訊息幫浦中不會銷毀。方案三就是利用了這個特性,從而可以在工作執行緒中傳送訊息給主視窗並讓其建立對話方塊。
新增自定義訊息處理函式lresult ondlgtest(wparam wparam, lparam lparam),響應訊息wm_dlgtest。
//訊息處理函式實現
lresult ctestmodaldlg::ondlgtest(wparam wparam, lparam lparam)
當我們需要建立視窗的時候只要傳送訊息wm_dlgtest給主視窗就行了。同前面的方案一樣,需要非模式對話方塊都需要呼叫destorywindow來銷毀視窗,另外方案三中要注意的是,pdlg由new分配的,需要delete指標,這個工作是過載ctestdlg的postncdestroy函式,在其中釋放自己。
三種方案中,筆者比較推薦方案三,支援視窗無限建立,**量也相對較少,處理起來簡單。筆者才疏學淺,如有錯誤之處,歡迎讀者斧正。
Screen命令以及遠端多視窗控制
screen命令以及遠端多視窗控制 當我們使用putty來操作伺服器時候,當putty連線斷了,後台伺服器操作也斷了。為了擬補這個不足,我們選擇了screen 來建立不同的視窗 1.當screen s 名字來建立乙個視窗,如 screen s chunweitian 建立名字為chunweitian...
Screen命令以及遠端多視窗控制
screen命令以及遠端多視窗控制 當我們使用putty來操作伺服器時候,當putty連線斷了,後台伺服器操作也斷了。為了擬補這個不足,我們選擇了screen 來建立不同的視窗 1.當screen s 名字來建立乙個視窗,如 screen s建立名字為chunweitian的視窗 2.screen ...
遠端控制程式設計揭密
將遠端控制應用於教學中,已成為目前計算機化教學的重要手段。一定有很多的網蟲想了解這種網路教學方式的程式設計原理吧。在此我們就以乙個簡單的遠端控制程式作為示例,說明這種網路程式設計的基本原理。本程式以delphi程式設計為例。其實該程式的工作機制很簡單,受控方執行乙個程式,用於偵聽埠並接收資料報,而主...