Annotation of OpenXM_contrib2/windows/winfep/clipboard.txt, Revision 1.1
1.1 ! noro 1: 下の記述により、次のようなコードになると思われる。
! 2: str に送りたい文字列が入っているとする。
! 3:
! 4: int len=strlen(str)+1;
! 5: if (!OpenClipboard(NULL) ) return;
! 6: HGLOBAL hMem = GlobalAlloc(GMEM_FIXED,len);
! 7: LPTSTR pMem = (LPTSTR)hMem;
! 8: lstrcpy(pMem,(LPCTSTR)str);
! 9: EmptyClipboard();
! 10: SetClipboardData(CF_TEXT,hMem);
! 11: CloseClipboard();
! 12: SendMessage(asirhwnd,WM_CHAR,0x19,1); // 0x19=CTRL(Y) -> asirgui で Paste
! 13: SendMessage(asirhwnd,WM_CHAR,'\n',1);
! 14:
! 15: ---------------------------------------
! 16:
! 17: ここでは、クリップボードにテキストデータをコピーしたり、 クリップボードからテキストデータを取得する方法を説明する。
! 18:
! 19: クリップボードへテキストデータをコピーする
! 20: CClipboardというクラスを作成し、以下のような関数を定義する。
! 21: この関数は、引数に設定したテキストをクリップボードへコピーするというものである。
! 22:
! 23: BOOL CClipboard::SetClipboardText(LPCTSTR lpszText)
! 24: {
! 25: CString strText(lpszText);
! 26:
! 27: // 文字列が空の場合はコピーしない
! 28: if( strText.IsEmpty() )
! 29: return FALSE;
! 30:
! 31: // クリップボードのオープン
! 32: if( !::OpenClipboard(NULL) )
! 33: return FALSE;
! 34:
! 35: // ヒープ上にメモリ領域を確保し、文字列をコピー
! 36: int iStrLen = strText.GetLength() + 1;
! 37: HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED, iStrLen);
! 38: LPTSTR pMem = (LPTSTR)hMem;
! 39: ::lstrcpy(pMem, (LPCTSTR)strText);
! 40:
! 41: // クリップボードへ文字列をコピーし、クローズ
! 42: ::EmptyClipboard(); // クリップボードの中身を空にする
! 43: ::SetClipboardData(CF_TEXT, hMem);
! 44: ::CloseClipboard();
! 45:
! 46: return TRUE;
! 47: }
! 48:
! 49: クリップボードへコピーするデータは、GlobalAlloc APIを使って確保したメモリ領域に設定する必要がある。
! 50: ここでは第1引数にGMEM_FIXEDを指定しているので、 戻り値であるハンドルhMemをキャストするだけでポインタpMemが取得できる。
! 51: 第1引数にGMEM_MOVEABLEを指定した場合には、GlobalLock APIでポインタを取得する必要がある。
! 52: また、ヒープ上に確保したメモリ領域を解放(GlobalFree API)していないが、 SetClipboardData APIでクリップボードへ設定した
! 53: メモリ領域は以後クリップボードが制御するため、 アプリケーションが解放する必要はない(というか解放してはいけない)。
! 54: なお、OpenClipboard APIでクリップボードをオープンすると他のアプリケーションからは使えなくなるので、
! 55: 必要がなくなったらすぐにCloseClipboard APIでクローズすること。
! 56:
! 57: クリップボードのテキストデータを取得する
! 58: CClipboardというクラスに以下のような関数を定義する。 この関数は、クリップボードにクリップされたテキストデータが
! 59: あればそれを取得する。
! 60:
! 61: CString CClipboard::GetClipboardText()
! 62: {
! 63: CString strText;
! 64: strText.Empty();
! 65:
! 66: // クリップボードにテキストデータが入っているかを調べる
! 67: if( !::IsClipboardFormatAvailable(CF_TEXT) )
! 68: return strText;
! 69:
! 70: // クリップボードのオープン
! 71: if( !::OpenClipboard(NULL) )
! 72: return strText;
! 73:
! 74: // クリップボードからデータを取得し、strTextへコピー
! 75: HANDLE hMem = ::GetClipboardData(CF_TEXT);
! 76: LPTSTR pMem = (LPTSTR)::GlobalLock(hMem);
! 77: ::lstrcpy((LPTSTR)(LPCTSTR)strText, pMem);
! 78: ::GlobalUnlock(hMem);
! 79: ::CloseClipboard();
! 80:
! 81: return strText;
! 82: }
! 83:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>