void CMyListView::OnEditCopy()
{
if ( !OpenClipboard() )
{
AfxMessageBox( _T("Cannot open the Clipboard") );
return;
}
// Remove the current Clipboard contents
if( !EmptyClipboard() )
{
AfxMessageBox( _T("Cannot empty the Clipboard") );
return;
}
// Get the currently selected data
HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, 64);
strcpy_s((char*)hGlob, 64, "Current selection\r\n");
// For the appropriate data formats...
if ( ::SetClipboardData( CF_TEXT, hGlob ) == NULL )
{
CString msg;
msg.Format(_T("Unable to set Clipboard data, error: %d"), GetLastError());
AfxMessageBox( msg );
CloseClipboard();
GlobalFree(hGlob);
return;
}
CloseClipboard();
}
위소스는 간단한 ctrl+c
소스로 msdn
에 잘 나와있다.
https://msdn.microsoft.com/ko-kr/library/80db3kax.aspx
클립보드는 char* 로 이루어져있으며 만일 자신의 프로젝트가 TCHAR 이면
char로 변환을 시켜서 복사하여만 한다.
Paste는 더 간단하다. 내 ty studio 프로젝트에 쓰인 paste 이다.
TCHAR 로 바꿔서 저장한다.
void CProcessingIDEView::OnPaste(){
BOOL bRtn = FALSE;
// open clipboard
if (!OpenClipboard())
{
AfxMessageBox(_T("Cannot open the Clipboard"));
return;
}
// open clipboard data
HGLOBAL hglb = GetClipboardData(CF_TEXT);
if(hglb == NULL)
return;
// copy memory
char* cstr = (char*)GlobalLock(hglb);
auto cstrLen = strlen(cstr);
TCHAR* tstr = new TCHAR[cstrLen+1];
MultiByteToWideChar(CP_ACP, NULL, cstr, -1, tstr, cstrLen+1);
auto tstrLen = _tcslen(tstr);
for(int i = 0; i < tstrLen; i++){
cm.code.InsertAfter(cm.codePos, tstr[i]);
cm.code.GetNext(cm.codePos);
}
delete tstr;
GlobalUnlock(hglb);
bRtn = CloseClipboard();
cm.__CalcCaretPos(caret, cm.codePos);
this->SetScrollCaretPos(caret);
CClientDC dc(this);
OnDraw(&dc);
this->OnInitialUpdate();
OnDraw(&dc);
}
Invailedate()
함수가 왜인지는 모르겠으나 작동을 하지않아
OnDraw()
를 강제로 호출 하였다.