2016년 8월 17일 수요일

Win32 Library 생성 및 사용하기

참조 사이트 : https://msdn.microsoft.com/ko-kr/library/ms235627.aspx
1. Visual Studio 2015에서 Library 생성하기.
▶ visual studio를 실행하고, 프로젝트를 생성한다.
"파일" -> "새로 만들기(N)" -> "프로젝트(P)"를 클릭한다.

좌측 탭에서 "Visual C++" -> "Win32"를 선택하고, 중앙 탭에서 "Win32 콘솔 응용 프로그램"을 선택한다.
프로젝트 이름은 "MathFuncsLib"로 설정하고, 솔루션 이름은 "StaticLibrary"로 설정하고, "확인"을 클릭한다.

"개요" 마법사에서 "다음"을 클릭한다.

"응용 프로그램 설정"에서 "정적 라이브러리(S)"를 선택하고, "미리 컴파일된 헤더(P)"는 체크 해제한다.

생성된 프로젝트를 Build해 본다.(비어있는 프로젝트 이므로 정상적으로 Build될 것이다.)


▶ Library에서 사용될 새로운 클래스에 대한 Header 파일과 Source 파일을 생성한다.
"솔루션 탐색기"에 있는 프로제트에서 왼쪽 마우스 클릭으로 바로 가기 메뉴를 연 후, "추가(D)" -> "클래스(C)" 을 클릭한다.

좌측 탭에서 "Visual C++"을 선택하고, 가운데 텝에서 "C++ 클래스"를 선택하고, "추가(A)"를 클릭한다.

클래스 이름을 "MathFuncsLib"으로 지정하면, "MathFuncsLib.h"와 "MathFuncsLib.cpp" 파일이 자동으로 지정된다.

MathFuncsLib.h와 MathFuncsLib.cpp는 아래와 같이 비어 있다.


클래스 Header 파일(MathFuncsLib.h)에 클래스 함수를 선언한다.


Source 파일(MathFuncsLib.cpp)에 클래스 함수를 작성한다.


프로젝트를 Build해서 Library를 생성한다.(메뉴에서 "빌드(B)" "솔루션 빌드(B)"를 클릭한다.)



정상적으로 Build되었다면, "솔루션 폴더(StaticLibrary)\Debug"폴더에 Library가 생성되어 있고, Header 파일은 "프로젝트 폴더(MathFuncsLib) 폴더"에 있다.


 
이후  MathFuncsLib.lib와 MathFuncsLib.h는 항상 같이 사용될 것이다.

2. 생성한 라이브러리(MathFuncsLib)를 사용하는 방법을 알아보자
Win32 콘솔 응용프로그램인 MyExecRefsLib 프로젝트를 생성한다.






사용할 Library(MathFuncsLib.lib, MathFuncsLib.h)를 프로젝트 폴더에 복사한다.

"솔루션 탐색기"의 프로젝트에서 "바로 가기 명령"을 열고, "속성"을 클릭한다.














만약, Library와 Header가 다른 폴더에 있다면, "속성" -> "C/C++" -> "일반" -> "추가 포함 디렉터리"에  Header 파일의 Path를 추가하고, "속성" -> "링커" -> "일반" -> "추가 라이브러리 디렉터리"에 Library 파일의 Path를 추가하여야 한다.

"속성" 창의 좌측 탭에서 "링크" -> "입력"을 선택하고, 왼쪽 탭에서 "추가 종속성"을 클릭하여 "편집"을 선택한다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 

사용할 Library를 기술하고, "확인"을 클릭한다.

Source Code를 아래와 같이 작성한다.(Library를 사용한다.)

메뉴에서 "빌드" -> "솔루션 빌드"를 클릭해서 어플을 생성한다.

빌드가 정상적으로 완료되었다면, "솔루션 폴더\Debug"폴더에서 생성된 어플을 실행해 본다.



2016년 8월 13일 토요일

다이알로그 기반의 Drag&Drop 어플 만들기


1. 프로젝트를 생성한다.

프로젝트 형식을 "MFC" -> "MFC 응용 프로그램"으로 지정하고, 프로젝트 이름을 입력한다.


응용 프로그램 종류를 "대화 상자 기반(D)"을 선택한다.

"마침"을 클릭한다.


2. 대화 상자 컨트롤을 디자인 한다.
기본 대화 상자에서 "확인", "취소" 버튼과 "문자열"을 제거하고, 아래와 같이 디자인한다.
위에서 부터 List Control, Button 3개, Edit Control을 배치한다.

리스트 컨트롤에서 ID는 IDC_LIST_FILE로 정의하고, Accept Files를 "True"로 설정한다.
향후 File Drag & Drop을 지원함.

첫번째 버튼의 Caption과 ID는 "파일 선택(S)", IDC_BUTTON_BROWSE로 설정한다.

두번째 버튼의 Caption과 ID는 "파일 처리(C)", IDC_BUTTON_CREATE로 설정한다.

세번째 버튼의 Caption과 ID는 "종료(X)", IDC_BUTTON_CLOSE로 설정한다.

마지막 Edit Control의 ID는 IDC_EDIT_VIEW이고, 속성에서 Multiline, Read Only, Vertical Scroll을 "True"로 설정한다.

Edit Control은 Log Display용으로 사용될 것이다.
생성한 "대화상자"를 Build해서 "대화상자"의 실행 화면을 확인한다.




3. 변수 선언 및 처리 함수 생성하기.
List Control과 Edit Control에 각각 CString변수와 Control 변수를 아래와 같이 추가한다.
Dialog에서 해당 컨트롤을 클릭한 상태에서 오른쪽 마우스를 클릭해서 변수를 추가한다.

List Control에 "CString m_list_str", "CListBox m_list_file"변수를 추가한다.


Edit Control Box에 "CString m_edit_str", "CEdit m_edit_view"변수를 추가한다.


Dialog에서 3개의 버튼을 Double Click해서 처리함수를 생성한다.
즉, "파일 선택(S)"버튼이 클릭되면, OnBnClickedButtonBrowse()함수가 실행되고,
"파일 처리(C)"버튼이 클릭되면, OnBnClickedButtonCreate()함수가 실행되며,
"종료(X)"버튼이 클릭되면, OnBnClickedButtonClose()함수가 실행된다.

메시지(Message)처리함수와 가상 함수를 등록하기 위해서 "클래스 마법사"를 실행한다.
Dialog를 클릭하고, 오른쪽 마우스 클릭으로 아래와 같이 "클래스 마법사(Z)"를 실행한다.


"메시지"탭을 선택하고, "WM_DROPFILES"메시지를 드블클릭하거나, "처리기 추가(A)"를 클릭한다.
이 메시지는 File을 List Control에 "Drag & Drop"할 때 발생한다.

키보드의 "Enter"키와 "ESC"키를 처리하기 위한 가상 함수를 추가한다.
"가상 함수"탭을 선택하고, "PreTranslateMessage"함수를 선택하고, 드블 클릭하거나 "함수 추가(A)"를 클릭한다.

DragNDropDlg.cpp 파일에 앞서 생성한 OnDropFiles()함수와 PreTranslateMessage()함수가 생성된다.


4. 프로그램 작성.
4.1. PreTranslateMessage()함수 구현.
Dialog가 실행된 상태에서 "Enter"키나 "ESC"키를 누르면, Dialog가 종료되므로, 2개의 Key를 처리하도록 한다.

Build후 실행하면, "ESC"키가 입력되더라도 Dialog는 종료되지 않는다.

4.2. "종료(X)"버튼에 대한 처리함수(OnBnClickedButtonClose())를 작성한다.
"종료(X)"버튼에 대해서 실행된 Dialog를 종료하는 기능이므로, OnOK()함수를 Call하면 Dialog는 정상 종료된다.

Build후 Dialog를 실행하고, "종료(X)"버튼을 클릭하면, Dialog가 종료된다.

4.3 "파일 선택(S)"버튼에 대한 처리함수(OnBnClickedButtonBrowse())를 작성한다.
"파일 선택(S)"버튼을 클릭하면, 파일을 선택할 수 있도록 "파일 선택 대화 상자"가 실행되고, 선택된 파일명을 List Control에 출력한다.
1개의 파일만 선택할 수 있고, 확장자가 "*.bin", "*.txt", "*.hex"파일을 먼저 검색할 것이고, Default file은 "binary.bin"을 read한다.

파일을 선택한 후의 실행 화면은 아래와 같다.


4.4 드래그앤드롭(Drag&Drop) 구현하기.
List Control에 파일을 마우스로 "Drag & Drop" 했을 때의 동작을 아래와 같이 구현한다.
Multi-file을 "Drag&Drop"하게되면, 최초의 파일만 선택된다.


4.5 "파일 처리(C)"버튼에 대한 처리 함수(OnBnClickedButtonCreate())를 작성한다.

4.6 CDragNDropDlg 클래스 함수 추가하기.
"클래스 뷰"창에서 오른쪽 마우스 클릭 후 "추가" -> "함수"를 선택한다.

함수의 반환 형식, 이름, 매개 변수를 지정한다. 이 함수는 Edit Control에 문자열을 출력하는 함수 이다.

OnBnClickedButtonBrowse()함수에서 아래와 같이 Call한다.
즉, 선택된 파일의 전체 경로와 이름을 Edit Control에 출력한다.