VC下复制位图到剪切板(Copy CBitBmp To ClipBoard)
简单的调用几个函数就可以了:
1 2 3 4 5 6 7 |
void CMyFun::CopyBmpToClipBoard(HBITMAP hBitmap) { OpenClipboard(); //打开剪贴板 EmptyClipboard(); //清空剪切板 SetClipboardData(CF_BITMAP, hBitmap); //将位图拷到剪贴板上 CloseClipboard(); //关闭剪贴板 } |
MSDN关于SetClipboardData的参数介绍,还可以使用很多功能:
第一个参数信息:
Standard Clipboard Formats
The clipboard formats defined by the system are called standard clipboard formats . These clipboard formats are described in the following table.
CF_BITMAP | A handle to a bitmap ( HBITMAP ). |
CF_DIB | A memory object containing a BITMAPINFO structure followed by the bitmap bits. |
CF_DIBV5 | Windows NT 5.0: A memory object containing a BITMAPV5HEADER structure followed by the bitmap color space information and the bitmap bits. |
CF_DIF | Software Arts’ Data Interchange Format. |
CF_DSPBITMAP | Bitmap display format associated with a private format. The hMem parameter must be a handle of data that can be displayed in bitmap format in lieu of the privately formatted data. |
CF_DSPENHMETAFILE | Enhanced metafile display format associated with a private format. The hMem parameter must be a handle of data that can be displayed in enhanced metafile format in lieu of the privately formatted data. |
CF_DSPMETAFILEPICT | Metafile-picture display format associated with a private format. The hMem parameter must be a handle of data that can be displayed in metafile-picture format in lieu of the privately formatted data. |
CF_DSPTEXT | Text display format associated with a private format. The hMem parameter must be a handle of data that can be displayed in text format in lieu of the privately formatted data. |
CF_ENHMETAFILE | A handle of an enhanced metafile ( HENHMETAFILE ). |
CF_GDIOBJFIRST through CF_GDIOBJLAST | Range of integer values for application-defined GDI object clipboard formats. Handles associated with clipboard formats in this range are not automatically deleted using the GlobalFree function when the clipboard is emptied. Also, when using values in this range, the hMem parameter is not a handle to a GDI object, but is a handle allocated by the GlobalAlloc function with the GMEM_DDESHARE and GMEM_MOVEABLE flags. |
CF_HDROP | A handle of type HDROP that identifies a list of files. An application can retrieve information about the files by passing the handle to the DragQueryFile functions. |
CF_LOCALE | The data is a handle to the locale identifier associated with text in the clipboard. When you close the clipboard, if it contains CF_TEXT data but no CF_LOCALE data, the system automatically sets the CF_LOCALE format to the current input locale. You can use the CF_LOCALE format to associate a different locale with the clipboard text.
An application that pastes text from the clipboard can retrieve this format to determine which character set was used to generate the text. Note that the clipboard does not support plain text in multiple character sets. To achieve this, use a fomatted text data type such as RTF instead. Windows NT: The system uses the code page associated with CF_LOCALE to implicitly convert from CF_TEXT to CF_UNICODETEXT. Therefore, the correct code page table is used for the conversion. |
CF_METAFILEPICT | Handle of a metafile picture format as defined by the METAFILEPICT structure. When passing a CF_METAFILEPICT handle by means of dynamic data exchange (DDE), the application responsible for deleting hMem should also free the metafile referred to by the CF_METAFILEPICT handle. |
CF_OEMTEXT | Text format containing characters in the OEM character set. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. |
CF_OWNERDISPLAY | Owner-display format. The clipboard owner must display and update the clipboard viewer window, and receive the WM_ASKCBFORMATNAME , WM_HSCROLLCLIPBOARD , WM_PAINTCLIPBOARD , WM_SIZECLIPBOARD , and WM_VSCROLLCLIPBOARD messages. The hMem parameter must be NULL. |
CF_PALETTE | Handle of a color palette. Whenever an application places data in the clipboard that depends on or assumes a color palette, it should place the palette on the clipboard as well. |
If the clipboard contains data in the CF_PALETTE (logical color palette) format, the application should use the SelectPalette and RealizePalette functions to realize (compare) any other data in the clipboard against that logical palette. | |
When displaying clipboard data, the clipboard always uses as its current palette any object on the clipboard that is in the CF_PALETTE format. | |
CF_PENDATA | Data for the pen extensions to the Microsoft® Windows® for Pen Computing. |
CF_PRIVATEFIRST through CF_PRIVATELAST | Range of integer values for private clipboard formats. Handles associated with private clipboard formats are not freed automatically; the clipboard owner must free such handles, typically in response to the WM_DESTROYCLIPBOARD message. |
CF_RIFF | Represents audio data more complex than can be represented in a CF_WAVE standard wave format. |
CF_SYLK | Microsoft Symbolic Link (SYLK) format. |
CF_TEXT | Text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. Use this format for ANSI text. |
CF_WAVE | Represents audio data in one of the standard wave formats, such as 11 kHz or 22 kHz pulse code modulation (PCM). |
CF_TIFF | Tagged-image file format. |
CF_UNICODETEXT | Windows NT: Unicode text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. |
[网络转载] 剪切板的其他操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
拷贝与粘贴文本 下边的源代码演示了如何将文本(包含在CString对象“source”中)拷贝到剪贴板上。 CString source; //put your text in source if(OpenClipboard()) { HGLOBAL clipbuffer; char * buffer; EmptyClipboard(); clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1); buffer = (char*)GlobalLock(clipbuffer); strcpy(buffer, LPCSTR(source)); GlobalUnlock(clipbuffer); SetClipboardData(CF_TEXT,clipbuffer); CloseClipboard(); } 反过来,下面的代码是用来实现从剪贴板上取得文本的。 char * buffer = NULL; //open the clipboard CString fromClipboard; if ( OpenClipboard() ) { HANDLE hData = GetClipboardData( CF_TEXT ); char * buffer = (char*)GlobalLock( hData ); fromClipboard = buffer; GlobalUnlock( hData ); CloseClipboard(); } -------------------------------------------------------------------------------- 拷贝与粘贴WMF(enhanced)数据 你想在你的程序中往剪贴板上“画”以及向剪贴板读取图形吗?请放心,这个――不难!示范代码如下,其实现的是往剪贴板上写一enhanced metafile。 if ( OpenClipboard() ) { EmptyClipboard(); //create the metafile DC CMetaFileDC * cDC = new CMetaFileDC(); cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name"); //call draw routine here that makes GDI calls int cDC //close meta CMetafileDC and get its handle HENHMETAFILE handle = cDC->CloseEnhanced(); //place it on the clipboard SetClipboardData(CF_ENHMETAFILE,handle); CloseClipboard(); //delete the dc delete cDC; } 好啦,该演示反过来怎么做的代码了。我们从剪贴板上取得metafile并将其画到自己的应用程序的客户区DC(设备上下文)上(仅仅是个试验而已,实际上你可能更想将它拷贝一份儿)。 if ( OpenClipboard() ) { //Get the clipboard data HENHMETAFILE handle = (HENHMETAFILE)GetClipboardData(CF_ENHMETAFILE); //play it into a DC (our own DC in this example) CClientDC dc(this); CRect client(0,0,200,200); dc.PlayMetaFile(handle,client); //close the clipboard CloseClipboard(); } -------------------------------------------------------------------------------- 拷贝与粘贴一张位图(BitMap) 拷贝和粘贴位图可是需要一些微妙的处理的,不过基本的思想还是一样。请看下面的代码。 if ( OpenClipboard() ) { EmptyClipboard(); //create some data CBitmap * junk = new CBitmap(); CClientDC cdc(this); CDC dc; dc.CreateCompatibleDC(&cdc); CRect client(0,0,200,200); junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height()); dc.SelectObject(junk); //call draw routine here that makes GDI calls DrawImage(&dc,CString("Bitmap")); //put the data on the clipboard SetClipboardData(CF_BITMAP,junk->m_hObject); CloseClipboard(); //copy has been made on clipboard so we can delete delete junk; } 如下示例代码是从剪贴板上取得一张位图,将它粘贴到客户区DC中。 if ( OpenClipboard() ) { //Get the clipboard data HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP); CBitmap * bm = CBitmap::FromHandle(handle); CClientDC cdc(this); CDC dc; dc.CreateCompatibleDC(&cdc); dc.SelectObject(bm); cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY); CloseClipboard(); } -------------------------------------------------------------------------------- 建立并使用你自己定做的数据格式 如果你要拷贝、粘贴其它格式的数据,可以用RegisterClipboardFormat() API函数先将此格式注册,然后就可以“为所欲为”了。这简直是太有用了,尤其是在我们自己的应用程序中拷贝资料。假设我们有下面的结构: struct MyFormatData { long val1; int val2; }; 想将此结构的数据拷贝到剪贴板上。可以这样实现: UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT"); if(OpenClipboard()) { //make some dummy data MyFormatData data; data.val1 = 100; data.val2 = 200; //allocate some global memory HGLOBAL clipbuffer; EmptyClipboard(); clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData)); MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer); //put the data into that memory *buffer = data; //Put it on the clipboard GlobalUnlock(clipbuffer); SetClipboardData(format,clipbuffer); CloseClipboard(); } 想把它从剪贴板上读下来的话,也容易: //第二次调用时,此格式已经注册过了,读下来就行了 UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT"); MyFormatData data; if ( OpenClipboard() ) { //get the buffer HANDLE hData = GetClipboardData(format); MyFormatData * buffer = (MyFormatData *)GlobalLock( hData ); //留一份儿当地拷贝 data = *buffer; GlobalUnlock( hData ); CloseClipboard(); } -------------------------------------------------------------------------------- 取得剪贴板变化通知(Getting notified of clipboard changes) 一旦剪贴板上的内容发生改变,我们都希望能够获知(经由windows消息),这是很有用的。你可以用函数SetClipboardViewer()来捕获WM_DRAWCLIPBOARD消息。 在你的初始化代码中调用: SetClipboardViewer(); //add us to clipboard change notification chain 在你的消息映射(message map)中添加: ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //clipboard change notification 将其定义为: afx_msg void OnClipChange(); //clipboard change notification 实现为: void CDetectClipboardChangeDlg::OnClipChange() { //do something here, for example CTime time = CTime::GetCurrentTime(); SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S")); DisplayClipboardText(); } -------------------------------------------------------------------------------- 将数据粘贴到其它应用程序窗口中的方法 我觉得如果能把文本拷贝到剪贴板上(参见上面的代码),然后再在另外一个应用程序中将这些文本粘贴过来,那样才有用。我写了一个很不错的本地应用程序,此程序使用了含有此技术的第三方的语言翻译包。很简单,仅是取得目标窗口的句柄,并向它发送“PASTE”消息就OK了。 SendMessage(m_hTextWnd, WM_PASTE, 0, 0); |
Trackback from your site.