Visual C++クリップボード操作
4350 ワード
記事の概要:
1、テキスト内容の操作
2、WMFデータの操作
3、ビットマップの操作
4、カスタムフォーマットの設定
5、クリップボードの内容の変化を感知する
6、データを自動的に別のアプリケーションウィンドウに貼り付ける
一、テキストの内容をクリップボードにコピーする方法:
次のコードは、クリップボードからテキストの内容を取得する方法を示しています.
二、WMFデータの操作
クリップボードに画像データを読み書きするのは非常に有用な機能であり、実現も簡単です.次のコードは、拡張エンティティファイルをクリップボードにコピーする方法を示しています.
次のコードは、クリップボードからエンティティファイルを取得し、クライアントDCに描画することを示します.
三、ビットマップの操作
ビットマップの操作は少し複雑ですが、次の例では、クリップボードにビットマップを保存する方法を示します.
次のコードは、クリップボードからビットマップデータを取得する方法を示します.
四、カスタムフォーマットの設定と使用
RegisterClipboardFormat()関数を使用すると、必要なデータ型をコピーして貼り付けることができます.たとえば、次のデータ型があります.
クリップボードにコピーするには、次のコードを使用します.
データの読み込みには、次のコードが使用されます.
五、クリップボードの内容の変化を感知する
Windowsメッセージを使用して、クリップボードの内容が変更されたかどうかを確認できます.コードは次のとおりです.
六、データを自動的に別のアプリケーションウィンドウに貼り付ける
該当するウィンドウのハンドルを取得し、メッセージを送信するだけです.
SendMessage(m_hTextWnd, WM_PASTE, 0, 0);
1、テキスト内容の操作
2、WMFデータの操作
3、ビットマップの操作
4、カスタムフォーマットの設定
5、クリップボードの内容の変化を感知する
6、データを自動的に別のアプリケーションウィンドウに貼り付ける
一、テキストの内容をクリップボードにコピーする方法:
CString source;// source
if(OpenClipboard())
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, dource.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
lstrcpy(buffer, LPCSTR(source));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
次のコードは、クリップボードからテキストの内容を取得する方法を示しています.
char * buffer = NULL;
CString fromClipboard;
if ( OpenClipboard() )//
{
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData);
fromClipboard = buffer;
GlobalUnlock(hData);
CloseClipboard();
}
二、WMFデータの操作
クリップボードに画像データを読み書きするのは非常に有用な機能であり、実現も簡単です.次のコードは、拡張エンティティファイルをクリップボードにコピーする方法を示しています.
if(OpenClipboard());
{
EmptyClipboard();
// DC
CMetaFileDC * cDC = new CMetaFileDC();
cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");
//
// CMetafileDC
HENHMETAFILE handle = cDC->CloseEnhanced();
//
SetClipBoardData(CF_ENHMETAFILE,handle);
CloseClipboard();
// dc
delete cDC;
}
次のコードは、クリップボードからエンティティファイルを取得し、クライアントDCに描画することを示します.
if(OpenClipboard())
{
//
HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);
//
CClientDC dc(this);
CRect client(0,0,200,200);
dc.PlayMetaFile(handle,client);
//
CloseClipboard();
}
三、ビットマップの操作
ビットマップの操作は少し複雑ですが、次の例では、クリップボードにビットマップを保存する方法を示します.
if(OpenClipboard())
{
EmptyClipboard();
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);
DrawImage(&dc,CString("Bitmap"));
//
SetClipboardData(CF_BITMAP,junk->m_hObject);
CloseClipboard();
delete junk;
}
次のコードは、クリップボードからビットマップデータを取得する方法を示します.
if(OpenClipboard())
{
//
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()関数を使用すると、必要なデータ型をコピーして貼り付けることができます.たとえば、次のデータ型があります.
struct MyFormatData
{
long val1;
int val2;
};
クリップボードにコピーするには、次のコードを使用します.
UINT format = RegisterClipBoardFormat("MY_CUSTOM_FORMAT");
if(OpenClipboard())
{
MyFormatData data;
data.val1 = 100;
data.val2 = 200;
HGLOBAL clipbuffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData));
MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer);
//
*buffer = data;
//
GlobalUnlock(clipbuffer);
SetClipboardData(format,clipbuffer);
CloseClipboard();
}
データの読み込みには、次のコードが使用されます.
UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");
MyFormatData data;
if(Openclipboard())
{
HANDLE hData =GetClipboardData(format);
MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);
data = *buffer;
GlobalUnlock(hData);
CloseClipboard();
}
五、クリップボードの内容の変化を感知する
Windowsメッセージを使用して、クリップボードの内容が変更されたかどうかを確認できます.コードは次のとおりです.
In your initialization code call:
SetClipboardViewer(); //
In your message map add:
ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) // Message handle
Which is declared as:
afx_msg void OnClipChange();
Finally implement:
void CDetectClipboardChangeDlg::OnClipChange()
{
CTime time = CTime::GetCurrentTime();
SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S"));
DisplayClipboardText();
}
六、データを自動的に別のアプリケーションウィンドウに貼り付ける
該当するウィンドウのハンドルを取得し、メッセージを送信するだけです.
SendMessage(m_hTextWnd, WM_PASTE, 0, 0);