クリップボードの使用(VC++) 1.クリップボードへデータをコピーしたり、クリップボードからデータを取得したりする為に、データ形式の登録が必要です。Windowsシステムは既に色んな標準な形式を登録済みです。例えば、テキストデータの場合は、CF_TEXTになっています。独自のデータ形式は、下記のように登録を行います。 #define CFSTR_TEXT_TEST "TextTest.Format" //独自のデータ形式 const UINT CF_TEXT_TEST = RegisterClipboardFormat(CFSTR_TEXT_TEST); 2.クリップボードへデータをコピーする方法。データをグローバルメモリにコピーして、メモリのハンドルとデータ形式IDを使って、クリップボードに指定されたデータ形式でデータを入れます。 void CTestCopyPasteDlg::OnButton1() { char buff[] = "Hello,World."; HANDLE hMem = ::GlobalAlloc(GHND, (strlen(buff) + 1)); if(hMem) { LPSTR lpMem = (LPSTR)::GlobalLock(hMem); memcpy(lpMem, buff, (strlen(buff) + 1)); ::GlobalUnlock(hMem); if (::OpenClipboard(m_hWnd)) { if (::EmptyClipboard()) { if (NULL != ::SetClipboardData(CF_TEXT_TEST, hMem)) ::CloseClipboard(); else ::GlobalFree(hMem); } } } } 3.クリップボードからトデータを取得する方法。取得したい形式のデータが存在するか確認してから、グローバルメモリからデータを取得します。 例: void CTestCopyPasteDlg::OnButton2() { CString strText; if (::IsClipboardFormatAvailable(CF_TEXT_TEST)) { if (::OpenClipboard(m_hWnd)) { HANDLE hData = ::GetClipboardData(CF_TEXT_TEST); if (hData) { LPSTR lpData =(LPSTR)GlobalLock(hData); strText = lpData; ::GlobalUnlock(hData); } ::CloseClipboard(); } } AfxMessageBox(strText); } 4.ちなみに、CF_TEXT_TEST と CF_TEXT を入れ替えれば、普通のテキストのコピー/ペーストになります。 |