MFC Tab Control Color Change #2

Programming/MFC 2016. 10. 18. 10:57 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC Tab Control Color Change #2





Change Tab Selector? Color




override DrawItem function




void CMainTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

	COLORREF m_select_border_color = RGB(255, 255, 255);
	COLORREF m_select_text_color = RGB(10, 155, 202);
	COLORREF m_unselect_border_color = RGB(255, 255, 255);
	COLORREF m_unselect_text_color = RGB(0, 0, 0);


	int select_index = lpDrawItemStruct->itemID;
	if (select_index < 0) return;

	char tab_text[40];

	TC_ITEM data;
	data.mask = TCIF_TEXT | TCIF_IMAGE;
	data.pszText = tab_text;
	data.cchTextMax = 39;

	// 선택된 탭의 정보를 얻는다.
	if (!GetItem(select_index, &data)) return;

	CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	CRect rect = lpDrawItemStruct->rcItem;

	// Tab이 그려진 테두리의 두께만큼 위치를 보정한다.
	rect.top += ::GetSystemMetrics(SM_CYEDGE);

	pDC->SetBkMode(TRANSPARENT);

	// 탭이 선택된 정보에 따라 배경색을 칠해준다.
	if (select_index == GetCurSel()) pDC->FillSolidRect(rect, m_select_border_color);
	else pDC->FillSolidRect(rect, m_unselect_border_color);

	// 이미지를 출력한다.
	CImageList *p_image_list = GetImageList();
	if (p_image_list != NULL && data.iImage >= 0) {
		rect.left += pDC->GetTextExtent(" ").cx;

		IMAGEINFO image_info;
		p_image_list->GetImageInfo(data.iImage, &image_info);
		CRect image_rect(image_info.rcImage);

		p_image_list->Draw(pDC, data.iImage, CPoint(rect.left, rect.top), ILD_TRANSPARENT);
		rect.left += image_rect.Width();
	}

	CFont *p_old_font = NULL;

	if (select_index == GetCurSel()){
		// 선택된 탭이라면...
		pDC->SetTextColor(m_select_text_color);

		// 텍스트의 위치를 보정하여 선택된 느낌이 강조되도록 만든다.
		rect.top -= ::GetSystemMetrics(SM_CYEDGE);
		pDC->DrawText(tab_text, rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
	}
	else {
		// 선택되지 않은 탭이라면...
		pDC->SetTextColor(m_unselect_text_color);
		pDC->DrawText(tab_text, rect, DT_SINGLELINE | DT_BOTTOM | DT_CENTER);
	}

	pDC->SelectObject(p_old_font);
}




그리고


DrawItem 이벤트를 발생시키기 위하여



Dialog 에서






m_TabCtrl.ModifyStyle(0, TCS_OWNERDRAWFIXED);


를 불러 주어야 한다.

MFC Tab Control Color Change #1

Programming/MFC 2016. 10. 18. 10:34 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC Tab Control Color Change


Erase Background


Tab Control 의 배경 부분의 색상을 선택 할 수 있다.










TabControl 을



CTabCtrl 을 상속 받는 별개의 클래스로 구현하여




 

BEGIN_MESSAGE_MAP(CMainTabCtrl, CTabCtrl)

      ON_WM_ERASEBKGND()

END_MESSAGE_MAP()





메세지 맵에 추가한 후











BOOL CMainTabCtrl::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

	CRect rect;

	GetClientRect(&rect);

	CBrush myBrush(RGB(255, 255, 255));    // dialog background color <- 요기 바꾸면 됨.

	COLORREF color_data = RGB(64, 128, 255);


	CBrush *pOld = pDC->SelectObject(&myBrush);

	BOOL bRes = pDC->PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY);

	pDC->SelectObject(pOld);    // restore old brush

	return bRes;                       // 	return CTabCtrl::OnEraseBkgnd(pDC);
}



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

링커 도구 경고 LNK4098


LINK : warning LNK4098: 'LIBCMT' defaultlib가 다른 라이브러리와 충돌합니다. /NODEFAULTLIB:library를 사용하십시오.





호환되지 않는 라이브러리에 링크하려고 했습니다.

System_CAPS_note참고

런타임 라이브러리에는 여러 형식이 혼합 사용되지 않도록 하는 지시문이 들어 있는데  여러 형식이나 디버그/비디버그 버전의 런타임 라이브러리를 동일한 프로그램에서 사용하려고 하면 이 경고가 발생합니다.  예를 들어, 어떤 종류의 런타임 라이브러리를 사용하는 파일을 컴파일하고 다른 종류의 런타임 라이브러리를 사용하는 파일을 컴파일한 다음(예: 단일 스레드 라이브러리와 다중 스레드 라이브러리) 이 둘을 링크시키려고 하면 이 경고가 발생합니다.  동일한 런타임 라이브러리를 사용하는 소스 파일을 컴파일해야 합니다.  자세한 내용은 런타임 라이브러리 사용(/MD/MT,/LD) 컴파일러 옵션을 참조하십시오.  

링커의 /VERBOSE:LIB 스위치를 사용하여 링커가 검색 중인 라이브러리를 확인할 수 있습니다.  예를 들어, LNK4098이 발생하여 단일 스레드된 비디버그 런타임 라이브러리를 사용하는 실행 파일을 만들려는 경우에는 /VERBOSE:LIB 옵션을 사용하여 링커에서 검색 중인 라이브러리를 확인하십시오.  링커는 검색한 라이브러리로 LIBC.lib를 출력하며 LIBCMT.lib, MSVCRT.lib, LIBCD.lib, LIBCMTD.lib 또는 MSVCRTD.lib는 출력하지 않습니다.  무시할 각 라이브러리에 대해 /NODEFAULTLIB를 사용하여 링커가 잘못된 런타임 라이브러리를 무시하도록 할 수 있습니다.  

다음 표는 사용할 런타임 라이브러리에 따라 무시해야 하는 라이브러리를 보여 줍니다.

사용할 런타임 라이브러리

무시해야 하는 라이브러리

단일 스레드(libc.lib)

libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

다중 스레드(libcmt.lib)

libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

DLL을 사용하는 다중 스레드(msvcrt.lib)

libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

디버그 단일 스레드(libcd.lib)

libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib

디버그 다중 스레드(libcmtd.lib)

libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib

DLL을 사용하는 디버그 다중 스레드(msvcrtd.lib)

libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib






1. DLL을 사용하는 다중 스레드(msvcrt.lib) 일경우








336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

공유 DLL에서 MFC 사용 VS 정적 라이브러리에서 MFC 사용 


이 둘의 차이점?










공유 DLL에서 MFC 사용(Use MFC in a Shared DLL) : 응용프로그램 배포 시 mfc**.dll 파일을 함께 배포.
정적 DLL에서 MFC 사용(Use MFC in a Static Library) : 응용프로그램의 실행 파일에 mfc**.dll 이 포함되어 배포되기 때문에 응용프로그램만 배포.













기본적으로 "Use MFC in a Shared DLL" 가 설정되어 있습니다. 이 설정은 현재 개발중인 프로그램이 필요로 하는 라이브러리를 기본적으로 제공되는 DLL에서 참조하여 사용하겠다는 뜻입니다. 따라서 이 모드로 컴파일을 하여 실행파일을 배포하려면, 해당 컴파일에 Visual C++가 설치되어 있거나 다음과 같은 DLL이 있어야 합니다. mfc42d.dll, mfco42d.dll, msvcirtd.dll, msvcrtd.dll 물론 이 네 종류의 DLL 파일이 모두 있어야 하는 것은 아닙니다. 개발된 프로그램의 성격에 따라서 이 중 한 개정도가 필요 없을 때도 있습니다.

이 DLL은 이름이 mfc42d.dll과 같이 d로 끝나는데, 이 d는 "Debug" 의 약자로 생각하시면 됩니다. 이 파일들은 윈도우 시스템이 설치된 폴더의 "system32" 폴더 아래에 있습니다. 필요하다면, 해당 폴더에서 이 dll들을 복사해서 실행파일을 배포할 때 같이 배포하면 됩니다. 사실, 어떤 경우에 보면, 실행파일은 크기가 얼마되지 않는데 같이 붙어 다니는 dll의 사이즈가 엄청 큰 이상한 경우가 발생 하기도 합니다."Use MFC in a Static Library" 로 설정되어 있는 경우 컴파일을 하고 나서 실행파일을 배포할 때 별도의 dll을 같이 제공할 필요가 없습니다. 실행파일만 제공하면 되죠. 하지만, 이 방법은 별도의 dll이 없는 반면에 실행 파일의 사이즈가 좀 크다는 단점이 있습니다.
 
이 두 가지를 놓고 볼 때, 다음과 같이 일반적인 결론을 내릴 수 있습니다. 단순히 하나의 실행파일을 가지는 프로그램인 경우, "Use MFC in a Static Library" 를 사용해서 컴파일 하는 것이 비교적 유리하고 여러 개의 실행파일과 또는 dll이 사용되는 프로그램인 경우 각각의 실행파일 사이즈를 줄일 수 있는 "Use MFC in a Shared DLL"을 사용하는 것이 더 유리하다고 할 수 있습니다. 따라서 개발자가 이 두 가지 상황을 잘 판단해서 사용하면 될 것 같습니다.





  배포 시 응용프로그램만 배포하는게 관리하기도 편하고 오작동의 가능성도 적기 때문에 "정적 DLL 에서 MFC 사용" 으로 프로젝트를 설정하여 개발하게 된다.

  응용프로그램이 DLL 일 경우 위와 같이 설정하면 컴파일 시 다음과 같은 오류 메시지가 발생한다.
fatal error C1189: #error :  Please use the /MD switch for _AFXDLL builds

다음과 같이 설정해 주자.


1. 전처리기 정의

C/C++ → 전처리기 → 전처리기 정의
"_AFXDLL" 추가




2. 코드 생성

C/C++ → 코드 생성 → 런타임 라이브러리
Debug 모드일 경우    : "다중 스레드 디버그 DLL(/MDd)" 설정
Release 모드일 경우 :  "다중 스레드 DLL(/MD)" 설정







참고 : http://six605.tistory.com/466

참고 : https://social.msdn.microsoft.com/Forums/ko-KR/ba6bfe1c-8f80-45ea-809b-ec543dd6dc31/-dll-mfc-vs-mfc-?forum=asppnetko



MFC Dialog Modal

Programming/MFC 2016. 9. 22. 16:48 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

부모 Dialog 에서





자식 Dialog를 Domodal로 부른 뒤


  void CMyDialog::OnMenuShowSimpleModal()
{
   CSimpleDlg myDlg;
   INT_PTR nRet = myDlg.DoModal();

   if (nRet == IDOK || nRet == 5)
      AfxMessageBox(_T("Dialog closed successfully"));
}



자식 Dialog가 종료 될때




  void CSimpleDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
   UNREFERENCED_PARAMETER(nFlags);
   // Do something

   int nRet = point.x; // Just any value would do!
   EndDialog(nRet); // This value is returned by DoModal!

   // Do something

   return; // Dialog closed and DoModal returns only here!
}


MFC Modal and Modeless Dialog Boxes

Programming/MFC 2016. 9. 6. 10:56 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Modal and Modeless Dialog Boxes




You can use class CDialog to manage two kinds of dialog boxes:

  • Modal dialog boxes, which require the user to respond before continuing the program

  • Modeless dialog boxes, which stay on the screen and are available for use at any time but permit other user activities

The resource editing and procedures for creating a dialog template are the same for modal and modeless dialog boxes.

Creating a dialog box for your program requires the following steps:

  1. Use the dialog editor to design the dialog box and create its dialog-template resource.

  2. Create a dialog class.

  3. Connect the dialog resource's controls to message handlers in the dialog class.

  4. Add data members associated with the dialog box's controls and to specify dialog data exchange and dialog data validations for the controls.




생성되는 윈도우는 두가지 형태가 있다.
대화가 필요한 모달형과, 대화가 필요없는 모달리스

대화가 필요한 모달형은 대화를 마치지 않으면 다음으로 넘어갈 수 없는 윈도우다.
즉, 파일열기를 해서 파일목록이 나오고 파일을 선택하는 윈도우가 팝업되었을 때, 
그 윈도우창을 무시하고 그 전의 윈도우를 컨트롤 할 수 없도록 되어있다. (취소를 하시든가)
무조건 적으로 대화가 필요한 모달형에 비해,
대화가 필요없는 모달리스형이 있다.
모달리스형은 익스플로러를 하면서 Ctrl F키를 눌러서 찾기 기능을 사용할 때, 개념을 찾을 수 있는데, 
찾기 윈도우가 팝업되었지만, 기존의 익스플로러 윈도우에도 편하게 접근이 가능하다.
대화따위... 존재하지 않은지가 오랜지...


Modal Dialog

써먹을려면 CDialog 클래스의 일부함수를 재정의 해야 하는데, 
이렇게 가상함수들을 재정의할 때, 함수의 호출 시점을 꿰고있는게 좋을 것이다.

대화상자 객체를 주로 스택에 생성한다.

virtual BOOL CDialog::OnInitDialog();
호출 : CDialog::DoModal() 함수에 의해서 대화상자가 생성되고 WM_CREATE메시지가 발생하게 된다.
        OS는 이 메시지를 받고, Dialog 템플릿에 선언된 컨트롤을 모두 생성한 후 대화상자가 화면에 보이기전에
        WM_INITDIALOG 메시지를 발생시키는데, 이 때 OnInitDialog()함수가 호출된다.
        즉, OnInitDialog()함수는 WM_INITDIALOG메시지 핸들러라고 할 수 있다.
사용 : 컨트롤 초기화 및, 키보드 포커스 변경시 사용

virtual void CDialog::OnOk();
호출 : 사용자가 OK버튼을 누르면 호출된다. (id값이 IDOK인 버튼)
        즉, OnOk()함수는 OK버튼클릭 메시지 핸들러라고 할 수 있다.
사용 : 컨트롤 값을 읽거나 값의 타당성을 검사한 후 Dialog 닫기

virtual void CDialog::OnCancel();
호출 : 사용자가 Cancel버튼을 누르면 호출된다. (id값이 IDCANCEL인 버튼)
        즉, OnCancel()함수는 Cancel버튼클릭 메시지 핸들러라고 할 수 있다.
사용 : 대화상자 닫기.

위의 3가지 함수는 메시지핸들러의 기능을 하지만, 가상함수로 정의되어 있으므로 
굳이 메시지 맵이 필요없이 자동 호출된다.

생성은 CDialog::DoModal(), 닫을때는 CDialog::EndDialog()
OnOk()나 OnCancel()함수는 자동으로 EndDialog() 호출하므로,
만약 다른 방법으로 대화상자를 닫기 원할 때, CDialog::EndDialog() 호출하면 된다.



Modeless Dialog

주의사항. 모달형과 생성 및 닫는 함수가 다르다.
DoModal()대신 CDialog::Create()
EndDialog()대신 CWnd::DestroyWindow() 함수를 사용한다.
대화상자 객체를 힙에 생성한다.
(스택에 객체를 생성해버리면 변수선언영역을 벗어났을때 소멸자가 호출되어 대화상자가 소멸되므로
대화상자를 계속 유지할 수 없기 때문이다.)





'Programming > MFC' 카테고리의 다른 글

공유 DLL에서 MFC 사용 VS 정적 라이브러리에서 MFC 사용  (0) 2016.10.06
MFC Dialog Modal  (0) 2016.09.22
MFC Alert MessageBox2  (0) 2016.09.06
MFC Alert MessageBox  (0) 2016.09.06
MFC Drag And Drop FileName 만 추출  (0) 2016.08.30

MFC Alert MessageBox2

Programming/MFC 2016. 9. 6. 10:47 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

      int MessageBox(
   LPCTSTR lpszText,
   LPCTSTR lpszCaption = NULL,
   UINT nType = MB_OK 
);

lpszText

가리키는 있는 CString 개체 또는 표시 되는 메시지에 포함 된 null로 끝나는 문자열입니다.

lpszCaption

가리키는 있는 CString 개체 또는 null로 끝나는 문자열에 대 한 캡션을 메시지 상자를 사용할 수 있습니다. 경우 lpszCaption  NULL, 기본 캡션을 "오류"를 사용 합니다.

nType

콘텐츠 및 메시지 상자의 동작을 지정합니다.


전역 함수 사용 AfxMessageBox 응용 프로그램에서 메시지 상자를 구현 하려면이 멤버 함수를 대신 합니다.

다음은 메시지 상자에 사용할 수 있는 다양 한 시스템 아이콘입니다.

중지(x) 아이콘

MB_ICONHANDMB_ICONSTOP, 및 MB_ICONERROR

도움말(?) 아이콘

MB_ICONQUESTION

중요(!) 아이콘

MB_ICONEXCLAMATION 및 MB_ICONWARNING

정보(i) 아이콘

MB_ICONASTERISK 및 MB_ICONINFORMATION









void CMainFrame::OnDisplayErrorMessage()
{
   // This displays a message box with the title "Error"
   // and the message "Help, Something went wrong."
   // The error icon is displayed in the message box, along with
   // an OK button.
   MessageBox(_T("Help, Something went wrong."), _T("Error"), 
      MB_ICONERROR | MB_OK);
}




'Programming > MFC' 카테고리의 다른 글

MFC Dialog Modal  (0) 2016.09.22
MFC Modal and Modeless Dialog Boxes  (0) 2016.09.06
MFC Alert MessageBox  (0) 2016.09.06
MFC Drag And Drop FileName 만 추출  (0) 2016.08.30
MFC File Icon Drag and Drop  (0) 2016.08.30

MFC Alert MessageBox

Programming/MFC 2016. 9. 6. 10:40 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC Alert MessageBox


MessageBox 클래스

.NET Framework (current version)
 

사용자에게 메시지를 보여 주는 메시지 창을 표시합니다. 이 창을 대화 상자라고도 합니다. 이 창은 사용자가 닫을 때까지 응용 프로그램의 다른 동작을 차단하는 모달 창입니다. MessageBox에는 사용자에게 필요한 정보와 명령을 제공하는 텍스트, 단추 및 기호가 포함될 수 있습니다.

네임스페이스:   System.Windows.Forms
어셈블리:  System.Windows.Forms.dll의 System.Windows.Forms




private:
   void validateUserEntry()
   {
      // Checks the value of the text.
      if ( serverName->Text->Length == 0 )
      {
         // Initializes the variables to pass to the MessageBox::Show method.
         String^ message = "You did not enter a server name. Cancel this operation?";
         String^ caption = "No Server Name Specified";
         MessageBoxButtons buttons = MessageBoxButtons::YesNo;
         System::Windows::Forms::DialogResult result;

         // Displays the MessageBox.
         result = MessageBox::Show( this, message, caption, buttons );
         if ( result == ::DialogResult::Yes )
         {
            // Closes the parent form.
            this->Close();
         }
      }
   }



private:
   void Form1_FormClosing(Object^ sender, FormClosingEventArgs^ e)
   {
	  // If the no button was pressed ...
      if ((MessageBox::Show(
         "Are you sure that you would like to close the form?", 
         "Form Closing", MessageBoxButtons::YesNo, 
         MessageBoxIcon::Question) == DialogResult::No))
      {
		 // cancel the closure of the form.
         e->Cancel = true;
      }
   }



'Programming > MFC' 카테고리의 다른 글

MFC Modal and Modeless Dialog Boxes  (0) 2016.09.06
MFC Alert MessageBox2  (0) 2016.09.06
MFC Drag And Drop FileName 만 추출  (0) 2016.08.30
MFC File Icon Drag and Drop  (0) 2016.08.30
MFC Dialog 가 이상한 위치에 배치, (0,0)에 배치  (0) 2016.08.24

MFC Drag And Drop FileName 만 추출

Programming/MFC 2016. 8. 30. 11:38 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


MFC Drag And Drop FileName 만 추출


	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	int nFiles;


	char szPathName[MAX_PATH];  // 파일 경로명이 들어간다.
	
	// 드래그앤드롭된 파일의 갯수
	nFiles = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, szPathName, MAX_PATH);







	for (int i = 0; i < nFiles; i++)
	{
		// 파일의 경로 얻어옴
		::DragQueryFile(hDropInfo, i, szPathName, MAX_PATH);
		MessageBox(szPathName, "DropAndDropFile");
		char* szFileName = szPathName;
		// FileName 만을 찾기위한 반복문
		for (int j = 0; j < strlen(szPathName); j++)
		{
			if (szPathName[j] == '\\')
			{
				szFileName = szPathName + j + 1;
			}
		}
		m_ListCtrl.AddString(szFileName);
		m_ListCtrl.SetHorizontalExtent(2600);
	}

'Programming > MFC' 카테고리의 다른 글

MFC Alert MessageBox2  (0) 2016.09.06
MFC Alert MessageBox  (0) 2016.09.06
MFC File Icon Drag and Drop  (0) 2016.08.30
MFC Dialog 가 이상한 위치에 배치, (0,0)에 배치  (0) 2016.08.24
MFC CTextProgressCtrl  (0) 2016.08.17

MFC File Icon Drag and Drop

Programming/MFC 2016. 8. 30. 11:19 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC File Icon Drag and Drop










드래그앤드랍기능을 쓰고 싶은


Dialog 나 ListControl 을 리소스 뷰에서 선택한다.











속성 항목


[동작] [Accept Files] 항목을 True 로 바꾼다.



Files 을 드래그앤드랍으로 받을 수 있게 된다.












해당 컴포넌트에 드래그앤드랍이 발생할 경우


OnDropFiles(HDROP hDropInfo)


함수로 메시지가 들어오게 된다.











해당 함수를 오버라이딩 하는 방법은


해당 컴포넌트의 Dialog 클래스를


클래스 뷰에서 선택하고 속성 창을 연다.






WM_DROPFILES 메시지에 OnDropFiles 를 활성화 시켜준다.







그러면 Dialog 클래스 cpp 파일에 OnDropFiles 함수가 생성된다.






다음 코드를 OnDropFiles(HDROP hDropInfo) 함수에 추가하여 실행하여 본다.





  int nFiles;


char szPathName[MAX_PATH];  // 파일 경로명이 들어간다.


CString strFileName;


// 드래그앤드롭된 파일의 갯수

nFiles = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, szPathName, MAX_PATH);


for (int i = 0; i < nFiles; i++)

{

// 파일의 경로 얻어옴

::DragQueryFile(hDropInfo, i, szPathName, MAX_PATH);

MessageBox(szPathName, "DropAndDropFile");

}