/*! カーソル行をクリップボードにコピーする @date 2007.10.08 ryoji 新規(Command_COPY()から処理抜き出し) */ void CEditView::CopyCurLine( bool bAddCRLFWhenCopy, //!< [in] 折り返し位置に改行コードを挿入するか? EEolType neweol, //!< [in] コピーするときのEOL。 bool bEnableLineModePaste //!< [in] ラインモード貼り付けを可能にする ) { if( GetSelectionInfo().IsTextSelected() ){ return; } const CLayout* pcLayout = m_pcEditDoc->m_cLayoutMgr.SearchLineByLayoutY( GetCaret().GetCaretLayoutPos().y ); if( NULL == pcLayout ){ return; } /* クリップボードに入れるべきテキストデータを、cmemBufに格納する */ CNativeW cmemBuf; cmemBuf.SetString( pcLayout->GetPtr(), pcLayout->GetLengthWithoutEOL() ); if( pcLayout->GetLayoutEol().GetLen() != 0 ){ cmemBuf.AppendString( ( neweol == EOL_UNKNOWN ) ? pcLayout->GetLayoutEol().GetValue2() : CEol(neweol).GetValue2() ); }else if( bAddCRLFWhenCopy ){ // 2007.10.08 ryoji bAddCRLFWhenCopy対応処理追加 cmemBuf.AppendString( ( neweol == EOL_UNKNOWN ) ? WCODE::CRLF : CEol(neweol).GetValue2() ); } /* クリップボードにデータcmemBufの内容を設定 */ BOOL bSetResult = MySetClipboardData( cmemBuf.GetStringPtr(), cmemBuf.GetStringLength(), false, bEnableLineModePaste ); if( !bSetResult ){ ErrorBeep(); } }
bool CopyToClipboard(LPCWSTR asText) { INT_PTR cch = asText ? lstrlen(asText) : -1; if (cch < 0) return false; bool bCopied = false; if (MyOpenClipboard(L"CopyToClipboard")) { struct Data { size_t idx; HGLOBAL Hglbs[4]; UINT Formats[4]; void AddAnsiOem(LPCWSTR asText, INT_PTR cch, UINT cp) { HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (cch + 1) * sizeof(char)); if (!hglbCopy) return; char* lpstrCopy = (char*)GlobalLock(hglbCopy); if (!lpstrCopy) { GlobalFree(hglbCopy); return; } int iLen = WideCharToMultiByte(cp, 0, asText, cch+1, lpstrCopy, cch+1, NULL, NULL); GlobalUnlock(hglbCopy); if (iLen < 1) { GlobalFree(hglbCopy); } else { Hglbs[idx] = hglbCopy; Formats[idx] = (cp == CP_ACP) ? CF_TEXT : CF_OEMTEXT; idx++; } }; void AddData(const void* ptrData, size_t cbDataSize, UINT Format) { HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, cbDataSize); if (!hglbCopy) return; LPVOID lpbCopy = GlobalLock(hglbCopy); if (!lpbCopy) { GlobalFree(hglbCopy); return; } memmove(lpbCopy, ptrData, cbDataSize); GlobalUnlock(hglbCopy); Hglbs[idx] = hglbCopy; Formats[idx] = Format; idx++; }; } data = {}; if (gpSet->isCTSForceLocale) { data.AddAnsiOem(asText, cch, CP_ACP); data.AddAnsiOem(asText, cch, CP_OEMCP); _ASSERTE(sizeof(gpSet->isCTSForceLocale)==sizeof(DWORD)); data.AddData(&gpSet->isCTSForceLocale, sizeof(gpSet->isCTSForceLocale), CF_LOCALE); } // And CF_UNICODE data.AddData(asText, (cch + 1) * sizeof(*asText), CF_UNICODETEXT); _ASSERTE(data.idx <= countof(data.Hglbs)); if (data.idx) { EmptyClipboard(); } for (size_t f = 0; f < data.idx; f++) { if (MySetClipboardData(data.Formats[f], data.Hglbs[f]) != NULL) bCopied = true; else GlobalFree(data.Hglbs[f]); } MyCloseClipboard(); } return bCopied; }