클립보드

클립보드는 특정 프로그램에서 데이터를 다른 프로그램으로 넘어갈수 있도록 해주는 윈도우의 기능입니다. 보통 “복사하기” 나 "Copy"항목을 이용하면 현재 설정된 데이터가 클립보드로 넘어갑니다. 클립보드로 넘어간 데이터를 다른 프로그램에서 "붙여넣기“ 나 "Paste”를 이용하면 클립보드에 있는 데이터를 넘겨 받을수 있습니다. 클립보드에는 문자,그림 등의 형태를 저장할수 있으며 OLE를 이용하게 되면 다양한 형태의 데이터를 클립보드로 저장하고 저장된 데이터를 클립보드에서 얻을수 있습니다. 본항목에서는 클립보드에 데이터를 넣는 방법과 데이터를 읽는 방법에 대해서 설명합니다.


클립보드 상태 알기

클립보드를 열고자 할경우에는 OpenClipboard와 CloseClipboard 함수를 사용하면 됩니다.

OpenClipboard();//클립보드를 연다.

  :  클립보드에 데이터를 넣던지 또는 데이터를 얻는다.

CloaseClipboard()//클립보드를 닫는다.

클립보드에는 다양한 포맷형태로 데이터가 저장되어 있습니다. 이런 클립보드에서 현재 원하는 형식의 데이터가 있는지를 확인할 때 사용하는 함수가IsClipboardFormatAvailable  입니다.


BOOL IsClipboardFormatAvailable(

UINT format //클립보드 데이터 포맷

); 

format는 다음과 같은 값을 가집니다.


CF_BITMAP : HBITMAP 형태의 데이터

CF_DIB : 장치독립적인 비트맵 데이터 보통 bmp파일에서 로드된 데이터

CF_TEXT : 문자 데이터

CF_PALETTE  : 팔레트 데이터

CF_RIFF : 멀티미디어에서 사용하는 오디오 음성등의 데이터

CF_WAVE : 웨이브 파일 포맷

CF_TIFF : 태그 이미지 파일 포맷


위의 플러그들외에서 다양한 플러그들이 있는데 그만큼 클립보드에 저장할 데이터는 광범위하다는 의미입니다. 예를 들어 현재 복사할 텍스트가 있는가를 확인하고자 한다면

 BOOL check;

 check=IsClipboardFormatAvailable(CF_TEXT);

하시면 됩니다.

만일 CF_TEXT 형의 데이터가 클립보드에 있다면 check는 TRUE값이 그렇지 않다면 FALSE값이 설정됩니다.

실제 클립보드에서 텍스트를 얻고자 한다면 다음과 같은 방법을 취할수 있습니다.


OpenClipboard();//클립보드를 연다.

if(IsClipboardFormatAvailable(CF_TEXT))//클립보드에 텍스트 데이터가 있으면

{

    클립보드에서 데이터를 얻는다..

}

CloaseClipboard()//클립보드를 닫는다.


때로는 클립보드에 있는 데이터를 삭제하고자 할경우가 있습니다. 이때 사용하는 함수가 EmptyClipboard입니다.

만일 어떤 데이터를 클립보드에 넣고자 한다면 그리고 현재 있는 데이터를 삭제하고자 한다면 다음과 같이 할수 있습니다.


OpenClipboard();//클립보드를 연다.

EmptyClipboard();//클립보드에서 데이터를 지운다.

CloaseClipboard()//클립보드를 닫는다.


클립보드에서 데이터 얻기와 데이터 쓰기

클립보드에서 데이터를 얻고자 할 경우 GetClipboardData 함수를 사용합니다.

예를 들어서 클립보드에서 텍스트 데이터를 얻고자 한다면 다음과 같이 할수 있습니다.

         HANDLE hClipboard;

hClipboard=GetClipboardData(CF_TEXT);

만약 텍스트 데이터가 없다면 hClipboard에는 NULL값이 전송될것입니다. 넘겨주는 형식이 메모리 핸들러 형식이기 때문에 이데이터를 사용허가권을 받기 위해서는 GlobalLock를 사용해야 합니다.


 HANDLE hClipboard;

 LPASTR pClipboard;

hClipboard=GetClipboardData(CF_TEXT);

pClipboard=GlobalLock(hClipboard);

 //pClipboar를 사용한다.


위와 같이 하면 클립보드에 있는 데이터를 바로 사용하는 형식이 됩니다. 때로는 클립보드에 있는 데이터를 자신의 프로그램 내로 복사하고자 할경우가 있습니다. 이럴경우에는 클립보드에 저장된 데이터 크기만큼 메모리를 확보한후에 데이터를 복사하면 됩니다. 다음은 클립보드에서 데이터를 복사하는 예입니다.



           //클립보드를 연다

        OpenClipboard(hwnd);

        //문자형식의 데이터를 클립보드에서 얻는다.

        hClipboard=GetClipboardData(CF_TEXT);

        //hClipboard가 NULL이면 클립보드를 닫는다.

        if(!hClipboard)

        {

                CloseClipboard();

                 return 0;

        }

        //클립보드 데이터를 넣을 메모리 할당

        szBuff=GlobalReAlloc(szBuff,GlobalSize(hClipboard),GMEM_MOVEABLE);

        //메모리 사용 허가권을 받는다.

        pBuff=(LPSTR)GlobalLock(szBuff);

        //클립보드 메모리 사용허가권을 받는다.

        pClipboard=GlobalLock(hClipboard);

        //클립보드 데이터를 복사한다.


클립 보드에 데이터를 넣고자 한다면 SetClipboardData를 사용하여 간단하게 넣을 수 있습니다.


HANDLE SetClipboardData(

UINT uFormat, // 클립 보드 데이터 포맷

HANDLE hMem // 데이터 적재 메모리 핸들

); 


위의 예에서 pBuff에 있는 데이터를 수정한후 다시 클립보드에 넘기고자 할 때 있대 pBuff를 넘겨주는 것이 아니라 szBuff를 넘겨주어야 합니다. 클립보드로 넘어가는 것은 메모리 사용 허가 포인터 변수가 아니라 메모리 핸들러 이기 때문입니다.

 SetClipboardData(CF_TEXT,szBuff); 

// ex)

void CAddPeerDlg::OnBnClickedCopyInfo()
{

 if ( !OpenClipboard() )
 {
  AfxMessageBox( "Cannot open the Clipboard" );
 }

 // Remove the current Clipboard contents  
 if( !EmptyClipboard() )
 {
  AfxMessageBox( "Cannot empty the Clipboard" );
 }

 LPTSTR  lptstrCopy; 
 HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, 100 * sizeof(char));

 lptstrCopy = (LPTSTR)GlobalLock(hglbCopy);

 UpdateData(TRUE);

 memcpy( lptstrCopy, m_cstrLocalIP.GetBuffer(), 15 );
 memcpy( lptstrCopy + 15, &m_uiLocalPORT, 2 );
 memcpy( lptstrCopy + 15 + 2, m_cstrExternalIP.GetBuffer(), 15 );
 memcpy( lptstrCopy + 15 + 2 + 15, &m_uiExternalPORT, 2 );
 lptstrCopy[99] = 0;

 GlobalUnlock(hglbCopy);

 // For the appropriate data formats...
 if ( ::SetClipboardData( CF_TEXT, lptstrCopy ) == NULL )  
 {
  AfxMessageBox( "Unable to set Clipboard data" );    
  CloseClipboard();
 }

 // ...  
 CloseClipboard();

}

 

 

 

void CAddPeerDlg::OnBnClickedPasteInfo()
{

 if ( !OpenClipboard() )
 {
  AfxMessageBox( "Cannot open the Clipboard" );
 }

 LPTSTR  lptstrCopy; 
 HGLOBAL hglbCopy = ::GlobalAlloc(GMEM_MOVEABLE, sizeof(char)*100);     // 전역메모리할당
 hglbCopy = GetClipboardData( CF_TEXT );

 lptstrCopy = (LPTSTR)GlobalLock(hglbCopy);

 m_cstrLocalIP = "";
 m_uiLocalPORT = 0;
 m_cstrExternalIP = "";
 m_uiExternalPORT = 0;

 char cTemp[100];
 memcpy( cTemp, lptstrCopy, 15 );
 m_cstrLocalIP = cTemp;
 memcpy( &m_uiLocalPORT, lptstrCopy + 15, 2 );
 m_uiLocalPORT = m_uiLocalPORT&0xffff;

 memcpy( cTemp, lptstrCopy + 15 + 2, 15 );
 m_cstrExternalIP = cTemp;
 memcpy( &m_uiExternalPORT, lptstrCopy + 15 + 2 +15, 2 );
 m_uiExternalPORT = m_uiExternalPORT&0xffff;

 UpdateData(FALSE);

 GlobalUnlock(hglbCopy);

 // ...  
 CloseClipboard();

}

Posted by 모과이IT
,