////////////////////////////////
// ECCSkelton
// CCLIPBOARDクラス定義ファイル
// Copyright (c) August, 2022
//        By Ysama
////////////////////////////////

class CCLIPBOARD {
private:
	//変数
	HWND m_hWnd;		//クリップボードを使用するウィンドウハンドル
	WCHAR* m_Text;		//テキスト情報用
	HBITMAP m_hBitmap;	//ビットマップ情報用
public:
	//関数
	CCLIPBOARD();		//コンストラクター
	CCLIPBOARD(HWND);	//コンストラクター
	~CCLIPBOARD();		//デストラクター
	void SetWnd(HWND);
	WCHAR* GetText();
	bool SetText(WCHAR*);
	HBITMAP GetBitmap();
	bool SetBitmap(HBITMAP);
};

CCLIPBOARD::CCLIPBOARD() {
	m_hWnd = NULL;
	m_Text = NULL;
	m_hBitmap = NULL;
}

CCLIPBOARD::CCLIPBOARD(HWND hWnd) {
	m_hWnd = hWnd;
	m_Text = NULL;
	m_hBitmap = NULL;
}

CCLIPBOARD::~CCLIPBOARD() {
	if(!m_Text)
		delete [] m_Text;
}

void CCLIPBOARD::SetWnd(HWND hWnd){
	m_hWnd = hWnd;
}

WCHAR* CCLIPBOARD::GetText() {

	//クリップボードにテキストデータがあるか否か
	if(!IsClipboardFormatAvailable(CF_TEXT))
		return NULL;
	//クリップボードを開く
	if(!OpenClipboard(m_hWnd))
		return NULL;
	//クリップボードデータポインターを取得
	HGLOBAL hGlobal = (HGLOBAL)GetClipboardData(CF_TEXT);
	if(!hGlobal) {
		CloseClipboard();
		return NULL;
	}
	//メモリーをロックした上で
	WCHAR *str = (WCHAR*)GlobalLock(hGlobal);
	//m_Textに必要な長さのメモリーを（既に使われていれば解放してから）確保
	if(m_Text)
		delete [] m_Text;
    m_Text = new WCHAR[lstrlenW(str) + 1];
	lstrcpyW(m_Text, str);
    GlobalUnlock(hGlobal);
    CloseClipboard();
	return m_Text;
}

bool CCLIPBOARD::SetText(WCHAR* str) {

	//テキストの長さ+1のグローバルメモリーを確保
	HGLOBAL hGlobal = GlobalAlloc(GHND, (lstrlenW(str) + 1) * sizeof(WCHAR));
	//テキストデータをそのグローバルメモリーへコピー
	WCHAR* pt = (WCHAR*)GlobalLock(hGlobal);
	lstrcpyW(pt, str);
	GlobalUnlock(hGlobal);
	//グローバルメモリーをクリプボードに渡す
	OpenClipboard(m_hWnd);
	EmptyClipboard();
	SetClipboardData(CF_TEXT, hGlobal);
	return CloseClipboard();
}

HBITMAP CCLIPBOARD::GetBitmap() {

	//クリップボードにテキストデータがあるか否か
	if(!IsClipboardFormatAvailable(CF_BITMAP))
		return NULL;
	//クリップボードを開く
	if(!OpenClipboard(m_hWnd))
		return NULL;
	//クリップボードデータポインターを取得
	m_hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
	CloseClipboard();
	return m_hBitmap;
}

bool CCLIPBOARD::SetBitmap(HBITMAP hBitmap) {

	//ビットマップハンドルをクリプボードに渡す
	OpenClipboard(m_hWnd);
	EmptyClipboard();
	SetClipboardData(CF_BITMAP, hBitmap);
	return CloseClipboard();
}
