傳統剪貼簿存在的侷限
傳統剪貼簿有乙個侷限性:剪貼簿上的所有資料都要儲存在記憶體上。
對於文字字串和其它簡單資料型別,可以快速有效地傳遞。但是,對於比較大的資料,清空剪貼簿之前,資料都要占用較大的記憶體。而如果沒有人貼上這個位圖,給它分配的記憶體就毫無用處。
延遲提交技術
為了避免這種浪費,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中, 宣告訊息響應:
//在tradclipboarddlg.cpp中, 新增訊息響應對映並實現:generated message map functions
//}afx_msg
declare_message_map()
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...