[Visual C++] Clipboard 관리

spring·2020년 11월 9일
0
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()를 강제로 호출 하였다.

profile
Researcher & Developer @ NAVER Corp | Designer @ HONGIK Univ.

0개의 댓글