티스토리 툴바


Search

'프로그래밍/VC++'에 해당되는 글 56건

  1. 2008/03/06 마우스 움직이는대로 그리기
  2. 2008/03/04 전역 단축키 걸기
  3. 2008/02/25 ActiveX에서 Param 태그의 값 가져오게 하기
  4. 2007/11/24 VC2003 단축키
  5. 2007/11/23 XML에서 사용하는 예약어 못쓰게 막기
  6. 2007/11/22 버튼 동적 생성과 이벤트 연결
  7. 2007/10/28 CPPUnit 제대로 써보자.
  8. 2007/10/28 CFile 클래스를 이용해 파일크기 가져오기
  9. 2007/09/22 프로세스 실행시키고 종료될때까지 기다리기.
  10. 2007/08/29 다른 Application으로 Drag & Drop. MFC 클래스를 이용해서.
  11. 2007/08/28 Ole Drag & Drop
  12. 2007/08/16 Dialog Based의 트리컨트롤에서 Enter키를 눌러서 라벨내용 바꾸는 경우
  13. 2007/08/16 다이얼로그에서 ESC나 Enter키 눌렀다고 창 닫혀지지 않도록 하기
  14. 2007/08/16 MainFrame, Doc, View 포인터 얻기
  15. 2007/08/02 ActiveX 빌드 후 bin 디렉토리에 복사하는 이벤트
  16. 2007/07/23 GDI+에서 리소스 비트맵 가져와서 쓰기
  17. 2007/07/11 이미지 회전변환
  18. 2007/07/09 GDI+ 사용하기
  19. 2007/07/05 XP에서 IDC_HAND가 없다고 나올 때
  20. 2007/06/27 XML 저장하기
  21. 2007/06/12 GDI+를 이용 Drop Shadow 주기
  22. 2007/06/12 에디트박스에서 엔터키를 누르면 어떤 처리를 하도록.
  23. 2007/05/17 ActiveX가 초기화되었다는 이벤트 발생 방법
  24. 2007/04/25 ActiveX에서 만든 다이얼로그에 ActiveX 붙이기
  25. 2007/04/25 ActiveX에 CDialog 붙이는 법 (1)
  26. 2007/04/23 Free C/C++ 라이브러리
  27. 2007/04/23 이미지프로세싱 관련 라이브러리들
  28. 2007/04/21 스크롤 뷰에 이미지파일을 올리고 스크롤 하는 예제
  29. 2007/04/21 Dialog에 ScrollView 상속받아 만든 클래스 붙이기
  30. 2007/04/11 ATL로 이벤트발생시키고 MFC에서 받기

마우스 움직이는대로 그리기

프로그래밍/VC++ 2008/03/06 00:06 Posted by 팬소년

  

시작.
타블렛을 위해 마우스가 움직이는대로 그리는 프로그램을 만들려고 했다.
다 잘만들었다고 생각했다. 타블렛이 움직이는대로 글씨나 그림이 잘 그려졌다.

그런데 조그맣게 글씨를 쓰다보면 빠지는 획이 발생했다.
예를 들면 "잉어"라고 손으로 썼는데 "이어" 라고 쓰여진다거나 아주 조그만 ㅁ 을 그렸는데 맨 처음 그린 한 획만 그려지고 나머지 획들은 그려지지 않는 문제가 발생했다.

이거 원래 이래. 어쩔 수 없을거야.

MS One Note에서 타블렛을 테스트해 봤다.
아 놔. 겁나 잘 그려진다.
빠지는 획이 하나도 없을 뿐만 아니라, 너무 마음먹은 대로 잘 그려져서 마치 내가 그을려고 하는 곳을 미리 알고 점들이 미리 움직이는 듯한 느낌마저 들었다.

충격이었다. 뭘까.

처음엔 STL을 의심했다. list<> 에 push_back 할 때 겁나 시간이 많이 걸리거나 list<> 에 넣을 자료구조(32byte, 허걱. 줄여야지) 를 메모리에서 생성하는 시간이 겁나 오래 걸리는 게 아닌가 싶었다.

얘네들 아니다. 프로파일링해보면 0초로 표시된다.

그 다음엔 moveto, lineto를 의심했다. 어떤 사람이 저거 열라 느리니까 pdc->polyline을 쓰란다.
이거다 싶었다.

결과는 이전과 아주 약간 나아진 느낌(!)일 뿐 아무것도 나아진 게 없었다. 전과 비슷한 빈도로 획들이 빠졌다.

그 다음 의심한 게 GetDC(). 할때 마다 GetDC한다는 게 얼마나 느린 연산일까,
그 다음 의심한 게 CPen 생성.

전부 다 아니다.

그러다 이게 ActiveX로 만들어서 그런걸까 하고 의심했다.
ActiveX로 만들면 마우스 이벤트 받고 하는 부분에 조금 손해를 보는 게 아닐까 싶었다.
(아직 이건 테스트해보지 못했다.)


계속 테스트해본 결과 LButtonDown 이벤트가 발생하지 않는 경우가 발생한다는 것을 알았다.
이전 내 코드는

void CViewSpeedTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
 m_bMouseDown = true;
...
}

void CViewSpeedTestDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if (false == m_bMouseDown)
  return;
...
//그림그리기 혹은 그와 관련된 코드들
}


void CViewSpeedTestDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
 m_bMouseDown = false;
...
}

이런 식이었다. 결국 OnLButtonDown 이벤트 핸들러로 들어가지 않으면 그림을 그리지를 못했던 거다.
그런데 실제로 분명히 마우스 버튼을 눌렀음에도 저 이벤트가 발생하지 않는 경우가 꽤 되었다.
특히 조밀조밀 움직일 때는 꽤 자주 (서너번에 1번꼴) 이런 현상이 발생했다.

이걸 해결하는 방법은 의외로 매우 단순했다.

void CViewSpeedTestDlg::OnMouseMove(UINT nFlags, CPoint point)
{
 if (false == (nFlags & MK_LBUTTON))
  return;

...

이런 식이다.

그리고 m_bMouseDown 관련 내용은 싸그리 지워버렸다. 내 경우엔 버튼을 눌렀을 때 그림을 그린다는 목적외에는 사용하지 않았으니까.

아 너무 뿌듯하다.





전역 단축키 걸기

프로그래밍/VC++ 2008/03/04 10:29 Posted by 팬소년

  

RegisterHotKey 사용법...

1. 시작 시기에 걸맞는 곳에다 코딩한다.

   예를 들어 CMainFrame의 OnCreate에 코딩한다고 하고, Ctrl + P를 핫키로 하겠다면

   멤버 변수로 int m_nHotKeyID;

   m_nHotKeyID = ::GlobalAddAtom("test");

   if(!::RegisterHotKey(GetSafeHwnd(), m_nHotKeyID, MOD_CONTROL, 'P'))

       AfxMessageBox("핫키 등록 실패!");

2. CMainFrame에 afx_msg LONG OnHotKey(WPARAM wParam, LPARAM lParam)함수 추가하고

   메시지맵에 ON_MESSAGE(WM_HOTKEY, OnHotKey)

   한다. 이 때 //}}AFX_MSG_MAP 바깥에 한다.

   LONG CMainFrame::OnHotKey(WPARAM wParam, LPARAM lParam)
   {
       if((int)wParam == m_nHotKeyID)
       {
           // 하고 싶은 일 구현
       }
   }

3. 종료할 때 핫키를 해제한다.

   void CMainFrame::OnClose()
   {
       ::UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
   }






  

// CaxArchiveCtrl::DoPropExchange - 지속성 지원입니다.

void CaxArchiveCtrl::DoPropExchange(CPropExchange* pPX)
{
 ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
 
 PX_String(pPX, _T("MasterID"), m_MasterID) ;
 PX_String(pPX, _T("UserID"), m_UserID) ;
 PX_String(pPX, _T("Keyword"), m_Keyword) ;
 
 COleControl::DoPropExchange(pPX);

 // TODO: 지속적인 사용자 지정 속성 모두에 대해 PX_ functions를 호출합니다.
}

<body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0">
<script src="docwrite.js" language="JScript"></script>
<table border=0 width=100% height=100%>
<tr>
<td width=100% height=100%>
<script>
JS_viewObj('<object id="axDAS" classid="CLSID:2EC0FC40-CA00-4CF3-979D-386F55433844" width="100%" height="100%" ><param name="MasterID" value="마스터아이디"><param name="UserID" value="유저아이디"><param name="Keyword" value="키워드"></object>');
</script>
</td>
</tr>
</table>




TAG ActiveX

VC2003 단축키

프로그래밍/VC++ 2007/11/24 20:36 Posted by 팬소년

  
 
참고 항목 Visual Studio  

기본 설정 바로 가기 키

아래의 표는 기본 설정 키보드 구성표에 사용할 수 있는 기본 키 조합을 나열한 것입니다.

  • 일반 바로 가기 키   일반적으로 사용되는 바로 가기 키 조합과 IDE 내의 다양한 위치에서 사용할 수 있는 키 조합을 나열합니다.
  • HTML 디자이너 바로 가기 키   HTML 디자이너의 디자인 뷰와 HTML 뷰에서 작업할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • XML 디자이너 바로 가기 키   XML 디자이너의 스키마 뷰에서 작업할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 대화 상자 편집기의 액셀러레이터 키   대화 상자 편집기에서 작업할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 이미지 편집기의 액셀러레이터 키   이미지 편집기에서 작업할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 디버깅 바로 가기 키   디버거에서 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 찾기 및 바꾸기 바로 가기 키   찾기, 바꾸기, 파일에서 찾기, 파일에서 바꾸기 대화 상자에서 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • Visual Database Tools 바로 가기 키   쿼리 디자이너 또는 데이터베이스 디자이너에서 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 컨트롤 조작 바로 가기 키   디자인 화면에서 컨트롤을 이동하고 크기를 조정하는 데 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 텍스트 탐색 바로 가기 키   열린 문서의 코드 내에서 이동할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 텍스트 선택 바로 가기 키   열린 문서에서 텍스트를 선택할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 텍스트 조작 바로 가기 키   열린 문서에서 텍스트를 이동하거나, 삭제하거나, 서식을 지정할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 창 관리 바로 가기 키   도구 및 문서 창을 이동하거나, 닫거나, 탐색할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 통합 도움말 바로 가기 키   도움말 항목을 표시하거나 찾아 볼 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 개체 브라우저 바로 가기 키   개체 브라우저에서 작업할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 매크로 바로 가기 키   매크로를 작업할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 도구 창 바로 가기 키   여러 종류의 도구 창을 표시하는 바로 가기 키 조합을 나열합니다.
  • 프로젝트 바로 가기 키   프로젝트에 새 항목을 추가하거나, 프로젝트를 빌드하거나, 파일 또는 프로젝트를 열 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.
  • 기타 편집기 바로 가기 키   구성 요소 편집기, 문자열 편집기 및 액셀러레이터 키 편집기에서 작업할 때 사용할 수 있는 바로 가기 키 조합을 나열합니다.

일반 바로 가기 키

다음 바로 가기 키 조합은 IDE(통합 개발 환경) 내의 여러 위치에서 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
편집.복사 Ctrl+C
Ctrl+Ins
현재 선택한 항목을 시스템 클립보드에 복사합니다.
편집.잘라내기 Ctrl+X
Shift+Del
현재 선택한 항목을 시스템 클립보드로 잘라냅니다.
편집.클립보드링순환 Ctrl+Shift+Ins
Ctrl+Shift+V
도구 상자클립보드 링 탭에 있는 항목을 파일의 삽입 포인트에 붙여 넣고, 붙여 넣은 항목을 자동으로 선택합니다. 바로 가기 키를 반복해서 누르면 클립보드에 있는 각 항목을 검토할 수 있습니다.
편집.다음위치로이동 F8 커서를 다음 항목(예: 작업 목록 창에 있는 작업이나 찾기 결과 창에 있는 검색 결과 항목)으로 이동합니다. F8 키를 누를 때마다 목록의 다음 항목으로 이동합니다.
편집.이전위치로이동 Shift+F8 작업 목록 창이나 찾기 결과 창의 이전 항목으로 커서를 이동합니다.
편집.참조로이동 Shift+F12 코드에서 선택한 기호의 참조를 표시합니다.
편집.파일열기 Ctrl+Shift+G 기존 파일을 열 수 있는 파일 열기 대화 상자를 표시합니다.
편집.붙여넣기 Ctrl+V
Shift+Ins
클립보드 내용을 삽입 포인트에 삽입합니다.
편집.다시실행 Ctrl+Shift+Z
Ctrl+Y
Shift+Alt+백스페이스
이전에 실행 취소된 작업을 복원합니다.
편집.선택취소 Esc 메뉴 또는 대화 상자를 닫거나, 진행 중인 작업을 취소하거나, 현재 문서 창에 포커스를 둡니다. .NET Framework 디자이너에서만 사용할 수 있습니다.
편집.실행취소 Alt+백스페이스
Ctrl+Z
마지막 편집 작업을 취소합니다.
파일.인쇄 Ctrl+P 프린터 설정을 변경할 수 있는 인쇄 대화 상자를 표시합니다.
파일.모두저장 Ctrl+Shift+S 현재 솔루션의 모든 문서 및 외부 파일 프로젝트의 모든 파일을 저장합니다.
파일.선택한항목저장 Ctrl+S 현재 프로젝트의 선택 항목을 저장합니다.
도구.명령줄로이동 Ctrl+/ 캐럿을 표준 도구 모음의 찾기/명령 상자에 놓습니다.
보기.다음작업 Ctrl+Shift+F12 작업 목록 창의 다음 작업으로 이동합니다.
보기.찾아보기컨텍스트표시 Ctrl+Shift+8 찾아보기 동작이 마지막으로 수행된 위치로 되돌아갑니다. 개체 브라우저 또는 클래스 창에서 사용할 수 있습니다.
보기.코드보기 F7 선택한 항목을 편집기의 코드 뷰에 표시합니다.
보기.디자이너보기 Shift+F7 선택한 항목을 편집기의 디자인 뷰에 표시합니다.
보기.웹뒤로탐색 Alt+왼쪽 화살표 보고 있는 기록의 이전 페이지를 표시합니다. 웹 브라우저 창에서만 사용할 수 있습니다.
보기.웹앞으로탐색 Alt+오른쪽 화살표 보고 있는 기록의 다음 페이지를 표시합니다. 웹 브라우저 창에서만 사용할 수 있습니다.

HTML 디자이너 바로 가기 키

다음 바로 가기 키 조합은 HTML 디자이너에서 편집할 때만 사용할 수 있습니다. 일부 키 조합은 해당 디자이너의 특정 뷰에서만 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
편집.멤버목록 Ctrl+J 코드 편집 시 문 완성을 위해 현재 클래스의 멤버를 나열합니다. HTML 디자이너의 HTML 뷰에서만 사용할 수 있습니다.
편집.매개변수정보 Ctrl+Shift+스페이스바 현재 언어에 따라 현재 매개 변수에 대한 설명이 포함된 도구 설명을 표시합니다. HTML 편집기HTML 뷰에서만 사용할 수 있습니다.
편집.뷰맨아래로 Ctrl+Page Down 현재 문서의 맨 아래로 이동합니다. HTML 디자이너의 HTML 뷰에서만 사용할 수 있습니다.
편집.뷰맨위로 Ctrl+Page Up(다른 이름으로 파일 저장) 현재 창의 맨 위로 이동합니다. HTML 디자이너의 HTML 뷰에서만 사용할 수 있습니다.
서식.굵게 Ctrl+B 선택한 텍스트를 굵은 글꼴로 표시하거나 보통 글꼴로 표시합니다. HTML 디자이너디자인 뷰에서만 사용할 수 있습니다.
서식.책갈피 Ctrl+Shift+L 즐겨찾기 대화 상자를 표시합니다. HTML 디자이너의 디자인 뷰에서만 사용할 수 있습니다.
서식.하이퍼링크로변환 Ctrl+L 텍스트가 선택되어 있으면 하이퍼링크 대화 상자를 표시합니다. HTML 디자이너의 디자인 뷰에서만 사용할 수 있습니다.
서식.내어쓰기 Ctrl+Shift+T 선택한 단락을 내어쓰기 한 단위 씩 내어씁니다. HTML 디자이너디자인 뷰에서만 사용할 수 있습니다.
서식.들여쓰기 Ctrl+T 선택한 단락을 들여쓰기 단위 하나씩 들여씁니다. HTML 디자이너디자인 뷰에서만 사용할 수 있습니다.
서식.기울임꼴 Ctrl+I 선택한 텍스트를 기울임꼴로 표시하거나 보통 글꼴로 표시합니다. HTML 디자이너디자인 뷰에서만 사용할 수 있습니다.
서식.요소잠그기 Ctrl+Shift+K 절대 위치로 배치된 요소가 실수로 옮겨지지 않도록 합니다. HTML 디자이너디자인 뷰에서만 사용할 수 있습니다.
서식.모눈표시 Ctrl+G 모눈 표시를 전환합니다. HTML 디자이너의 디자인 뷰에서만 사용할 수 있습니다.
서식.모눈에맞춤 Ctrl+Shift+G 보이지 않는 모눈을 사용하여 요소를 맞추도록 지정합니다. 옵션 대화 상자에 있는 HTML 디자이너 옵션의 디자인 창에서 모눈 간격을 설정할 수 있으며, 다음에 문서를 열 때 모눈이 변경됩니다. HTML 디자이너의 디자인 뷰에서만 사용할 수 있습니다.
서식.밑줄 Ctrl+U 선택한 텍스트를 밑줄로 표시하거나 보통 글꼴로 표시합니다. HTML 디자이너디자인 뷰에서만 사용할 수 있습니다.
테이블.왼쪽에열삽입 Ctrl+Alt+왼쪽 화살표 테이블의 현재 열 왼쪽에 열을 하나 추가합니다. HTML 디자이너의 디자인 뷰에서만 사용할 수 있습니다.
테이블.오른쪽에열삽입 Ctrl+Alt+오른쪽 화살표 테이블의 현재 열 오른쪽에 열을 하나 추가합니다. HTML 디자이너의 디자인 뷰에서만 사용할 수 있습니다.
테이블.위에행삽입 Ctrl+Alt+위쪽 화살표 테이블의 현재 행 위에 행을 하나 추가합니다. HTML 디자이너의 디자인 뷰에서만 사용할 수 있습니다.
테이블.아래에행삽입 Ctrl+Alt+아래쪽 화살표 테이블의 현재 행 아래에 행을 하나 추가합니다. HTML 디자이너의 디자인 뷰에서만 사용할 수 있습니다.
보기.자세히 Ctrl+Shift+Q 주석, 스크립트 및 절대 위치로 배치된 요소의 앵커와 같이 눈에 보이는 표시가 없는 HTML 요소의 신호 아이콘을 표시합니다. HTML 디자이너의 디자인 뷰에서만 사용할 수 있습니다.
보기.다음뷰 Ctrl+Page Down 디자인 뷰에서 HTML 뷰로, 또는 그 반대로 전환합니다. HTML 디자이너디자인 뷰에서만 사용할 수 있습니다.
보기.테두리표시 Ctrl+Q 테이블, 테이블 셀, 분할선과 같이 BORDER 특성을 지원하며 해당 특성이 0으로 설정된 HTML 요소의 주위에 1픽셀짜리 테두리를 표시합니다. HTML 디자이너의 디자인 뷰에서만 사용할 수 있습니다.

XML 디자이너 바로 가기 키

명령 이름 바로 가기 키 설명
스키마.축소 Ctrl+(-) 중첩 요소를 축소합니다. XML 디자이너의 스키마 뷰에서만 사용할 수 있습니다.
스키마.확장 Ctrl+(=) 중첩 요소를 확장합니다. XML 디자이너의 스키마 뷰에서만 사용할 수 있습니다.

컨트롤 조작 바로 가기 키

다음 바로 가기 키 조합은 디자인 화면에서 컨트롤을 이동하거나, 선택하거나, 크기를 변경할 때 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
편집.컨트롤아래로이동 Ctrl+아래쪽 화살표 디자인 화면에서 선택한 컨트롤을 1단위씩 아래로 이동합니다.
편집.모눈아래로컨트롤이동 아래쪽 화살표 디자인 화면에서 선택한 컨트롤을 8단위씩 아래로 이동합니다.
편집.컨트롤왼쪽으로이동 Ctrl+왼쪽 화살표 디자인 화면에서 컨트롤을 1단위씩 왼쪽으로 이동합니다.
편집.모눈왼쪽으로컨트롤이동 왼쪽 화살표 디자인 화면에서 컨트롤을 8단위씩 왼쪽으로 이동합니다.
편집.컨트롤오른쪽으로이동 Ctrl+오른쪽 화살표 디자인 화면에서 컨트롤을 1단위씩 오른쪽으로 이동합니다.
편집.모눈오른쪽으로컨트롤이동 오른쪽 화살표 디자인 화면에서 컨트롤을 8단위씩 오른쪽으로 이동합니다.
편집.컨트롤위로이동 Ctrl+위쪽 화살표 디자인 화면에서 선택한 컨트롤을 1단위씩 위로 이동합니다.
편집.모눈위로컨트롤이동 위쪽 화살표 디자인 화면에서 선택한 컨트롤을 8단위씩 위로 이동합니다.
편집.다음컨트롤선택 Tab 페이지의 다음 컨트롤로 이동합니다.
편집.이전컨트롤선택 Shift+Tab 페이지에서 이전에 선택한 컨트롤로 다시 이동합니다.
편집.아래로컨트롤크기조정 Ctrl+Shift+아래쪽 화살표 디자인 화면에서 컨트롤의 높이를 1단위씩 높입니다.
편집.모눈아래로컨트롤크기조정 Shift+아래쪽 화살표 디자인 화면에서 컨트롤의 높이를 8단위씩 높입니다.
편집.왼쪽으로컨트롤크기조정 Ctrl+Shift+왼쪽 화살표 디자인 화면에서 컨트롤의 너비를 1단위씩 줄입니다.
편집.모눈왼쪽으로컨트롤크기조정 Shift+왼쪽 화살표 디자인 화면에서 컨트롤의 너비를 8단위씩 줄입니다.
편집.오른쪽으로컨트롤크기조정 Ctrl+Shift+오른쪽 화살표 디자인 화면에서 컨트롤의 너비를 1단위씩 늘립니다.
편집.모눈오른쪽으로컨트롤크기조정 Shift+왼쪽 화살표 디자인 화면에서 컨트롤의 너비를 8단위씩 늘립니다.
편집.위로컨트롤크기조정 Ctrl+Shift+위쪽 화살표 디자인 화면에서 컨트롤의 높이를 1단위씩 줄입니다.
편집.모눈위로컨트롤크기조정 Shift+왼쪽 화살표 디자인 화면에서 컨트롤의 높이를 8단위씩 줄입니다.

디버그 바로 가기 키

다음 바로 가기 키 조합은 코드를 디버깅할 때 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
디버그.코드변경내용적용 Alt+F10 편집하며 계속하기를 시작하여 디버그 중인 코드에 변경 내용을 적용합니다.
디버그.자동 Ctrl+Alt+V, A 현재 프로시저에서 현재 실행되는 줄의 범위에 현재 포함된 변수의 값을 볼 수 있는 자동 창을 표시합니다.
디버그.모두중단 Ctrl+Alt+ Break 디버깅 세션의 모든 프로세스 실행을 일시 중지합니다. 실행 모드에서만 사용할 수 있습니다.
디버그.중단점 Ctrl+Alt+B 중단점을 추가하고 수정할 수 있는 중단점 대화 상자를 표시합니다.
디버그.호출스택 Ctrl+Alt+C 활성화된 모든 프로시저 목록이나 현재 실행 스레드에 대한 스택 프레임을 표시하는 호출 스택 창을 표시합니다. 실행 모드에서만 사용할 수 있습니다.
디버그.모든중단점지우기 Ctrl+Shift+F9 프로젝트의 모든 중단점을 지웁니다.
디버그.디스어셈블리 Ctrl+Alt+D 디스어셈블리 창을 표시합니다.
디버그.중단점설정 Ctrl+F9 현재 코드 줄에 중단점을 설정합니다.
디버그.예외 Ctrl+Alt+E 예외 대화 상자를 표시합니다.
디버그.직접실행 Ctrl+Alt+I 식을 계산하고 개별 명령을 실행할 수 있는 직접 실행 창을 표시합니다.
디버그.지역 Ctrl+Alt+V, L 현재 스택 프레임의 각 프로시저에 대한 변수 및 각 변수의 값을 볼 수 있는 지역 창을 표시합니다.
디버그.메모리1 Ctrl+Alt+M, 1 조사식 창 또는 변수 창에서는 잘 표시되지 않는 큰 버퍼, 문자열, 또는 기타 데이터를 볼 수 있는 메모리1 창을 표시합니다.
디버그.메모리2 Ctrl+Alt+M, 2 조사식 또는 변수 창에 제대로 표시되지 않는 큰 버퍼, 문자열 및 기타 데이터를 볼 수 있는 메모리 2 창을 표시합니다.
디버그.메모리3 Ctrl+Alt+M, 3 조사식 또는 변수 창에 제대로 표시되지 않는 큰 버퍼, 문자열 및 기타 데이터를 볼 수 있는 메모리 3 창을 표시합니다.
디버그.메모리4 Ctrl+Alt+M, 4 조사식 또는 변수 창에 제대로 표시되지 않는 큰 버퍼, 문자열 및 기타 데이터를 볼 수 있는 메모리 4 창을 표시합니다.
디버그.모듈 Ctrl+Alt+U 프로그램에서 사용하는 .dll 또는 .exe 파일을 볼 수 있는 모듈 창을 표시합니다. 다중 프로세스 디버깅에서 마우스 오른쪽 단추로 클릭하여 모든 프로그램에 대해 모듈 표시를 선택할 수 있습니다.
디버그.새중단점 Ctrl+B 현재 코드 줄에서 중단점을 하나 삽입하거나 삭제합니다.
디버그.간략한조사식 Ctrl+Alt+Q 선택한 식의 현재 값이 포함된 간략한 조사식 대화 상자를 표시합니다. 중단 모드에서만 사용할 수 있습니다. 조사식을 아직 정의하지 않은 변수, 속성 또는 기타 식의 현재 값을 확인하려면 이 명령을 사용합니다.
디버그.레지스터 Ctrl+Alt+G 네이티브 코드 응용 프로그램을 디버깅하기 위한 레지스터 내용을 표시하는 레지스터 창을 표시합니다.
디버그.다시시작 Ctrl+Shift+F5 디버깅 세션을 종료하고 다시 빌드한 다음 처음부터 다시 응용 프로그램 실행을 시작합니다. 중단 및 실행 모드에서 사용할 수 있습니다.
디버그.실행중인문서 Ctrl+Alt+N 현재 디버깅 프로세스에 있는 문서들을 표시하는 실행 중인 문서 창을 표시합니다. 실행 모드에서 사용할 수 있습니다.
디버그.커서까지실행 Ctrl+F10 중단 모드에서는 현재 문부터 선택한 문까지 코드 실행을 다시 시작합니다. 현재 실행 중인 줄의 여백 표시기가 여백 표시줄에 나타납니다.
디자인 모드에서는 디버거를 시작하고 커서 위치까지 코드를 실행합니다.
디버그.다음문설정 Ctrl+Shift+F10 선택한 코드 줄을 실행 지점으로 설정합니다.
디버그.다음문표시 Alt+Num * 다음에 실행할 문을 강조 표시합니다.
디버그.시작 F5 자동으로 디버거에 연결하고 <Project> 속성 대화 상자에 지정된 시작 폼에서 응용 프로그램을 실행합니다. 중단 모드에서는 계속으로 바뀝니다.
디버그.디버깅하지않고시작 Ctrl+F5 디버거를 호출하지 않고 코드를 실행합니다.
디버그.한단계씩코드실행 F11 한 번에 하나씩 코드를 실행한 다음 함수 호출을 실행합니다.
디버그.프로시저나가기 Shift+F11 현재 실행 지점에서 함수의 나머지 줄을 실행합니다.
디버그.프로시저단위실행 F10 다음 코드 줄을 실행하지만 함수 호출을 통한 실행은 제외됩니다.
디버그.디버깅중지 Shift+F5 프로그램에서 현재 응용 프로그램의 실행을 중단합니다. 중단 및 실행 모드에서 사용할 수 있습니다.
디버그.This Ctrl+Alt+V, T 현재 메서드와 연결된 개체의 데이터 멤버를 볼 수 있는 이 창을 표시합니다.
디버그.스레드 Ctrl+Alt+H 현재 프로세스의 모든 스레드와 해당 스레드에 대한 정보를 볼 수 있는 스레드 창을 표시합니다.
디버그.중단점설정해제 F9 현재 줄에 중단점을 설정하거나 제거합니다.
디버그.디스어셈블리설정해제 Ctrl+F11 현재 소스 파일의 디스어셈블리 정보를 표시합니다. 중단 모드에서만 사용할 수 있습니다.
디버그.조사식1 Ctrl+Alt+W, 1 선택한 변수 또는 조사식의 값을 볼 수 있는 조사식 1 창을 표시합니다.
디버그.조사식2 Ctrl+Alt+W, 2 선택한 변수 또는 조사식의 값을 볼 수 있는 조사식 2 창을 표시합니다.
디버그.조사식3 Ctrl+Alt+W, 3 선택한 변수 또는 조사식의 값을 볼 수 있는 조사식 3 창을 표시합니다.
디버그.조사식4 Ctrl+Alt+W, 4 선택한 변수 또는 조사식의 값을 볼 수 있는 조사식 4 창을 표시합니다.
도구.프로세스디버그 Ctrl+Alt+P 한 솔루션에서 여러 프로그램을 디버깅할 수 있는 프로세스 대화 상자를 표시합니다.

찾기 및 바꾸기 바로 가기 키

다음 바로 가기 키 조합은 찾기, 바꾸기, 파일에서 찾기, 파일에서 바꾸기 대화 상자에서 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
편집.찾기 Ctrl+F 찾기 대화 상자를 표시합니다.
편집.파일에서찾기 Ctrl+Shift+F 파일에서 찾기 대화 상자를 표시합니다.
편집.다음찾기 F3 이전에 검색한 텍스트를 계속 찾습니다.
편집.다음찾기선택 Ctrl+F3 문서에서 현재 선택한 텍스트를 계속 찾습니다.
편집.이전찾기 Shift+F3 검색 텍스트를 뒤로 찾습니다.
편집.이전찾기선택 Ctrl+Shift+F3 현재 선택한 텍스트 또는 캐럿의 단어를 뒤로 찾습니다.
편집.찾기콤보상자로이동 Ctrl+D 캐럿을 표준 도구 모음의 찾기/명령 줄에 놓습니다.
편집.숨겨진텍스트 Alt+F3, H 찾기 대화 상자의 숨겨진 텍스트 검색 옵션을 선택하거나 선택 취소합니다.
편집.증분검색 Ctrl+I 증분 검색을 시작합니다. 증분 검색이 시작되었지만 아직 아무 문자도 입력하지 않은 경우에는 이전 패턴을 다시 호출합니다. 텍스트를 찾으면 다음 항목을 검색합니다.
편집.대소문자구분 Alt+F3, C. 찾기 및 바꾸기 작업에 대해 대/소문자 구분 옵션을 선택하거나 선택 취소합니다.
편집.정규식 Alt+F3, R 찾기 및 바꾸기 작업에 특수 문자를 사용할 수 있는 정규식 옵션을 선택하거나 선택 취소합니다.
편집.바꾸기 Ctrl+H 바꾸기 대화 상자를 표시합니다.
편집.파일에서바꾸기 Ctrl+Shift+H 파일에서 바꾸기 대화 상자를 표시합니다.
편집.역방향증분검색 Ctrl+Shift+I 파일 맨 아래에서 시작하여 위로 검색하도록 증분 검색의 방향을 변경합니다.
편집.검색중지 Alt+F3, S 현재 파일에서 찾기 작업을 중단합니다.
편집.위로 Alt+F3, B 찾기 및 바꾸기 작업에 대해 Search Up 옵션을 선택하거나 선택 취소합니다.
편집.단어단위로 Alt+F3, W 찾기 및 바꾸기 작업에 대해 단어 단위로 옵션을 선택하거나 선택 취소합니다.
편집.와일드카드 Alt+F3, P 찾기 및 바꾸기 작업에 대해 와일드카드 옵션을 선택하거나 선택 취소합니다.

Visual Database Tools 바로 가기 키

다음 바로 가기 키 조합은 데이터베이스 디자이너나 쿼리 디자이너에서 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
데이터베이스.실행 Ctrl+D 현재 활성화된 데이터베이스 개체를 실행합니다.
데이터베이스.선택영역실행 Ctrl+Q SQL 편집기에서 현재 선택된 영역을 실행합니다.
데이터베이스.한단계씩코드실행 Alt+F5 현재 활성화된 데이터베이스 개체에 대해 한 단계씩 실행하여 디버그 모드로 들어갑니다.
쿼리.실행 Ctrl+R 쿼리를 실행합니다. 쿼리 디자이너에서만 사용할 수 있습니다.
보기.다이어그램 Ctrl+1 쿼리 디자이너의 다이어그램 창을 표시합니다. 쿼리 디자이너에서만 사용할 수 있습니다.
보기.모눈 Ctrl+2 쿼리 디자이너의 Grid 창을 표시합니다. 쿼리 디자이너에서만 사용할 수 있습니다.
보기.결과 Ctrl +4 쿼리 디자이너의 결과 창을 표시합니다. 쿼리 디자이너에서만 사용할 수 있습니다.
보기.SQL Ctrl +3 쿼리 디자이너의 SQL 창을 표시합니다. 쿼리 디자이너에서만 사용할 수 있습니다.

텍스트 탐색 바로 가기 키

다음 바로 가기 키 조합은 텍스트 편집기에서 열려 있는 문서 내부를 이동할 때 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
편집.왼쪽문자로 왼쪽 화살표 커서를 왼쪽으로 한 문자 이동합니다. .NET Framework 디자이너에서만 사용할 수 있습니다.
편집.오른쪽문자로 오른쪽 화살표 커서를 오른쪽으로 한 문자 이동합니다. .NET Framework 디자이너에서만 사용할 수 있습니다.
편집.문서끝으로 Ctrl+End 삽입 포인트를 문서의 마지막 줄로 이동합니다.
편집.문서시작으로 Ctrl+Home 삽입 포인트를 문서의 첫 줄로 이동합니다.
편집.이동 Ctrl+G 줄 이동 대화 상자를 표시합니다.
편집.중괄호로이동 Ctrl+] 삽입 포인트를 다음 중괄호로 옮깁니다.
편집.줄아래로 아래쪽 화살표 커서를 한 줄 아래로 이동합니다.
편집.줄끝으로 End 커서를 현재 줄의 끝으로 이동합니다.
편집.줄시작으로 Home 커서를 줄의 처음으로 이동합니다.
편집.줄위로 위쪽 화살표 커서를 한 줄 위로 이동합니다.
편집.다음책갈피 Ctrl+K, Ctrl+N 문서의 다음 책갈피로 이동합니다.
편집.페이지아래로 Page Down 편집기 창에서 한 화면 아래로 스크롤합니다.
편집.페이지위로 Page Up 편집기 창에서 한 화면 위로 스크롤합니다.
편집.이전책갈피 Ctrl+K, Ctrl+P 이전 책갈피로 이동합니다.
편집.요약정보 Ctrl+K, Ctrl+I 현재 언어에 따라 요약 정보를 표시합니다.
편집.아래로줄스크롤 Ctrl+아래쪽 화살표 한 줄 아래의 텍스트로 스크롤합니다. 텍스트 편집기에서만 사용할 수 있습니다.
편집.위로줄스크롤 Ctrl+위쪽 화살표 한 줄 위의 텍스트로 스크롤합니다. 텍스트 편집기에서만 사용할 수 있습니다.
편집.다음단어로 Ctrl+오른쪽 화살표 삽입 포인트를 한 단어 오른쪽으로 이동합니다.
편집.이전단어로 Ctrl+왼쪽 화살표 삽입 포인트를 한 단어 왼쪽으로 이동합니다.
보기.다음찾아보기 Ctrl+Shift+1 다음 정의, 선언 또는 항목 참조를 탐색합니다. 개체 브라우저 및 클래스 뷰 창에서 사용할 수 있습니다.
보기.이전찾아보기 Ctrl+Shift+2 이전 정의, 선언 또는 항목 참조를 탐색합니다. 개체 브라우저 및 클래스 뷰 창에서 사용할 수 있습니다.

텍스트 선택 바로 가기 키

다음 바로 가기 키 조합은 텍스트 편집기에서 열려 있는 문서의 텍스트를 선택할 때 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
편집.왼쪽문자까지선택 Shift+왼쪽 화살표 커서를 왼쪽으로 한 문자 이동하여 선택 영역을 확장합니다. .NET Framework 디자이너에서만 사용할 수 있습니다.
편집.왼쪽문자까지열확장선택 Shift+Alt+왼쪽 화살표 커서를 왼쪽으로 한 문자 이동하여 열 선택 영역을 확장합니다.
편집.오른쪽문자까지선택 Shift+오른쪽 화살표 커서를 오른쪽으로 한 문자 이동하여 선택 영역을 확장합니다. .NET Framework 디자이너에서만 사용할 수 있습니다.
편집.오른쪽문자까지열확장선택 Shift+Alt+오른쪽 화살표 커서를 오른쪽으로 한 문자 이동하여 열 선택 영역을 확장합니다.
편집.문서끝까지선택 Ctrl+Shift+End 삽입 포인트부터 문서의 마지막 줄까지 텍스트를 선택합니다.
편집.문서시작까지선택 Ctrl+Shift+Home 삽입 포인트부터 문서의 첫 줄까지 텍스트를 선택합니다.
편집.중괄호로이동확장 Ctrl+Shift+] 삽입 포인트를 다음 중괄호로 이동하여 선택을 확장합니다.
편집.한줄아래까지선택 Shift+아래쪽 화살표 텍스트 선택 영역을 삽입 포인트가 있는 위치부터 시작해서 한 줄 아래로 확장합니다.
편집.한줄아래까지열확장선택 Shift+Alt+아래쪽 화살표 커서를 한 줄 아래로 이동해서 열 선택을 확장합니다.
편집.줄끝까지선택 Shift+End 삽입 포인트부터 현재 줄의 끝까지 텍스트를 선택합니다.
편집.줄끝까지열확장선택 Shift+Alt+End 삽입 포인트를 줄 끝으로 옮겨서 열 선택을 확장합니다.
편집.줄시작까지선택 Shift+Home 삽입 포인트부터 줄의 시작까지 텍스트를 선택합니다.
편집.줄시작까지열확장선택 Shift+Alt+Home 삽입 포인트를 줄의 처음으로 옮겨서 열 선택을 확장합니다.
편집.한줄위까지선택 Shift+위쪽 화살표 삽입 포인트 위치에서 시작하여 한 줄씩 위로 텍스트를 선택합니다.
편집.한줄위까지열확장선택 Shift+Alt+위쪽 화살표 커서를 한 줄 위로 이동해서 열 선택을 확장합니다.
편집.한페이지아래까지선택 Shift+Page Down 한 페이지 아래로 선택 영역을 확장합니다.
편집.한페이지위까지선택 Shift+Page Up 한 페이지 아래로 선택 영역을 확장합니다.
편집.모두선택 Ctrl+A 현재 문서의 모든 내용을 선택합니다.
편집.현재단어선택 Ctrl+W 삽입 포인트가 포함된 단어나 삽입 포인트의 오른쪽에 있는 단어를 선택합니다.
편집.이전위치까지선택 Ctrl+= 편집기의 현재 위치에서 편집기의 이전 위치까지 선택합니다.
편집.뷰맨아래까지선택 Ctrl+Shift+Page Down 커서를 뷰의 마지막 줄로 옮겨서 선택을 확장합니다.
편집.뷰맨위까지선택 Ctrl+Shift+Page Up 선택 영역을 현재 창의 맨 위로 확장합니다.
편집.다음단어까지선택 Ctrl+Shift+오른쪽 화살표 한 단어 오른쪽으로 선택 영역을 확장합니다.
편집.다음단어까지열확장선택 Ctrl+Shift+Alt+오른쪽 화살표 커서를 오른쪽으로 한 단어 이동하여 열 선택 영역을 확장합니다.
편집.이전단어까지선택 Ctrl+Shift+왼쪽 화살표 왼쪽으로 한 단어씩 선택을 확장합니다.
편집.이전단어까지열확장선택 Ctrl+Shift+Alt+왼쪽 화살표 커서를 왼쪽으로 한 단어 이동해서 열 선택을 확장합니다.

텍스트 조작 바로 가기 키

다음 바로 가기 키 조합은 텍스트 편집기에서 열려 있는 문서의 텍스트를 삭제하거나, 이동하거나, 서식을 지정할 때 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
편집.구분선 Enter
Shift+Enter
새 줄을 삽입합니다.
편집.문자바꾸기 Ctrl+T 삽입 포인트의 양쪽에 있는 문자를 바꿉니다. 예를 들어 AC|BD를 AB|CD로바꿉니다. 텍스트 편집기에서만 사용할 수 있습니다.
편집.책갈피지우기 Ctrl+K, Ctrl+L 현재 문서에서 명명되지 않은 책갈피를 모두 제거합니다.
편집.정의부분만보이기 Ctrl+M, Ctrl+O 프로시저와 같이 코드에 영역을 생성하기 위한 논리적 경계를 자동으로 결정한 후, 이를 숨깁니다.
편집.선택영역을주석으로처리 Ctrl+K, Ctrl+C 해당 프로그래밍 언어에 맞는 주석 구문을 사용하여 현재의 코드를 주석으로 표시합니다.
편집.단어자동완성 Alt+오른쪽 화살표
Ctrl+스페이스바
현재 언어에 따라 단어 완성을 표시합니다.
편집.삭제 Delete 커서의 오른쪽에 있는 문자 하나를 삭제합니다.
편집.뒤로삭제 백스페이스
Shift+백스페이스
커서의 왼쪽에 있는 문자 하나를 삭제합니다.
편집.가로공백삭제 Ctrl+K, Ctrl+\ 선택 영역의 공백을 축소합니다. 선택 영역이 없으면 커서 주위의 공백을 삭제합니다.
편집.문서서식 Ctrl+K, Ctrl+D 옵션 대화 상자에 있는 텍스트 편집기 섹션의 해당 언어 서식 창에 지정된 대로 해당 언어에 대한 들여쓰기 및 공백 서식을 적용합니다.
편집.선택영역서식 Ctrl+K, Ctrl+F 코드의 주변 줄에 맞춰 선택한 줄을 들여씁니다.
편집.선택영역숨기기 Ctrl+M, Ctrl+H 선택한 텍스트를 숨깁니다. 신호 아이콘은 파일에서 숨겨진 텍스트의 위치를 표시합니다.
편집.탭삽입 Tab 텍스트 줄을 지정한 공백 수 만큼(예: 5) 들여씁니다.
편집.줄잘라내기 Ctrl+L 선택한 모든 줄을 클립보드에 잘라냅니다. 선택한 줄이 없는 경우에는 현재 줄을 잘라냅니다.
편집.줄삭제 Ctrl+Shift+L 선택한 모든 줄을 삭제합니다. 선택한 줄이 없는 경우에는 현재 줄을 삭제합니다.
편집.위쪽줄열기 Ctrl+Enter 삽입 포인트 위에 빈 줄을 삽입합니다.
편집.아래쪽줄열기 Ctrl+Shift+Enter 삽입 포인트 아래에 빈 줄을 삽입합니다.
편집.줄바꾸기 Shift+Alt+T 삽입 포인트가 포함된 줄을 한 줄 아래로 이동합니다.
편집.소문자로 Ctrl+U 선택한 텍스트를 소문자로 변경합니다.
편집.대문자로 Ctrl+Shift+U 선택한 텍스트를 대문자로 변경합니다.
편집.겹쳐쓰기모드 Insert 삽입 모드와 겹쳐쓰기 모드를 전환합니다. 텍스트 편집기에서 작업할 때에만 사용할 수 있습니다.
편집.현재숨기기중지 Ctrl+M, Ctrl+U 현재 선택한 영역에 대한 개요 정보를 제거합니다.
편집.개요표시중지 Ctrl+M, Ctrl+P 전체 문서에 대한 개요 정보를 모두 제거합니다.
편집.앵커바꾸기 Ctrl+R, Ctrl+P 현재 선택 영역의 앵커와 끝 점을 바꿉니다.
편집.왼쪽으로탭이동 Shift+Tab 선택한 줄을 탭 정지 하나만큼 왼쪽으로 이동합니다.
편집.전체개요표시숨기기 Ctrl+M, Ctrl+L 이전에 표시된 모든 숨겨진 텍스트 섹션을 숨김 상태와 표시 상태 사이에서 전환합니다.
편집.책갈피설정해제 Ctrl+K, Ctrl+K 현재 줄에 책갈피를 설정하거나 제거합니다.
편집.개요확장축소 Ctrl+M, Ctrl+M 현재 선택된 숨겨진 텍스트 섹션을 숨김 상태와 표시 상태 사이에서 전환합니다.
편집.작업목록바로가기설정해제 Ctrl+K, Ctrl+H 현재 줄에 바로 가기를 설정하거나 제거합니다.
편집.자동줄바꿈설정해제 Ctrl +R, Ctrl+R 편집기의 자동 줄 바꿈 기능을 활성화하거나 비활성화합니다.
편집.선택영역의주석처리제거 Ctrl+K, Ctrl+U 현재 코드 줄에서 주석 구문을 제거합니다.
편집.공백보기 Ctrl+R, Ctrl+W 공백 및 탭 기호를 표시하거나 숨깁니다.
편집.끝까지단어삭제 Ctrl+Del 삽입 포인트 오른쪽에 있는 단어를 삭제합니다.
편집.시작까지단어삭제 Ctrl+백스페이스 삽입 포인트 왼쪽에 있는 단어를 삭제합니다.
편집.단어바꾸기 Ctrl+Shift+T 삽입 포인트의 양쪽에 있는 단어를 서로 바꿉니다. 예를 들면 |End Sub는 Sub End|가 됩니다.

창 관리 바로 가기 키

다음 바로 가기 키 조합은 도구 및 문서 창을 이동하거나, 닫거나, 탐색할 때 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
보기.전체화면 Shift+Alt+Enter 전체 화면 모드를 설정하거나 설정 해제합니다.
보기.뒤로탐색 Ctrl+- 탐색 기록에 있는 이전 문서 또는 창으로 돌아갑니다.
보기.앞으로탐색 Ctrl+Shift+- 탐색 기록에 있는 다음 문서 또는 창으로 이동합니다.
창.문서창활성화 Esc 메뉴 또는 대화 상자를 닫거나, 진행 중인 작업을 취소하거나, 현재 문서 창에 포커스를 둡니다.
창.문서창닫기 Ctrl+F4 현재 MDI 자식 창을 닫습니다.
창.도구창닫기 Shift+Esc 현재 도구 창을 닫습니다.
창.드롭다운표시줄로이동 Ctrl+F2 편집기가 코드 뷰에 있는 동안 커서를 드롭다운 표시줄로 옮깁니다.
창.다음문서창 Ctrl+F6
Ctrl+Tab
MDI 자식 창을 한 번에 하나씩 순환합니다.
창.다음창 Alt+F6 다음 도구 창으로 이동합니다.
창.다음분할창 F6 단일 문서에서 분할 창 뷰의 다음 창으로 이동합니다.
창.다음탭 Ctrl+Page Down 문서 또는 창의 다음 탭으로 이동합니다.
창.이전문서창 Ctrl+Shift+F6
Ctrl+Shift+Tab
편집기 또는 디자이너의 이전 문서로 이동합니다.
창.이전창 Shift+Alt+F6 이전에 선택한 창으로 이동합니다.
창.이전분할창 Shift+F6 분할 창 뷰에서 문서의 이전 창으로 이동합니다.
창.이전탭 Ctrl+Page UP 문서 또는 창의 이전 탭으로 이동합니다.

통합 도움말 바로 가기 키

아래의 바로 가기 키 조합은 도움말 항목들을 보거나 이동할 때 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
도움말.목차 Ctrl+Alt+F1 MSDN에 포함된 설명서의 목차 창을 표시합니다.
도움말.동적도움말 Ctrl+F1 제품에서 현재 포커스를 가진 대상에 따라 다른 항목을 표시하는 동적 도움말 창을 표시합니다.
도움말.F1도움말 F1 현재 선택된 사용자 인터페이스에 해당하는 도움말의 항목을 표시합니다.
도움말.색인 Ctrl+Alt+F2 MSDN에 포함된 설명서의 색인 창을 표시합니다.
도움말.색인결과 Shift+Alt+F2 색인 창에서 선택한 키워드가 포함된 항목을 나열하는 색인 결과 창을 표시합니다.
도움말.다음항목 Alt+아래쪽 화살표 목차의 다음 항목을 표시합니다. 도움말 (웹) 브라우저 창에서만 사용할 수 있습니다.
도움말.이전항목 Alt+위쪽 화살표 목차의 이전 항목을 표시합니다. 도움말 (웹) 브라우저 창에서만 사용할 수 있습니다.
도움말.검색 Ctrl+Alt+F3 MSDN에 포함된 설명서에서 단어나 구를 검색할 수 있는 검색 창을 표시합니다.
도움말.검색결과 Shift+Alt+F3 검색 창에서 검색한 문자열이 포함된 주제 목록을 표시하는 검색 결과 창을 표시합니다.
도움말.창도움말 Shift+F1 현재 선택된 사용자 인터페이스에 해당하는 도움말의 항목을 표시합니다.

개체 브라우저 바로 가기 키

다음 바로 가기 키 조합은 개체 브라우저 창에서 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
편집.기호찾기 Alt+F12 기호 찾기 대화 상자를 표시합니다.
편집.선언으로이동 Ctrl+F12 코드에서 선택한 기호에 대한 정의를 표시합니다.
편집.정의로이동 F12 코드에서 선택한 기호에 대한 선언을 표시합니다.
보기.기호찾기결과 Ctrl+Alt+F12 기호 찾기 결과 창을 표시합니다.
보기.개체브라우저 Ctrl+Alt+J 패키지에 포함된 클래스, 속성, 메서드, 이벤트, 상수를 보거나 프로젝트의 개체 라이브러리와 프로시저를 볼 수 있는 개체 브라우저를 표시합니다.
보기.개체브라우저뒤로 Alt+- 개체 브라우저의 선택 기록에서 이전에 선택한 개체로 이동합니다.
보기.개체브라우저앞으로 Shift+Alt+- 개체 브라우저의 선택 기록에서 다음 개체로 이동합니다.

매크로 바로 가기 키

다음 바로 가기 키 조합은 매크로 작업을 할 때 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
보기.매크로탐색기 Alt+F8 현재 솔루션에 사용할 수 있는 모든 매크로를 나열하는 매크로 탐색기 창을 표시합니다.
도구.매크로IDE Alt+F11 매크로 IDE, Visual Studio Macros를 실행합니다.
도구.TemporaryMacro기록 Ctrl+Shift+R 환경을 매크로 기록 모드에 놓습니다.
도구.TemporaryMacro실행 Ctrl+Shift+P 기록된 매크로를 재생합니다.

도구 창 바로 가기 키

다음 바로 가기 키 조합으로 특정 도구 창을 표시할 수 있습니다.

명령 이름 바로 가기 키 설명
도구.명령창표시모드 Ctrl+Shift+M 명령 창 내부에서 텍스트를 선택할 수 있도록 합니다.
보기.클래스뷰 Ctrl+Shift+C 클래스 뷰 창을 표시합니다.
보기.명령창 Ctrl+Alt+A IDE 조작 명령을 입력할 수 있는 명령 창을 표시합니다.
보기.문서개요 Ctrl+Alt+T 현재 문서에 대해 수평 또는 계층 구조로 된 개요를 볼 수 있도록 문서 개요 창을 표시합니다.
보기.즐겨찾기 Ctrl+Alt+F 웹 페이지로 연결되는 바로 가기가 나열된 즐겨찾기 창을 표시합니다.
보기.출력 Ctrl+Alt+O 런타임 시 상태 메시지를 볼 수 있는 출력 창을 표시합니다.
보기.속성창 F4 현재 선택한 항목의 디자인 타임 속성 및 이벤트를 나열하는 속성 창을 표시합니다.
보기.속성페이지 Shift+F4 현재 선택한 항목의 속성 페이지를 표시합니다.
보기.리소스뷰 Ctrl+Shift+E 리소스 뷰 창을 표시합니다.
보기.서버탐색기 Ctrl+Alt+S 데이터베이스 서버, 이벤트 로그, 메시지 대기열, 웹 서비스 및 기타 여러 운영 체제 서비스를 보고 조작할 수 있는 서버 탐색기 창을 표시합니다.
보기.웹브라우저표시 Ctrl+Alt+R 인터넷 페이지를 볼 수 있는 웹 브라우저 창을 표시합니다.
보기.솔루션탐색기 Ctrl+Alt+L 현재 솔루션의 프로젝트 및 파일을 나열하는 솔루션 탐색기를 표시합니다.
보기.작업목록 Ctrl+Alt+K 작업, 주석, 바로 가기, 경고 및 오류 메시지를 사용자 지정하고, 분류하고, 관리할 수 있는 작업 목록 창을 표시합니다.
보기.도구상자 Ctrl+Alt+X 코드와 함께 포함시키거나 사용할 수 있는 기타 항목 및 컨트롤이 들어 있는 도구 상자를 표시합니다.

프로젝트 바로 가기 키

다음 바로 가기 키 조합은 프로젝트에 새 항목을 추가하거나 프로젝트를 빌드하거나, 파일 또는 프로젝트를 열 때 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
빌드.솔루션빌드 Ctrl+Shift+B 솔루션을 빌드합니다.
빌드.컴파일 Ctrl+F7 선택한 파일의 함수/데이터 이름, 외부 참조, 섹션, 링커 지시문, 기계어 코드 등을 포함하는 개체 파일을 만듭니다.
파일.기존항목추가 Shift+Alt+A 현재 프로젝트에 기존 파일을 추가할 수 있는 기존 항목 추가 대화 상자를 표시합니다.
파일.새항목추가 Ctrl+Shift+A 현재 프로젝트에 새 파일을 추가할 수 있는 새 항목 추가 대화 상자를 표시합니다.
파일.새파일 Ctrl+N 새 파일을 선택하여 현재 프로젝트에 추가할 수 있는 새 파일 대화 상자를 표시합니다.
파일.새프로젝트 Ctrl+Shift+N 프로젝트를 만들어 현재 솔루션에 추가할 수 있는 새 프로젝트 대화 상자를 표시합니다.
파일.파일열기 Ctrl+O 기존 파일을 열 수 있는 파일 열기 대화 상자를 표시합니다.
파일.프로젝트열기 Ctrl+Shift+O 기존 프로젝트를 현재 솔루션에 추가할 수 있는 새 프로젝트 대화 상자를 표시합니다.
프로젝트.재정의 Ctrl+Alt+Ins 파생 클래스의 기본 클래스 메서드를 재정의할 수 있습니다. C#에서 사용할 수 있습니다.

기타 편집기 바로 가기 키

액셀러레이터 키 편집기 또는 문자열 편집기에서 다음과 같은 바로 가기 키 조합을 사용할 수 있습니다.

명령 이름 바로 가기 키 설명
편집.새액셀러레이터키 Insert 액셀러레이터 키에 새 엔트리를 추가합니다. 액셀러레이터 키 편집기에서만 사용할 수 있습니다.
편집.새문자열 Insert 문자열 테이블에 새 엔트리를 추가합니다. 문자열 편집기에서만 사용할 수 있습니다.

참고 항목

시작 페이지, 내 프로필 | 옵션 대화 상자, 환경, 키보드 | 바로 가기 키






  

XML 에 직접 사용해서는 안되는 예약 문자는 다음과 같다.

& < > " '

 그리고 각각은 다음과 같은 문자열 변환 과정을 통하여 저장해 주어야 한다.

<       
&lt;
 
>       
&gt;
 
&       
&amp;
 
"      
&quot;
 
'      
&apos;

 문자열 변환 과정을 거치지 않으면 파서가 정상적으로 인식할 수 없으므로 주의하도록 하자.


방법은 2가지다. 아예 입력을 못하게 막는 방법. 그리고 일단 입력은 하게 해 놓고 변환하는 방법.

첫번째 아예 입력을 못하게 하는 방법은 다음과 같다.
BOOL CCMSRegistDlg::PreTranslateMessage(MSG* pMsg)
{
 bool bX = false;

 if (pMsg->message == WM_KEYDOWN)
 {
  if (GetKeyState(VK_SHIFT) < 0)
  {
   if (pMsg->wParam == '7') bX = true;  // & 막기  
   if (pMsg->wParam == '5') bX = true;  // % 막기
   if (pMsg->wParam == 188) bX = true;   // < 막기
   if (pMsg->wParam == 190) bX = true;   // > 막기

   TRACE("With Shift : %d\n", pMsg->wParam);
  }
  else
   TRACE("Without Shift : %d\n", pMsg->wParam);

  if (pMsg->wParam == VK_RIGHT)
   return CDialog::PreTranslateMessage(pMsg);

  if (pMsg->wParam == 222)
   bX = true;  // ' 막기
  if (pMsg->wParam == '"')
   bX = true;  // " 막기
 
  if (bX)
  {
   MessageBox("사용할 수 없는 문자입니다.");
   return TRUE;
  }
 }

 return CDialog::PreTranslateMessage(pMsg);
}

이렇게 하면 아예 입력을 못해 버린다.


입력은 하게 하고 변환해서 보내버리는 방법은 다음과 같다.

bool AvoidXMLReservedWord(const CString strSrc, CString * pstrDest)
{
 // 원본 내용 복사
 pstrDest->Format("%s", strSrc);
 pstrDest->Replace("<", "&lt;");
 pstrDest->Replace(">", "&gt;");
 pstrDest->Replace("&", "&amp;");
 pstrDest->Replace("\"", "&quot;");
 pstrDest->Replace("'", "&apos;");

 return true;
}





TAG xml

버튼 동적 생성과 이벤트 연결

프로그래밍/VC++ 2007/11/22 17:23 Posted by 팬소년

  
질문 내용]

mfc위자드로 CView로 상속받은 (SDI)프로젝트를 생성했습니다.

그리고 뷰에 1행에 동적으로 버튼을 행맞춰서 만들고 싶은데, 아무리 생각해도 모르겠군요.
동적으로 말입니다. 4개든 10개든.... 그리고 각 버튼을 눌렀을때 메시지박스가 나와 "현재버튼은
1입니다." 같이 나왔으면 합니다. 다시말해 이벤트 핸들러도 동적으로 만들어야 합니다.

너무나 어려워 질문드립니다.

[답변 내용]

안녕하세요~!

먼저 동적으로 버튼을 5개 생성시킨다고 가정하고 해더파일에

  #define MAX_BUTTON_COUNT  5

라고 먼저 정의하고, 버튼을 동적으로 만들어서 사용해야하니까 동적으로
생성된 버튼을 관리할 변수를 선언해야겠죠? 클래스 선언부에 말이죠!!

private:
CButton *mp_test_button[MAX_BUTTON_COUNT];

라고 추가하신후에, 먼저 1행이 의미하는게 정확하게 먼지 모르겠지만
가로방향으로 같이 위치하는 거라고 가정하고 먼저 생성시키는것을 살펴보면
다음과 같습니다. WM_CREATE를 핸들러로 등록하고 다음과 같이 코드를
추가하면 됩니다.

int CViewbuttonView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  if(CView::OnCreate(lpCreateStruct) == -1) return -1;

  CString str;
  for(int i = 0; i < MAX_BUTTON_COUNT; i++){
      str.Format("Test %d", i + 1);
      mp_test_button[i] = new CButton();
      mp_test_button[i]->Create(str, WS_CHILD | WS_VISIBLE |
          BS_PUSHBUTTON, CRect(10 + i*100, 10, 100 + i*100, 36),
                    this, 25000 + i);
  }
  return 0;
}

이렇게 하면 버튼이 생성될겁니다. 한줄로 주루룩~~  ^^; 각 버튼을 구별하는
아이디는 25000, 25001, 25002, 25003, 25004로 정해집니다. 각 버튼을
누르면 이 번호에 해당하는 메시지가 WM_COMMAND 메시지와 함게 발생합니다.
물론 버튼의 ID는 wParam 메시지에 들어가구요...

그럼 버튼을 눌렀을때 메시지를 처리할 방법을 생각해보죠~ CView를 클래스
위저드로 보면 OnCommand라는 메소드를 추가할수 있습니다. 그곳에서
동적으로 메시지를 처리할수 있습니다. 다음을 보시죠~ ^^;

BOOL CViewbuttonView::OnCommand(WPARAM wParam, LPARAM lParam)
{
  if(wParam >= 25000 && wParam < 25000 + MAX_BUTTON_COUNT){
      CString str;
      str.Format("저는 %d번 버튼임다.~~ ^^;", wParam - 25000 + 1);
      AfxMessageBox(str);
  }

  return CView::OnCommand(wParam, lParam);
}

버튼에 의해서 발생하는 메시지는 25000~25004 사이의 값을테고 발생한
메시지에 25000을 빼면 각 버튼의 값이 정해지죠~ 0~4로, 하지만 화면에는
1~5로 변경해서 출력해야 하기때문에 1을 더해주면 됩니다. ^^;

자~ 이제는 동적으로 생성된 버튼을 삭제해야겠죠~! WM_DESTROY 메시지
핸들러에서 처리하면 됨다. 아래를 보세요~

void CViewbuttonView::OnDestroy()
{
  for(int i = 0; i < MAX_BUTTON_COUNT; i++){
      delete mp_test_button[i];
  }

  CView::OnDestroy();
}

동적으로 만들어진 객체를 다 파괴하면 됨다. ^^; 어렵지 않죠?




CPPUnit 제대로 써보자.

프로그래밍/VC++ 2007/10/28 22:35 Posted by 팬소년

  

CPPUNIT 다운로드 : http://cppunit.sourceforge.net
cppunit 1.10.2 기준


### 프로젝트 설정

MFC Dialog Based 프로젝트 생성

1. C/C++ / 일반 / 추가포함 디렉토리
"$(NLELIB)\cppunit\cppunit-1.10.2\include";"$(NLELIB)\cppunit\cppunit-1.10.2\src"

잘 보자. 2개다.


2. C/C++ / 코드 생성 / 런타임 라이브러리  :
다중 스레드 디버그 DLL(Multi-threaded Debug DLL) (/MDd)

3. C/C++ / 언어 / 런타임 형식 정보사용 : 예

4. 링커 / 일반 / 추가 라이브러리 디렉터리 : $(NLELIB)\cppunit\cppunit-1.10.2\lib

5. 링커 / 입력 / 추가 종속성 : cppunitd_dll.lib testrunnerd.lib

6. testrunnerd.dll 파일과 cppunitd_dll.dll 파일을 내 debug 폴더로 복사


### 소스코드 수정

1. APP 파일에서 다음과 같이 한다.

#include "msvc6/testrunner/testrunner.h"
#include "cppunit/extensions/testfactoryregistry.h"


BOOL CUnitTestApp::InitInstance()
{
 TestRunner runner;
 runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 runner.run();
 return FALSE;

 ....

알지 이렇게 하면 그냥 TestRunner만 실행되고 정작 MFC Dialog는 나타나지 않는다.

2. TestCase.h 파일을 만들어 다음과 같이 적는다.

#pragma once

#ifndef _TESTCASE_H_
#define _TESTCASE_H_

#include "cppunit/TestCase.h"
#include "cppunit/extensions/HelperMacros.h"

class TestCaseExample : public CppUnit::TestCase
{
 CPPUNIT_TEST_SUITE(TestCaseExample);
 CPPUNIT_TEST(Test);
 CPPUNIT_TEST_SUITE_END();

public:
 void setUp();
 void tearDown();
 void Test();
};

#endif


3. TestCase.cpp 파일을 만들어서 다음과 같이 적는다.
#include "StdAfx.h"
#include "testcase.h"

CPPUNIT_TEST_SUITE_REGISTRATION(TestCaseExample);

void TestCaseExample::setUp()
{
}

void TestCaseExample::tearDown()
{
}

void TestCaseExample::Test()
{
 CPPUNIT_ASSERT_EQUAL(10, 10);
}

이렇게 하면 끝.


테스트 후 메모리릭이 발생하는데 늘 생기는 것 같다.
48, 20, 44, 48 바이트의 메모리릭이 발생할거다.

다운로드 :




TAG cppunit

  

// 파일 크기를 가져온다.
 CFile* pFile = NULL;
 ULONGLONG dwLength = 0;
 TRY
 {
  pFile = new CFile(strFilename, CFile::modeRead | CFile::shareDenyNone);
  dwLength = pFile->GetLength();
 }
 CATCH(CFileException, pEx)
 {
  // Simply show an error message to the user.
  dwLength = 25000;
 }  
 AND_CATCH(CMemoryException, pEx)
 {
  dwLength = 25000;
 }
 END_CATCH

 if (pFile)
 {
  pFile->Close();
  delete pFile;
 }

CString str;
str.Format("%I64d", dwLength);






  

STARTUPINFO sti;
 PROCESS_INFORMATION processInfo;
 ZeroMemory( &sti, sizeof(sti) );

 sti.cb = sizeof(sti);
 ZeroMemory( &processInfo, sizeof(PROCESS_INFORMATION) );

 BOOL bResult = CreateProcess(NULL, (LPTSTR)(LPCTSTR)m_strTranscoderFilePath, NULL, NULL,
  FALSE, 0, NULL, NULL, &sti, &processInfo);
 WaitForSingleObject(processInfo.hProcess, INFINITE);






  
아 설명할 시간이 없네.
암튼 Drop 하는 Dialog에서는 COleDropTarget을 상속받도록 하면 겁나 쉬워지고 (재정의할 수 있는 함수 목록에 OnDragOver, OnDragDrop... 등이 자동으로 추가된다.), Drag 하는 쪽이나 Drop 하는 쪽이나 모두 app의 InitInstance에서 AfxOleInit()을 실행해 줘야 한다.




Ole Drag & Drop

프로그래밍/VC++ 2007/08/28 20:37 Posted by 팬소년

  

Writing to the Clipboard is straightforward. By following a few simple steps you can place nearly any supported clipboard format onto the clipboard.

  1. Create a new COleDataSource.
  2. Create a new CSharedFile (see initialization in example below).
  3. Write info to the CSharedFile instance.
  4. Detach the memory associated with the CSharedFile.
  5. Pass the detached memory and format info to CacheGlobalData().
  6. Place the data on the clipboard using SetClipboard().

Example 1 - Source for Writing to Clipboard

void CClipExamView::OnEditCopy()
{
	COleDataSource*	pSource = new COleDataSource();
	CSharedFile	sf(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
	CString		text = _T("Testing 1... 2... 3...");

	sf.Write(text, text.GetLength()); // You can write to the clipboard as you would to any CFile

	HGLOBAL hMem = sf.Detach();
	if (!hMem) return;
	pSource-CacheGlobalData(CF_TEXT, hMem);
	pSource-SetClipboard();
}

Serializing to the Clipboard

Often it is useful to be able to serialize your data to the clipboard so that you can create a custom clipboard for your application. This can be done by registering a custom clipboard format and serializing to a CSharedFile. The following source illustrates how to serialize a CObject to the clipboard.

Example 2 - Serializing to the Clipboard

void SerializeToClipboard(CObject* obj, CString formatname )
{
	COleDataSource*	pSource = new COleDataSource();
	CSharedFile	sf(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
	UINT		format = RegisterClipboardFormat(formatname);
	CArchive		ar(&sf, CArchive::store);

	obj-Serialize(ar);
	ar.Close();

	HGLOBAL hMem = sf.Detach();
	if (!hMem) return;
	pSource-CacheGlobalData(format, hMem);
	pSource-SetClipboard();
}

Reading Data from the Clipboard

Reading data from the clipboard is nearly the inverse of placing data on the clipboard.

  1. Create a COleDataObject instance.
  2. Check to see if the format you want is available.
  3. Place the data associated with the clipboard into a CMemFile.
  4. Read the data out of the CMemFile.
  5. Release the global memory.

Example 3 - Reading Data from the Clipboard

void CClipExamView::OnEditPaste()
{
	COleDataObject	obj;

	if (obj.AttachClipboard()) {
		if (obj.IsDataAvailable(CF_TEXT)) {
			HGLOBAL hmem = obj.GetGlobalData(CF_TEXT);
			CMemFile sf((BYTE*) ::GlobalLock(hmem), ::GlobalSize(hmem));
			CString buffer;

			LPSTR str = buffer.GetBufferSetLength(::GlobalSize(hmem));
			sf.Read(str, ::GlobalSize(hmem));
			::GlobalUnlock(hmem);

			// Do something with the data in 'buffer'
			TRACE("Paste received = '%s'\r\n", buffer);
		}
	}
}

Serializing from the Clipboard

Serializing from the Clipboard is only a slight modification of the previous example.

Example 4 - Reading Serialized Data from the Clipboard

void SerializeFromClipboard(COleDataObject* obj, CObject* cobj, CString formatname)
{
	UINT		format = RegisterClipboardFormat(formatname);

	if (obj-IsDataAvailable(format)) {
		HGLOBAL hmem = obj-GetGlobalData(format);
		CMemFile sf((BYTE*) ::GlobalLock(hmem), ::GlobalSize(hmem));
		
		CArchive ar(file, CArchive::load);
		cobj-Serialize(ar);
		ar.Close();
		::GlobalUnlock(hmem);
	}
}

Drag/Drop Support

All of the examples thus far are placing the data on the clipboard as if a copy operation had been invoked. Enabling Drag/Drop is a simple change to the above code.

Sourcing a Drag/Drop

The code for the origination of a drag/drop is identical to examples for placing data on the clipboard, with one little modification. Rather than executing the SetClipboard() command, you should execute the DoDragDrop() command.

Example 5 - Sourcing a Drag/Drop

// Initiate the Drag/Drop
void CClipExamView::OnLButtonDown(UINT nFlags, CPoint point)
{
	COleDataSource*	pSource = new COleDataSource();
	CSharedFile	sf(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
	CString		text = _T("Testing 1... 2... 3...");

	sf.Write(text, text.GetLength()); // You can write to the clipboard as you would to any CFile

	HGLOBAL hMem = sf.Detach();
	if (!hMem) return;
	pSource-CacheGlobalData(CF_TEXT, hMem);
	pSource-DoDragDrop();
}

Accepting a Drag/Drop

Example 5 - Accepting a Drag/Drop

// OnDragOver - Called when mouse moves over window during a Drag/Drop
DROPEFFECT CClipExamView::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
	if (pDataObject-IsDataAvailable(CF_TEXT)) {
		return DROPEFFECT_COPY;		
	}
	return DROPEFFECT_NONE;
}

// OnDrop - Called when drop occurs
BOOL CClipExamView::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
{
	if (pDataObject-IsDataAvailable(CF_TEXT)) {
		HGLOBAL hmem = pDataObject-GetGlobalData(CF_TEXT);
		CMemFile sf((BYTE*) ::GlobalLock(hmem), ::GlobalSize(hmem));
		CString buffer;

		LPSTR str = buffer.GetBufferSetLength(::GlobalSize(hmem));
		sf.Read(str, ::GlobalSize(hmem));
		::GlobalUnlock(hmem);

		// Do something with the data in 'buffer'
		TRACE("OnDrop received = '%s'\r\n", buffer);
		return TRUE;
	}
	return FALSE;
}

Housekeeping Issues

A few additional housekeeping things must be done make drag/drop work correctly.

  1. Make sure that your applications InitInstance() member function calls the AfxOleInit() function.
  2. The view must be registered as a drag/drop target. If you don't do this you won't be able to accept a drag/drop. See Example 6.
  3. Several includes must be added to stdafx.h to insure that your code will compile. See Example 7.

Example 6 - Initializing View as Drop Target

// Enable view as a drop target. Assumes COleDropTarget	m_DropTarget is defined in view object.
void CClipExamView::OnInitialUpdate()
{
	CView::OnInitialUpdate();
	m_DropTarget.Register(this);
}

Example 7 - Include to Add to stdafx.h

#include <afxole.h>         // MFC OLE classes
#include <afxodlgs.h>       // MFC OLE dialog classes
#include <afxdisp.h >       // MFC OLE automation classes
#include <afxpriv.h>

Download files 33KB






  
BOOL CProjectLeft::PreTranslateMessage(MSG* pMsg)

{

    // 윈도우로 전달되는 메세지를 해당 윈도우가 처리하기 전에 가로채서

    // 특정 작업을 수행해야 할 필요성이 있을 때 재정의하여 사용한다.

    switch(pMsg->message)

    {

        case WM_KEYDOWN:

            switch(int(pMsg->wParam))

            {

                case VK_F5:

                    // 다시 보여주기

                    return TRUE;

                    break;

                case VK_F2:

                    HTREEITEM hSel = m_tree1.GetSelectedItem();

                     m_tree1.SetFocus();

                    m_tree1.ModifyStyle(0, TVS_EDITLABELS);

                    CEdit* pEdit = m_tree1.EditLabel(hSel);

                    ASSERT(pEdit != NULL);

                    return true;

                    break;

                case VK_RETURN:

                    if(m_tree1.GetEditControl() != NULL)

                    {

                        m_tree1.GetEditControl()->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);

                        return true;

                    }

                    break;

                case VK_ESCAPE:

                    if(m_tree1.GetEditControl() != NULL)

                    {

                        CString szItemText = m_tree1.GetItemText(m_tree1.GetSelectedItem());

                        m_tree1.GetEditControl()->SetWindowText(szItemText);

                        m_tree1.GetEditControl()->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);

                        return true;

                    }

                    break;

                default:

                    break;

            }

            break;

        default:

            break;

    }


    return CFormView::PreTranslateMessage(pMsg);

}






  

아래 코드를 PreTranslateMessage(MSG* pMsg) 에 추가해주세요.

 if (pMsg->message == WM_KEYDOWN)

 {

        if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)

            return TRUE;

 }





MainFrame, Doc, View 포인터 얻기

프로그래밍/VC++ 2007/08/16 14:33 Posted by 팬소년

  
1. MainFrame 포인터 얻기

CMainFrame *frame = (CMainFrame*)AfxGetMainWnd();


2. Doc 클래스 포인터 얻기
CxxxDoc *pDoc = (CxxxDoc*)(frame->GetActivedocument());


3. View 클래스 포인터 얻기
CxxxView* pView = (CxxxView*)((CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView();


자주쓰이는 MFC 클래스 간의 통신입니다. 외워쓰기에는 시간이 아깝고, 매번 찾으려면 귀찮았는데 한번에 모아놓으니 편리하네요.^^

[SDI 형태]

1. MainFrame 얻기
- CMainFrame *pFrame = (CmainFrame *) AfxGetMainWnd();

2. App 포인터 얻기
- CTestApp *pApp = (CtestApp *) AfxGetApp();

3. Document 포인터 얻기
- CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
  CTestDoc *pDoc = (CTestDoc *)pFrame->GetActiveDocument();
- CTestDoc *pDoc = ((CMainFrame *)AfxGetMainWnd())->GetActiveDocument();

4. View 포인터 얻기
- CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
  CTestView *pView = (CTestView *)pFrame->GetActiveView();
- CTestView *pView = ((CMainFrame *)AfxGetMainWnd())->GetActiveView();
 


 

[MDI 형태]

1. ChildFrame 포인터 얻기
- CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
  CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame();
- CChildFrame *pChild = ((CMainFrame *)AfxGetMainWnd())->GetActiveFrame();

2. Document 포인터 얻기
- CMainFrame *pFrame = (CMainFrame)AfxGetMainWnd();
  CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame();
  CMdiTestDoc *pDoc = (CMdiTestDoc *)pChild->GetActiveDocument();
- CMdiTestDoc *pDoc = (((CMainFrame *)AfxGetMainWnd())->GetActiveFrame())->GetActiveDocument();

3. View 포인터 얻기

- CCainFrame *pFrame = (CMainFrame)AfxGetMainWnd();
  CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame();
  CMdiTestView *pView = (CMdiTestDoc *)pChild->GetActiveView();
- CMdiTestView *pView = (((CMainFrame *)AfxGetMainWnd())->GetActiveFrame())->GetActiveView();





  
먼저 Bin 디렉토리에 복사한 후 그 복사된 파일을 regsvr 해야 한다.
아래와 같이. (Release와 Debug에 똑같이 그냥 복사해서 넣기만 하면 된다.)

Copy "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\bin\$(TargetFileName)"
regsvr32 /s /c "$(ProjectDir)..\..\bin\$(TargetFileName)"


음.. 위 방법은 약간 문제가 있다. 나는 디버그 모드일 때는 끝에 D를 붙이고 싶은데 이건 그렇게 안된다.
디버그 모드일 때는 뒤에 D를 붙이고(예:axFile.ocx   axFileD.ocx), lic 파일까지 복사하는 예제는 다음과 같다.

Copy "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\..\bin\$(InputName)D$(TargetExt)"
regsvr32 /s /c "$(ProjectDir)..\..\..\bin\$(InputName)D$(TargetExt)"
copy "dmbImageEditorView.lic" $(OutDir)
copy "dmbImageEditorView.lic" "$(ProjectDir)..\..\..\bin\"





  
 HINSTANCE hInst = 0;
 hInst = AfxGetInstanceHandle();
 
 HBITMAP hbmp = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_TEXTTRACKHEADER));
 ASSERT(hbmp!=NULL);
 m_pHeaderBitmap = Bitmap::FromHBITMAP(hbmp,NULL); 




이미지 회전변환

프로그래밍/VC++ 2007/07/11 03:11 Posted by 팬소년

  
x2 = cos(a) * (x1 - x0) - sin(a) * (y1 - y0) + x0
y2 = sin(a) * (x1 - x0) + cos(a) * (y1 - y0) + y0

x1, y1 : 원 영상의 좌표
x0, y0 : 회전 기준점(회전의 중심)




GDI+ 사용하기

프로그래밍/VC++ 2007/07/09 21:15 Posted by 팬소년

  

#include <gdiplus.h>

이 헤더 파일에 GDI+의 모든 타입, 열거형, 클래스 등이 선언되어 있다. gdiplus.h를 반드시 인클루드해야 하며 플랫폼 SDK가 지정된 경로에 설치되어 있어야 한다. 이 헤더 파일을 열어 보면 GDI+의 기본적인 선언문들을 직접 구경할 수 있는데 gdiplus.h는 GDI+의 모든 헤더를 포함하는 헤더 파일 컨테이너라고 할 수 있다.

② using namespace Gdiplus;

GDI+의 모든 명칭은 GdiPlus 네임 스페이스에 포함되어 있다. 따라서 클래스 이름과 열거형 이름앞에 GdiPlus::을 일일이 붙여야 하는데 너무 번거로우므로 using 지시자를 사용하여 GdiPlus 네임 스페이스에 선언된 모든 명칭을 전역 영역으로 가져 오도록 한다. 이 지시자에 의해 컴파일러는 전역 네임 영역에 없는 명칭에 대해 GdiPlus 네임 스페이스를 검색하므로 이름만으로 GDI+의 명칭들을 사용할 수 있다.

③ #pragma comment(lib,"gdiplus.lib")

프로젝트 설정 대화상자의 링크 탭에 gdiplus.lib 임포트 라이브러리를 지정하여 그래픽을 출력하는 실제 코드는 gdiplus.dll에 있음을 알린다. 아니면 소스에 위의 한 줄을 적어 놓아도 된다.

라이브러리 모듈에게 gdiplus.lib 임포트 라이브러리를 참조하라고 알려 준다. 매번 프로젝트 설정 대화상자를 열어서 라이브러리를 지정하는 것은 귀찮기 때문에 소스에 한 줄 적는 것이 훨씬 더 편리하다. 새 소스를 만들 때도 붙여 넣기만 하면 되므로 실습에도 편리하다.

④  Status GdiplusStartup(ULONG_PTR *token, const GdiplusStartupInput *input, GdiplusStartupOutput *output);

프로그램 시작시 GDI+ 라이브러리를 초기화한다. 이때는 다음 전역 함수를 사용한다. GDI+는 모든 것이 클래스로 되어 있지만 초기화와 관련된 함수는 일반 함수로 제공된다. 객체를 아직 만들기 전이므로 초기화 함수는 일반 함수 또는 정적 함수일 수밖에 없다.

token은 초기화시 받는 토큰이며 종료할 때 이 토큰을 GdiplusShutdown으로 전달해야 한다. input은 입력 옵션 구조체이며 이 안에 GDI+의 버전, 디버그 콜백 함수, 백그라운드 스레드 허용 여부 등을 지정할 수 있는데 별 다른 옵션을 지정하지 않을 경우는 변수만 선언해서 그 포인터를 넘겨 주면 된다. 예제에서는 gpsi 구조체를 선언한 후 넘기기만 했다. 도움말에서 확인해 보면 알겠지만 이 구조체의 생성자가 무난한 디폴트로 초기화하도록 되어 있으므로 지역 변수라 하더라도 쓰레기값이 들어가지는 않는다. 생략할 수 없으므로 반드시 변수를 선언한 후 그 포인터를 전달해야 한다.

output은 초기화 결과를 돌려 주기 위한 구조체인데 필요없을 경우 NULL로 줄 수 있다. 백그라운드 스레드를 허용하지 않을 때만 output 인수가 필요하다. 이 함수는 초기화 결과를 Status형의 열거형으로 리턴하는데 성공했을 경우 Ok가 리턴된다. Ok가 아닌 경우는 GDI+를 사용할 수 없으므로 적절한 에러 처리를 할 필요가 있다. 예제에서는 메시지 박스를 출력하고 프로그램을 종료했다.

void GdiplusShutdown(ULONG_PTR token);

프로그램을 끝낼 때 GDI+ 라이브러리를 셧다운한다. GDI+는 실행중에 많은 리소스를 할당하는데 이 리소스를 반드시 해제해야 한다. 다음 함수를 사용한다.


출처 : http://icarosss.egloos.com

'프로그래밍 > VC++' 카테고리의 다른 글

GDI+에서 리소스 비트맵 가져와서 쓰기  (0) 2007/07/23
이미지 회전변환  (0) 2007/07/11
GDI+ 사용하기  (0) 2007/07/09
XP에서 IDC_HAND가 없다고 나올 때  (0) 2007/07/05
XML 저장하기  (0) 2007/06/27
GDI+를 이용 Drop Shadow 주기  (0) 2007/06/12





  
#define IDC_HAND            MAKEINTRESOURCE(32649)

이렇게 해준다.

커서 바꾸는 건
BOOL CLemonViewerDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
 // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
 if ( (pWnd == GetDlgItem(IDC_BTNFILEOPEN)) || (pWnd == GetDlgItem(IDC_BTNSTART)) )
 {
  HCURSOR hCursor = AfxGetApp()->LoadStandardCursor(IDC_HAND);
  ::SetCursor(hCursor);
  return 1;
 }
 else
  return CDialog::OnSetCursor(pWnd, nHitTest, message);
}

'프로그래밍 > VC++' 카테고리의 다른 글

이미지 회전변환  (0) 2007/07/11
GDI+ 사용하기  (0) 2007/07/09
XP에서 IDC_HAND가 없다고 나올 때  (0) 2007/07/05
XML 저장하기  (0) 2007/06/27
GDI+를 이용 Drop Shadow 주기  (0) 2007/06/12
에디트박스에서 엔터키를 누르면 어떤 처리를 하도록.  (0) 2007/06/12




XML 저장하기

프로그래밍/VC++ 2007/06/27 14:36 Posted by 팬소년

  

 // 이제 XML을 저장한다.
 CString strFinalXML = xml.GetXML();
 CString strFilename;
 strFilename.Format("%s_%04d.dkp", CBaseInform::getInstance()->m_strProjectFolder + "\\" +
  (CString)m_SelectedProgramItem.pgg_id, m_SelectedProgramItem.pgm_num);

 CStdioFile file;
 file.Open(_T(strFilename), CFile::modeCreate | CFile::modeWrite);
 file.WriteString("<?xml version=\"1.0\" encoding=\"euc-kr\"?>");
 file.WriteString(strFinalXML);





GDI+를 이용 Drop Shadow 주기

프로그래밍/VC++ 2007/06/12 19:42 Posted by 팬소년

  

void CGDIPlusTestDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // 아이콘을 그립니다.
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트

  //dc.Rectangle(10, 10, 29, 29);
 
  Graphics graphics(dc.GetSafeHdc());
  GraphicsPath path;

  Font font(L"HY견고딕", 70);
  Point pt(30, 30);
  PointF ptf(30, 30);
  SolidBrush brush(Color(128, 0, 0, 0));
  SolidBrush brush2(Color(255, 0, 100, 0));

  CRect rClient;
  GetClientRect(&rClient);

  int width = rClient.Width();
  int height = rClient.Height();

  Bitmap bm(width / 5, height / 5);
  Graphics g(&bm);
  g.SetTextRenderingHint(TextRenderingHintAntiAlias);

  //Matrix mx(0.25f, 0, 0, 0.25f, 2, 2);
  Matrix mx(0.2f, 0, 0, 0.2f, 1.0f, 1.0f);
  g.SetTransform(&mx);

  g.DrawString(L"하하하 팬소년", wcslen(L"하하하 팬소년"), &font, ptf, &brush);

  graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
  graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
  // 그림자
  Rect rect(0, 0, width, height);
  graphics.DrawImage(&bm, rect, 0, 0, bm.GetWidth(), bm.GetHeight(), UnitPixel);
 
  // 실제 글자
  graphics.DrawString(L"하하하 팬소년", wcslen(L"하하하 팬소년"),
   &font, ptf, &brush2);
 
  CDialog::OnPaint();
 }
}






  

BOOL CYakdoDlg::PreTranslateMessage(MSG* pMsg)
{
 // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
 if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
    {  
        return TRUE;
    }

 if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
    {  
  CWnd *pWnd = this->GetFocus();
  if ( pWnd == GetDlgItem(IDC_EDTSANGHO))
  {
   OnBnClickedBtnsearch();
   return TRUE;
  }
  else
   return TRUE;
    }

 return CDialog::PreTranslateMessage(pMsg);
}






  

내가 생각해 본 방법.

OnInited 라는 이벤트를 만들고,
ShowWindow 이벤트 핸들러에서 다음과 같이 코딩

void CaxDolBoardCtrl::OnShowWindow(BOOL bShow, UINT nStatus)
{
COleControl::OnShowWindow(bShow, nStatus);

// TODO: 여기에 메시지 처리기 코드를 추가합니다.
if (false == m_bInited)
{
m_bInited = true;
OnInited();
}
}





TAG ActiveX

  

간단하다.

App의 InitInstance에서 AfxEnableControlContainer() 함수만 추가해 주면 된다.


BOOL CaxPreviewNoteApp::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();

if (bInit)
{
// TODO: 여기에 직접 작성한 모듈 초기화 코드를 추가합니다.
AfxEnableControlContainer();
}

return bInit;
}




ActiveX에 CDialog 붙이는 법

프로그래밍/VC++ 2007/04/25 10:30 Posted by 팬소년

  

음.. ActiveX에 CScrollView를 붙이면 디자인한 크기대로 되지 않고 자꾸 스크롤바가 생기기 때문에 귀찮아진다.
그래서 그냥 CDialog 를 붙이는 방법을 생각해 봤다.

1. ActiveX에서 다이얼로그를 만들고 그걸 더블클릭해서 CDialog Based 클래스를 하나 생성한다.

2. ActiveX의 Ctrl 클래스에 위에서 만든 클래스형의 멤버변수를 하나 선언한다. (예 : CMainFormDlg m_MainFormDlg; )

3. 생성자가 아닌, 반드시 OnCreate(WM_CREATE) 이벤트 핸들러에 다음과 같이 한다.
int CaxPreviewNoteCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
 return -1;

// TODO:  여기에 특수화된 작성 코드를 추가합니다.
m_MainFormDlg.Create(IDD_DIALOG1);
m_MainFormDlg.SetParent(this);
m_MainFormDlg.SetOwner(this);
m_MainFormDlg.ShowWindow(SW_SHOW);

return 0;
}

4. 다음 WM_SIZE 이벤트 핸들러에 다음과 같이 한다.
void CaxPreviewNoteCtrl::OnSize(UINT nType, int cx, int cy)
{
COleControl::OnSize(nType, cx, cy);

// TODO: 여기에 메시지 처리기 코드를 추가합니다.
m_MainFormDlg.MoveWindow(0, 0, cx, cy, FALSE);
}

이렇게 2군데 메시지만 처리해주면 바로 붙어버린다.





Free C/C++ 라이브러리

프로그래밍/VC++ 2007/04/23 19:54 Posted by 팬소년

  
  • Boost - Provides a repository for free peer-reviewed portable C++ source libraries. The emphasis is on libraries which work well with the C++ standard library.
  • STLport (STL Library) :
    This version of STL (Standard Template Library for C++) is available free of charge from their website. It is apparently also shipped with the current versions of the Borland C++ compilers.
  • ACDK - Artefaktur Component Development Kit - Platform independent C++ component framework similar to Java or .NET (reflection, threading, Unicode, garbage collection, io, net, util, xml, etc.) with integration of Java, Perl, Python, Tcl, Lisp, COM and CORBA. [Open source Free c ++ Library Classes]
  • Libcwd - A well-documented, thread-safe library to support C++ developers with debugging their applications. It includes support for ostream-based debug output to custom debug channels, memory allocation debugging and run-time support like printing source file locations and demangled names of template parameters. [ Free c ++ Library Classes]
  • Common C++ - A framework offering portable support for threading, sockets, file access, deamons, persistance, and system for clarity, services. [Open Source Free c ++ Library Classes]
  • Database Template Library - Provides ODBC recordsets just like STL containers, including writing the contents back to the database.
  • Common Text Transformation Library - Library of C++ classes and functions to parse and modify STL strings. CTTL substring classes may be compared, inserted, replaced, and parsed with EBNF grammars. Compiled program implements recursive descent LL(INF) parser. [Open source Free c ++ Library Classes]
  • SGI Standard Template Library (STL) :
    If your compiler does not have a recent Standard Template Library implementation, you might want to consider this version available free from SGI.
  • AccessLog - A C++ wrapper to give an XBase fashion to the Berkeley DB library.
  • Audio/Video 3D C++ Programming Library - AV3D for C++ is a multi-platform, high-performance programming library. Major features: 3D Graphics, Sound support (SB, and S3M), Controller interface (keyboard, mouse, and joystick), XMS.
  • Babylon Library - A collection of simple routines and classes that could be used as building blocks of larger projects. Many of the methods are portable and adjusted for use in embedded systems. [Open source Free c ++ Library Classes]
  • Open EzBasic - A C++ based library, that can be used to make programs using functions as in VB. The library has 25 classes ranging from GUI, Threads, String, Active-X. Simple way to convert VB code to C++. [Open source Free c ++ Library Classes]
  • dlib C++ library - A collection of various classes. Sockets, threading, GUI, and directory browsing API. Also many container classes and other miscellaneous items such as a big integer. [Open source Free c ++ Library Classes]
  • BitMagic - A C++ classes library implementing bitvectors with several types of on-the-fly, adaptive compression. Can be used in databases and search systems. [Open source Free c ++ Library Classes]
  • freeodbc++ - A C++ library for accessing SQL databases. Designed with standards in mind, so it provides a subset of the well-known JDBC 2.0 and runs on top of ODBC. [Open Source, LGPL]
  • Crypto++ - Free C++ library of cryptographic schemes: includes ciphers, message authentication codes, one-way hash functions, public-key cryptosystems, and key agreement schemes.
  • EasyWin32 - Makes easier Windows Programming when using Windows API. [Open source Free c ++ Library Classes].
  • Simple XML Persistence Library - A lightweight C++ library for object serialization in XML.
  • SOL++2000 - a free C++ class library for Microsoft Windows. All source files of the library and a lot of sample programs are available.
  • Standard J2K Library - A completely portable C++ library, to provide a standard set of classes similar to Java Common API. [Open Source, LGPL]
  • GNU Nana - Library of many tested, proven methods to raise reliability of C & C++ code. Includes: extended logging, assertion checking, Design by Contract: DbC. Supports realtime measurements, making performance statistics for code fragments, and tracing program execution without modifying code.
  • libunicows :
    libunicows allows you to write programs that use Unicode on Windows 9x/ME with a compiler other than Microsoft Visual C++ (the Microsoft unicows library requires Visual C++). This library supports (at the time I write this) MinGW, Visual C++ 6, Borland C++, and Watcom (and OpenWatcom) C/C++.
  • OSLib :
    OSLib is a C library for programmers writing system software (whether it be embedded software or even entire operating system kernels). It comprises 4 libraries (the extender library, the standard C library, the math library and the kernel library).
  • MIT Exokernel Operating System :
    The MIT Exokernel Operating System attempts to provide a level of abstraction of hardware so that you can concentrate on the other aspects of implementing an operating system. It may be useful to those of you planning to write an operating system.
  • The OSKit Project (Flux) :
    The OSKit Project is a C framework of 34 components providing a wide variety of facilities that is useful for people planning to write operating system kernels, servers, boot loaders, embedded applications and the like.
  • regex :
    regex is a regular expression parser that is released into the public domain (or so the site says). It is useful if you want to write a program using regular expressions but don't want to use the GPL ones that come from the Free Software Foundation. (The package is somewhere in the middle of the page linked to; just scroll down to find it.)
  • txObject ATK - A collection of platform-independent C++ class libraries that provides a five-layer framework containing an Object Library, IO and Timers, Threads, Inter-Process Communication, and Distributed Object Communication.
  • libsigc++ Callback Framework for C++ :
    libsigc++ has C++ classes that provide you a typesafe callback system. You can define signals and assign callback functions to those signals.
  • The Standard Function Library :
    The Standard Function Library, or SFL, contains routines for compression, encryption, encoding, data type conversion, data output formatting, process control, dates, times, calendars, symbol tables, linked lists, configuration files, error message files, string manipulation.
  • The Virtual X Class Library (VXCL) - A collection of powerful C++ classes. [Open source, LGPL]
  • Views - C++ Standard Template Library Extension :
    Views extends STL to include domain views, which allows you to simplify your code when you work with containers.
  • VXL (the Vision-something-Libraries) - A collection of C++ libraries designed for computer vision research. Includes imaging, geometry, numerics, streaming I/O, basic templates, posix. VXL is written in ANSI/ISO C++ and is designed to be portable over many platforms.
  • GNU Lightning :
    GNU Lightning is a library of routines that allows programs to generate assembly language code at runtime. It abstracts the target CPU, exposing your program to a standardized RISC instruction set.
  • GetPot :
    GetPot, an anagram of the ubiquitous getopt, allows programs to parse command lines and simple input files by simply including the header file for the library (the entire library is apparently in the header file).
  • ZThreads - An advanced object-oriented, cross-platform C++ threading and synchronization library. [GPL]
  • The CImg Library - The C++ Templated Image Processing Library, provides simple classes and functions to process and display images. For Unix/X11 and Windows. [Open source, GPL]
  • MyLibC :
    MyLibC is a clone of glibc for Windows. The author wrote this to reduce the size of executables that resulted when glib was used on Windows. Sources are provided.
  • IO95: Win95 LFN API Wrapper Library :
    This library has functions which you can call from your MSDOS programs to access the long filenames (LFN) API found in Windows 95 and above.
  • U2NT Library: Unix/NT Cross-Platform Library :
    This is a library that eases the work needed to port Unix programs to NT. There aren't many details on the website about the libraries' capabilities, but you can simply download it from their site and check it out yourself.
  • ClibPDF PDF Library :
    ClibPDF is a C library that allows you to create PDF files from your application or even CGI scripts.
  • CxImage - A C++ class for Win32 platforms to load, save, display, transform BMP, JPEG, GIF, PNG, TIFF, MNG, and ICO images.
  • Ensemble :
    Ensemble is a toolkit for building reliable distributed applications. Included in this toolkit is a library of protocols which you can use to build your distributed applications. The library primarily uses UDP/IP sockets.
  • GLT - C++ library for programming interactive 3D graphics with OpenGL. Aims to augment the OpenGL API with convenient mechanisms for manipulating the OpenGL state machine.
  • Dislin :
    This is a plotting library for displaying data as curves, bar graphs, pie charts, 3D-colour plots, surfaces, contours and maps.
  • OpenSteer - A C++ library to help construct steering behaviors for autonomous characters in games and animation
  • LibSMI :
    This C library "allows network management applications to access SMI MIB module information through a well defined API that hides the nasty details of locating and parsing SMIv1/v2 MIB modules."
  • TIFF Tools - A set of C++ binds to libtiff and some utilities for working with multi-page TIFF files created from scanning documents. [Open source, GPL]
  • The Visualization ToolKit (VTK) - A C++ libraries for 3D computer graphics, image processing, and visualization. Also Tcl, Python and Java implementations based on the class library.
  • GNET Network Library :
    This is a simple network library built on top of glib. It works on Linux, BSD, Mac OS X, Solaris, HP and Windows.
  • Whisper C++ Application Framework :
    Whisper is a general purpose C++ application framework, which takes advantage of templates, multiple inheritance, STL and exceptions. It is portable to both Macintosh and Win32. It contains numerous debugging tools.
  • GNU Common C++ :
    GNU Common C++ is a C++ framework for developing portable threaded applications. It is released under the GNU GPL license.
  • OPP C++ Class Library :
    A C++ class library that has a number of features, including classes for retrieving files via HTTP, sending and receiving email, database classes, thread support, string class, html parser, etc. It supports Unix platforms.
  • MySQL++ - A C++ API for MySQL. Tries to make working with queries as easy as working with other STL containers.
  • Boehm-Demers-Weiser Garbage Collector :
    A garbage collector for C/C++ that can also function as a memory leak detector. You can simply replace your calls to malloc() with GC_malloc(). Win32, Win32s, OS/2, MacOS, AmigaDOS and Unix systems are supported.
  • s-mail project - DObject Library C++ Database Connectivity - A C++ database interface similar to the JDBC technology. Currently available drivers support: MySQL database, mdb files via the ADO component (win32 platform only). [Open source, GPL]
  • 출처 : Tong - 잡다한 통..님의 라이브러리통






      
    BT Library -> http://www.binary-technologies.com
    Paint Library -> http://www.paintlib.de/paintlib
    LeadTools -> http://www.leadtools.com
    GDI+ -> http://www.microsoft.com
    corona -> 요건 까먹었음 ㅡㅡ;





      

    출처 : http://blog.naver.com/ccwii?Redirect=Log&logNo=90013295624

    /* 스크롤 뷰에 이미지파일을 올리고 스크롤 하는 예제

    /*************************************************************************************/

    1. 뷰의 OnInitialUpdate에서

    BITMAP bmpInfo;

    m_Bitmap.m_hObject = (HGDIOBJ)LoadImage( NULL, "Image.bmp", IMAGE_BITMAP, 0, 0,
                                   LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE );

    m_Bitmap.GetBitmap( &bmpInfo );

    m_nBmpHeight = bmpInfo.bmHeight;
    m_nBmpWidth = bmpInfo.bmWidth;


    SetScrollSizes(MM_TEXT, CSize( m_nBmpWidth, m_nBmpHeight) );


    CClientDC dc(this);


    m_hMemDC.CreateCompatibleDC( &dc );
    m_hBackDC.CreateCompatibleDC( &dc );

    m_BackBitmap.CreateCompatibleBitmap( &dc, m_nBmpWidth, m_nBmpHeight );


    m_pOldBackBitmap = (CBitmap *)m_hBackDC.SelectObject( &m_BackBitmap );
    m_pOldBitmap = (CBitmap *)m_hMemDC.SelectObject( &m_Bitmap );


    2. 뷰의 OnDraw에서

    CRect rt;


    m_ScrollPos = GetScrollPosition();


    GetClientRect( &rt );

    m_hBackDC.BitBlt( 0, 0, rt.Width(), rt.Height(), &m_hMemDC, m_ScrollPos.x, m_ScrollPos.y, SRCCOPY );

    pDC->BitBlt( m_ScrollPos.x, m_ScrollPos.y, rt.Width(), rt.Height(), &m_hBackDC, 0, 0, SRCCOPY );


    3. 뷰의 OnDestroy에서

    m_hBackDC.SelectObject( &m_pOldBackBitmap );






      
    아래꺼 해봤는데 실제로 잘 된다.
    출처 : http://ninvu.egloos.com/2761264/



    Dialog Base프로젝트에 View를 붙여보자

    예)
    1. Dialog base로 이름이 ViewTest라는 프로젝트를 생성해 보자..
    CViewTestApp, CViewTestDlg 라는 클래스가 생긴다..

    2. Dialog에 붙일 View를 생성해보자..
    CTestView 클래스를 생성하고 CSrollView에서 상속을 받자..
    (View는 ScrollView로 테스트 해보자.. 일반뷰도 마찬가지다..)

    3. View도 만들어 졌으면..
    ViewTestDlg.cpp에 View를 include하고
    OnCreate()에 다음과 같이 추가해 보자..

    CRuntimeClass  *pObject;
    pObject = RUNTIME_CLASS( CTestScrollView );

    CTestScrollView* pView = (CTestScrollView*) pObject->CreateObject();

    if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
        CRect(0, 0, 200, 200), this, AFX_IDW_PANE_FIRST, NULL))
    {
      TRACE0("Failed to create view window\n");
       return -1;
    }


    이렇게 하고, 테스트를 해보자..그럼 ScrollView거 Dialog에 붙은것을 볼 수 있을 것이다.
    View의 생성이 Protected로 되어 있기 때문에 View를 멤버로 가지고 Create를 통해서 생성을 하면 안된다.. 물론, view의 생성자를 Public으로 고치고 하면 생성이야 되겠지만 Close할때 문제가 생길 수 있다.





      

    다운로드 :