[API] Drag&Drop2

simpled 2013.06.23 16:15 조회 수 : 6313

설명이 부족해서 그냥 조금 더 올립니다. (이어서 보시기를 원합니다.)
일단 첨부된 프로그램을 열어보시기를 권장합니다.


제목 없음.png

<그림 1 :  Project Program의 기초 화면 모습>


<그림 1>은 예전에 OLED 프로젝트를 처음 시작할때 만들었던 프로그램의 모습입니다.

어짜피 파일 포맷이 안통하면 계산이고 나발이고 전혀 안되니까, 우리는 Drag&Drop 메시지에만 주목하면 됩니다.


제목 없음 (1).png

<그림 2 : Open을 눌렀을 때 나오는 창 2개>


Open을 누르면 창 2개가 나오는데, 하나는 Dialog 박스이고 하나는 Consol 박스입니다.


Dialog box :

Drag&Drop이 이루어지는 창입니다.

여기에 파일을 끌어다 놓으면 경로, 파일명, 확장자를 필터링 합니다.

이것은 확장자(exe, cad, txt, hwp 등)를 strcmp등의 함수로 '비교'하여, 목적에 맞는 파일을 갖다 놓은건지 '인식' 시키는 것을 주 목표로 삼습니다.


Consol box :

이 블로그에서도 수도 없이 언급했지만, 저는 C를 떼자마자 c++, api, opengl을 동시에 수강했습니다.

때문에 쓰레드라던가, 통신이라던가 하는 개념이 전혀 없었으며, 프로세스가 멈춰도 계산이 된다는 것 정도만 알고 있었습니다.

쓰레드를 모르니 프로그레스 바가 무슨 소용이겠습니까?ㅎㅎ, 하지만 어찌되었든 계산 진행상황은 봐야했기에 갖은 짱구를 다 굴려서 생각해낸것이

Consol입니다. 

아무튼, ....... 콘솔은 다른 스래드로 실행되더군요. (어짜피 콘솔은 잘 쓰지 않으므로 생략하겠습니다.)



다이얼로그 박스에 어떤 이벤트를 추가해야 하는지는 이미 한번 언급했으므로,

바로 코드를 붙여넣겠습니다.


제목 없음 (2).png

<그림 3>




1:

일단 윈도우의 Open 버튼을 클릭하면 BUTTON_OPEN 메시지로 가게 됩니다.

메뉴바에서 Open을 누르면 ID_MENU_FILE_OPEN 메시지로 가게 되고요.


2:

계산을 위한 동적 메모리 할당과 해제에 관한 코드입니다.

요컨데 파일을 새로 오픈할 때마다 새로운 동적 메모리 할당이 필요해서 부여한 코드입니다.

동적 할당은 늘 항상 저의 머리를 빡치게 하지요.


3:

여기에 <그림 1>의 윈도우를 숨기고 <그림 2>의 윈도우 2개를 출력하는 코드가 담겨있습니다.


4:

코드를 우클릭하여 '4'와 같은 항목을 선택하여 바로 코드를 보도록 하겠습니다.


제목 없음 (3).png 

<그림 4>

 

(필자는 API코드가 엄청나게 길어짐에 따라, 프로시져 내에 들어갈 대부분의 코드를 다양한 클래스로 빼내어 관리하게 되었다.)

여기서 보면 윈도우를 숨기고 다른 윈도우를 띄우는 코드가 들어있습니다.

DialogBox(??) 함수를 통해 Drag&Drop 기능이 들어있는 다이얼로그를 띄웁니다.

이때 쯤에 또 다른 첨부파일인 Dialog.h 를 보시기 바랍니다.

Ctrl+F를 통해 WM_DROPFILES 를 검색하시기 바라구요.


제목 없음 (4).png

<그림 5>


case WM_DROPFILES:

                       // dwNumDropFile의개수를입력받는다.

                       dwNumDrop = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL ,0);

                       // dwNumDrop만큼for문을돈다

                       for(DWORD i=0L; i<dwNumDrop; i++)

                       {

                              // i번째에해당하는파일의버퍼사이즈를불러온다.

                              dwBufSize = DragQueryFile((HDROP)wParam, i, NULL ,0L) + 1;

                              // 버퍼사이즈만큼TCHARLPTSTR 형식으로동적할당취한다.

                              pFileName=(LPTSTR)new TCHAR [dwBufSize];

                              // DragQueryFile 함수가뭐하는녀석인지잘모른다.

                              // 하지만주석처리하면프로그램에러가난다는것은잘알고있다.

                              DragQueryFile((HDROP)wParam, i, pFileName, dwBufSize);

                              // 클래스변수(strFileName)에포인터변수의내용(pFileName)을초기화시킨다.

                              strFileName=pFileName;

                              // 포인터변수를동적해제시킨다.

                              delete []pFileName;

                              // 클래스변수를ID_DLG_FILE_PATH 에출력시킨다.

                              SetDlgItemText(hDlg, ID_DLG_FILE_PATH, strFileName);

 

                              // 클래스변수를TCHAR 변수에초기화시킨다.

                              wsprintf(tcFileNameEx, strFileName);

                              wsprintf(tcFilePathNameEx, strFileName);

                              wsprintf(tcDatPathNameEx, strFileName);

                             

                              // 2. 확장자만달라진문자열을저장한다

                              PathRenameExtension(tcDatPathNameEx, TEXT(".dat"));

                              wsprintf(tcDatNameEx, tcDatPathNameEx);

                             

                              // 3. File의경로(Path)를지워준다.

                              PathStripPath(tcFileNameEx);

                              PathStripPath(tcDatNameEx);

                             

                              // 4. 확장자만저장한다. (실행이잘안됨)...

                              wsprintf(tcFileEx, tcFileNameEx);

                              if(!vlFile.cFile_EX_Div(tcFileEx))

                              {

                                      DLG_MESSAGE(hDlg, TEXT("LMS :: 중복된콤마(.)을제거요함"));

                                      break;

                              }

                             

                              // file명과확장자만존재하는TCHAR 변수를ID_DLG_FILE_NAME에출력한다.

                              SetDlgItemText(hDlg, ID_DLG_FILE_NAME, tcFileNameEx);

                             

                              // 메시지를출력한다.

                             wsprintf(tcMsg, TEXT("LMS(1) :: %s 의경로이름및확장자인식완료"), tcFileEx);

                              DLG_MESSAGE(hDlg, tcMsg);

                              DLG_PROCESS(hWndProgress, 1);

                             

                              // 다이얼로그의상태를추적으로바꾼다.

                              iDlgStatus=F_TRACKKING;

                             

                              // 버튼의텍스트를바꾼다.

                              SetWindowText(hWndOKButton, TEXT("START"));

                       }

                       break;


tc ~ 라는 변수는 TCHAR형 문자열을 의미합니다.

int형 변수에 iCoin 이라고 한 것과 똑같아요.


일반적으로 tc라고 하는지는 잘 모르겠습니다... 

컴퓨터 공학 친구들과 별로 안 친해서 이것에 대해 배운 바가 없기 때문에, 저 혼자만의 규칙을 정한겁니다. 


아무튼 미리 선언해둔 문자열 변수라고 치면 되요.




여기서는 코드만 볼거니까, 일단 핑크색 글씨만 보세요.

이차 여차해서 strFileName 에 경로, 이름, 확장자를 모두 포함한 전체 문자열을 이어받게 됩니다.


그리고 붉은색의 함수에 의해 그 문자열들을 조작하면 됩니다.

그러면 하나의 파일에 대한 파일경로, 파일명, 확장자 이 세가지 자원을 얻을 수 있습니다.


이를 통해, 파일 여는 클래스를 이용, 파일을 열고 그 내부의 데이터를 읽어서 자원으로 활용하시면 됩니다.