+ // VZ: I'm told that this code works, but it doesn't seem to work for me
+ // and, anyhow, I'd be highly surprised if it did. So I leave it here
+ // but IMNSHO it is completely broken.
+#if wxUSE_METAFILE && !defined(wxMETAFILE_IS_ENH) && !defined(__WXWINCE__)
+ case wxDF_METAFILE:
+ {
+ wxMetafile *wxMF = (wxMetafile *)data;
+ HANDLE data = GlobalAlloc(GHND, sizeof(METAFILEPICT) + 1);
+ METAFILEPICT *mf = (METAFILEPICT *)GlobalLock(data);
+
+ mf->mm = wxMF->GetWindowsMappingMode();
+ mf->xExt = width;
+ mf->yExt = height;
+ mf->hMF = (HMETAFILE) wxMF->GetHMETAFILE();
+ GlobalUnlock(data);
+ wxMF->SetHMETAFILE((WXHANDLE) NULL);
+
+ handle = SetClipboardData(CF_METAFILEPICT, data);
+ break;
+ }
+#endif // wxUSE_METAFILE
+
+#if wxUSE_ENH_METAFILE && !defined(__WXWINCE__)
+ case wxDF_ENHMETAFILE:
+ {
+ wxEnhMetaFile *emf = (wxEnhMetaFile *)data;
+ wxEnhMetaFile emfCopy = *emf;
+
+ handle = SetClipboardData(CF_ENHMETAFILE,
+ (void *)emfCopy.GetHENHMETAFILE());
+ }
+ break;
+#endif // wxUSE_ENH_METAFILE
+
+ case CF_SYLK:
+ case CF_DIF:
+ case CF_TIFF:
+ case CF_PALETTE:
+ default:
+ {
+ wxLogError(_("Unsupported clipboard format."));
+ return false;
+ }
+
+ case wxDF_OEMTEXT:
+ dataFormat = wxDF_TEXT;
+ // fall through
+
+ case wxDF_TEXT:
+ {
+ char *s = (char *)data;
+
+ width = strlen(s) + 1;
+ height = 1;
+ DWORD l = (width * height);
+ HANDLE hGlobalMemory = GlobalAlloc(GHND, l);
+ if ( hGlobalMemory )
+ {
+ LPSTR lpGlobalMemory = (LPSTR)GlobalLock(hGlobalMemory);
+
+ memcpy(lpGlobalMemory, s, l);
+
+ GlobalUnlock(hGlobalMemory);
+ }
+
+ handle = SetClipboardData(dataFormat, hGlobalMemory);
+ break;
+ }
+ // Only tested with Visual C++ 6.0 so far
+#if defined(__VISUALC__)
+ case wxDF_HTML:
+ {
+ char* html = (char *)data;
+
+ // Create temporary buffer for HTML header...
+ char *buf = new char [400 + strlen(html)];
+ if(!buf) return false;
+
+ // Create a template string for the HTML header...
+ strcpy(buf,
+ "Version:0.9\r\n"
+ "StartHTML:00000000\r\n"
+ "EndHTML:00000000\r\n"
+ "StartFragment:00000000\r\n"
+ "EndFragment:00000000\r\n"
+ "<html><body>\r\n"
+ "<!--StartFragment -->\r\n");
+
+ // Append the HTML...
+ strcat(buf, html);
+ strcat(buf, "\r\n");
+ // Finish up the HTML format...
+ strcat(buf,
+ "<!--EndFragment-->\r\n"
+ "</body>\r\n"
+ "</html>");
+
+ // Now go back, calculate all the lengths, and write out the
+ // necessary header information. Note, wsprintf() truncates the
+ // string when you overwrite it so you follow up with code to replace
+ // the 0 appended at the end with a '\r'...
+ char *ptr = strstr(buf, "StartHTML");
+ sprintf(ptr+10, "%08u", (unsigned)(strstr(buf, "<html>") - buf));
+ *(ptr+10+8) = '\r';
+
+ ptr = strstr(buf, "EndHTML");
+ sprintf(ptr+8, "%08u", (unsigned)strlen(buf));
+ *(ptr+8+8) = '\r';
+
+ ptr = strstr(buf, "StartFragment");
+ sprintf(ptr+14, "%08u", (unsigned)(strstr(buf, "<!--StartFrag") - buf));
+ *(ptr+14+8) = '\r';
+
+ ptr = strstr(buf, "EndFragment");
+ sprintf(ptr+12, "%08u", (unsigned)(strstr(buf, "<!--EndFrag") - buf));
+ *(ptr+12+8) = '\r';
+
+ // Now you have everything in place ready to put on the
+ // clipboard.
+
+ // Allocate global memory for transfer...
+ HGLOBAL hText = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, strlen(buf)+4);
+
+ // Put your string in the global memory...
+ ptr = (char *)GlobalLock(hText);
+ strcpy(ptr, buf);
+ GlobalUnlock(hText);
+
+ handle = ::SetClipboardData(gs_htmlcfid, hText);
+
+ // Free memory...
+ GlobalFree(hText);
+
+ // Clean up...
+ delete [] buf;
+ break;
+ }