기능생각...기능에 따른 구현함수나 흐름
외부에서 데이터가 들어올때 그 데이터를 담아놓을 공간을 만드는것이 제일먼저.
1. 대화상자 기반의 새 프로젝트 생성(Clipboard)
2. 버튼 두 개, 에디트 컨트롤 한 개 추가
캡션 수정 Button1(Copy to clipboard), Button2(Read from clipboard)
3. 두 개의 버튼 이벤트 핸들러 추가
3.1 에디트컨트롤에 변수 추가(형식: value, 변수이름: m_strText)
3.2 Button1, Button2 코드 작성
**
데이터와 핸들을 받아올때는 무조건 예외처리 코드가 있어야 함!!!
void CClipboardDlg::OnBnClickedButton2()
{
if(!::OpenClipboard(m_hWnd)) return;
HGLOBAL hGlobalMemory;
hGlobalMemory = ::GetClipboardData(CF_UNICODETEXT);
::EmptyClipboard(); // 다시 초기화 시키고 싶을 때 가장 적당한 위치. 바로 해주는게 좋음
if (hGlobalMemory == NULL)
{
// ...
return;
}
TCHAR* pszBuffer = (TCHAR*)::GlobalLock(hGlobalMemory);
if(pszBuffer == NULL)
{
// ...
return;
}
m_strText.Format(_T("%s"), pszBuffer);
::GlobalUnlock(hGlobalMemory);
// ::EmptyClipboard();
::CloseClipboard();
UpdateData(FALSE);
}
void CClipboardDlg::OnBnClickedButton1()
{
UpdateData(TRUE);
if (m_strText.GetLength() <= 0)
return; // 에디트 컨트롤에 글자 있는지 검사. 없으면 굳이 열어서 쓸필요 없음
HGLOBAL hGlobalMemory;
TCHAR* pszBuffer=NULL;
if (::OpenClipboard(m_hWnd) == FALSE)
{
AfxMessageBox(_T("ERROR : Failed to open clipboard"));
return;
}
int nLength = m_strText.GetLength()*sizeof(TCHAR)+1;
//문자열대신 이미지를 사용할때는 비트맵사이즈를 이용할 수 있다.
// 가상메모리 공간에 nLength 길이만큼 공간을 할당받는다.
hGlobalMemory = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, nLength);
if (hGlobalMemory == NULL)
{
AfxMessageBox(_T("ERROR : Failed to allocate global memory"));
return;
}
pszBuffer = (TCHAR*)::GlobalLock(hGlobalMemory);
wsprintf(pszBuffer, _T("%s"), m_strText);
::GlobalUnlock(hGlobalMemory);
::EmptyClipboard(); //클립보드를 비워준다
::SetClipboardData(CF_UNICODETEXT, hGlobalMemory);
::CloseClipboard();
}
'PROGRAMMING > MFC(C++)' 카테고리의 다른 글
[0426수업] Windows Service Process (0) | 2011.04.26 |
---|---|
[0425수업] dll파일 만들기 (0) | 2011.04.25 |
[0422수업] IPC통신 (0) | 2011.04.22 |
[0422수업] 중복실행 방지 (0) | 2011.04.22 |
[0421수업] 소프트웨어 업데이트 (0) | 2011.04.21 |