티스토리 뷰
Visual Studio 2012
CListCtrl 을 활용해서 리스트에 있는 내용을 클립보드로 복사하기
1. 클립보드 복사 함수
함수 원형은 다음과 같다.
매개변수는 CListCtrl 포인터와 클립보드 저장 시 셀의 데이터를 나누는 기준(기본값 은 탭[\t])
// ...
BOOL CopyListToClipboard(CListCtrl* pListCtrl, LPCTSTR lpszSeparator = _T("\t"));
//...
함수 소스코드는 아래를 참조한다.
클래스이름에 본인이 쓰려는 클래스 이름을 넣으면 된다.
리스트에서 컬럼 제목과 선택된 리스트 데이터들을 클립보드에 복사하는 내용이다.
// ...
BOOL 클래스이름::CopyListToClipboard(CListCtrl* pListCtrl, LPCTSTR lpszSeparator /*= _T("\t")*/)
{
ASSERT(pListCtrl && ::IsWindow(pListCtrl->GetSafeHwnd()));
CString sResult;
POSITION pos = pListCtrl->GetFirstSelectedItemPosition();
if (!pos)
return TRUE;
CWaitCursor wait;
int nItem, nCount = 0;
int nColumn = 1;
//컬럼 이름 관련 구조체
TCHAR szName[128]; // This is the buffer where the name will be stored
LVCOLUMN lvColInfo;
lvColInfo.mask = LVCF_TEXT;
lvColInfo.pszText = szName;
lvColInfo.cchTextMax = _countof(szName);
//헤더와 컬럼 갯수 구하기
if ((pListCtrl->GetStyle() & LVS_TYPEMASK) == LVS_REPORT &&
pListCtrl->GetExtendedStyle() & LVS_EX_FULLROWSELECT)
{
CHeaderCtrl* pHeader = pListCtrl->GetHeaderCtrl();
nColumn = pHeader ? pHeader->GetItemCount() : 1;
}
//컬럼 이름 삽입
for (int i = 0; i < nColumn; ++i)
{
pListCtrl->GetColumn(i, &lvColInfo);
sResult += lvColInfo.pszText;
if (i != nColumn - 1)
sResult += lpszSeparator;
}
sResult += _T("\r\n");
//데이터 내용 삽입
while (pos)
{
nItem = pListCtrl->GetNextSelectedItem(pos);
if (0 != nCount)
sResult += _T("\r\n");
for (int i = 0; i < nColumn; ++i)
{
sResult += pListCtrl->GetItemText(nItem, i);
if (i != nColumn - 1)
sResult += lpszSeparator;
}
++nCount;
}
sResult += _T("\r\n");
//클립보드 저장
if (pListCtrl->OpenClipboard())
{
EmptyClipboard();
int nLen = sResult.GetLength() * sizeof(WCHAR) + 1;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, nLen);
LPBYTE pGlobalData = (LPBYTE)GlobalLock(hGlobal);
USES_CONVERSION_EX;
CopyMemory(pGlobalData, T2CW_EX(sResult, _ATL_SAFE_ALLOCA_DEF_THRESHOLD), nLen);
SetClipboardData(CF_UNICODETEXT, hGlobal);
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
CloseClipboard();
return TRUE;
}
return FALSE;
}
//...
위의 함수를 사용할 때는 아래와 같이 사용하면 된다.
// ... CopyListToClipboard(&m_ctrlList); //...
2. Ctrl+C 기능 구현하기
구현할 클래스에서 클래스 위자드를 열어서 가상함수 탭의 PreTranslateMessage 함수를 추가한다.
WM_KEYDOWN을 통해 C버튼이 눌렸는지 확인하고 GetKeyState(VK_CONTROL)을 통해 컨트롤키가 눌려있는지 확인한다.
처음에는 키 누르는 것에 따라 스탭을 줘서 구현해봤는데 작동이 제대로 되지 않았다..
if(pMsg->hwnd == m_CtrlList.GetSafeHwnd() && GetFocus()->GetSafeHwnd() == m_CtrlList.GetSafeHwnd()) 는 현재 메세지를 보내온 주체가 해당 리스트에서 온것인지를 파악하기 위해 사용한다.
함수의 소스는 다음과 같다.
// ...
BOOL 클래스이름::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case 'C':
if(GetKeyState(VK_CONTROL)<0)
{
if(pMsg->hwnd == m_CtrlList.GetSafeHwnd() &&
GetFocus()->GetSafeHwnd() == m_CtrlList.GetSafeHwnd())
{
CopyListToClipboard(&m_CtrlList);
}
}
return true;
default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
//...
끝
'Programming > MFC(C++)' 카테고리의 다른 글
| [MFC] 운영체제(OS) Bit 확인하기 (0) | 2018.10.26 |
|---|---|
| [MFC] CreateProcess와 CreatePipe를 이용하여 ping command 실행 하고 결과 읽기 (0) | 2018.10.26 |
| [MFC] 람다 표현으로 CArray 정렬하기 (0) | 2018.10.22 |
| [MFC] 멀티스레드 사용하여 소켓통신 채팅 서버 프로그램 만들기 (9) | 2018.07.20 |
| [MFC] 소켓통신 채팅 클라이언트 프로그램 만들기 (14) | 2018.07.19 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 소켓
- 법정동코드
- 항공알파벳
- MFC
- sqlite3
- 청년내일채움공제 만기신청
- 부가가치세전산매체
- 프로세스이름변경
- MXCOMPONENT
- MFC ADO
- 해외송금확인
- 모달리스
- #자동업데이트
- c++
- 전자신고변환
- MSSQL
- MFC Modeless
- SendMessage
- Sticky Notes Loading
- 모달리스 다이얼로그
- 스쿠트항공 환불받기
- 부가가치세
- 세금계산서합계표양식
- ADO
- Modeless
- 전자신고파일설명서
- CMFCBUTTON
- 스티커메모로드중
- ADODB
- 청년내일채움공제
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
글 보관함