VC 傳統剪貼簿的延遲提交技術

2021-09-07 09:49:29 字數 2008 閱讀 5931

傳統剪貼簿存在的侷限

傳統剪貼簿有乙個侷限性:剪貼簿上的所有資料都要儲存在記憶體上。

對於文字字串和其它簡單資料型別,可以快速有效地傳遞。但是,對於比較大的資料,清空剪貼簿之前,資料都要占用較大的記憶體。而如果沒有人貼上這個位圖,給它分配的記憶體就毫無用處。

延遲提交技術

為了避免這種浪費,windows支援延遲提交。即直到需要的時候才將資料複製到剪貼簿。

首先,用有效的剪貼簿格式和null資料控制代碼呼叫::setclipboarddata。

然後,響應wm_renderformat訊息,呼叫::setclipboarddata將資料真正地放入剪貼簿。

應用呼叫::getclipboarddata請求獲取指定格式的資料時,就會傳送wm_renderformat訊息。

如果沒有人請求資料,就不會傳遞這條訊息,就無需分配10mb的記憶體。

要注意,該訊息的處理函式不應該呼叫::openclipboard和::closeclipboard,因為接收該訊息的視窗,收到訊息時就占有了剪貼簿。 

處理wm_renderformat訊息的應用還必須處理wm_renderallformats訊息。

當應用終止而剪貼簿擁有應用放置的null資料控制代碼時,就會傳送這條訊息。

該訊息處理函式的任務是開啟剪貼簿、傳遞應用承諾提供的資料、關閉剪貼簿。

將資料放入剪貼簿,保證使用延遲提交的應用終止後,其它應用可以使用這些資料。

延遲提交中還會使用wm_destroyclipboard訊息。

這條訊息通知應用不需要再提供延遲提交資料。

當其它應用呼叫::emptyclipboard時,傳送該訊息。

在wm_renderallformats訊息之後也傳送該訊息。

如果你擁有響應wm_renderformat和wm_renderallformats所需的資源,可以在收到wm_destroyclipboard訊息時安全釋放它們。

測試實現

新建乙個基於對話方塊的mfc應用程式,取名為tradclipboard;

一路「next」到底;

在主對話方塊上增加乙個按鈕(idc_btn_setclipboard);

在tradclipboarddlg.h中, 宣告訊息響應:

//

generated message map functions

//}afx_msg

declare_message_map()

在tradclipboarddlg.cpp中, 新增訊息響應對映並實現:   

begin_message_map(ctradclipboarddlg, cdialog)

//}afx_msg_map

end_message_map()

void

ctradclipboarddlg::onlbuttondown(uint nflags, cpoint point)

void

ctradclipboarddlg::onbtnsetclipboard()

if(!emptyclipboard() )

setclipboarddata( cf_text, null) ;

closeclipboard();

}void

ctradclipboarddlg::onrenderformat(uint nformat)

}void

ctradclipboarddlg::onrenderallformats()

void

ctradclipboarddlg::ondestroyclipboard()

執行:

剪貼簿延遲提交的實現

剪帖板延遲提交即程式要與其它程式交換資料使用剪帖板時,在成為剪帖板所有者時並不將資料拷貝到剪帖板中,而是將剪帖板清空,在有程式需要剪帖板資料時,window會給當前的剪帖板所有者傳送訊息,要求提供剪帖板資料。這種情況一般用在多種剪帖板格式提供時。1。首先清空剪帖板 if openclipboard ...

VC 剪貼簿操作

本文主要介紹了 vc mfc 中如下內容的剪貼簿操作 1 文字內容的操作2 wmf資料的操作 3 點陣圖的操作 4 設定使用自定義格式 5 感知剪貼簿內容的改變 6 自動將資料貼上到另一應用程式視窗 一 文字內容的操作 下面的 示範了如何將文字內容複製到剪貼簿 unicode 編碼的先轉化為 asc...

VC 剪貼簿操作

vc mfc 中如下內容的剪貼簿操作 1 文字內容的操作2 wmf資料的操作 3 點陣圖的操作 4 設定使用自定義格式 5 感知剪貼簿內容的改變 6 自動將資料貼上到另一應用程式視窗 一 文字內容的操作 下面的 示範了如何將文字內容複製到剪貼簿 unicode 編碼的先轉化為 ascii cstri...