출처 : http://dffect.cafe24.com/blog/

1. VC2005 이상의 툴이라면(아마 VS2003도 마찬가지일 듯) 다이얼로그 클래스를 선택하고 Properties 창에서 Overrides 아이콘을 선택한다.

2. 스크롤을 죽 내리다 보면 PreTranslateMessage 함수가 보일텐데 이 함수를 추가해 준다.

3. 아래와 같은 코드를 작성한다. (여기에서는 ESC와 엔터키만 처리하였다)
 BOOL CCherryRadioDlg::PreTranslateMessage(MSG* pMsg)
{
    // ESC 키
    if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE))
    {
        // 여기에 원하는 동작의 코드를 삽입
        return true;
    }

    // 엔터키
    if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN))
    {
        // 여기에 원하는 동작의 코드를 삽입
        return true;
    }
    return CDialog::PreTranslateMessage(pMsg);
}


VS2005와 VS2008에서 ParameterType.Value.length is null or not Object와 같은 오류 메시지를 띄운다면..
아래의 방법으로 해결 가능.


요약 :
1. 레지스트리 에디터(regedit)로 아래의 주소로 이동
  주소 : HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings\Zones
2. 여기에  "1000"이라는 이름으로 key를 생성
3. 1000 이라는  key 하위에 DWORD 하나를 추가
  이름 : 1207
  타입 : 위에 적은 것처럼 DWORD
  데이터 : 0x000000 (그냥 0 하나만 넣으면 자동으로 변환)
4. VS2005, VS2008을 재시작

처음엔 관리자 권한 때문에 이런 문제가 발생하는 줄 알았으나 익스플로러 8로 인하여 생기는 문제라고 한다.

간단하게 함수를 사용하기 위하여 클래스 위저드를 연다.

Class Info -> Advanced options -> Message filter에서 Window를 선택하고,

다시 Message Maps로 이동한다.
Messages에서 다시 함수를 찾아보게 되면 WM_DropFiles가 보일 것이다.
해당 함수를 추가한다.
Drag&Drop을 활성화 하기 위하여 아래의 코드를 초기화 하는 부분에 추가해 준다.

DragAcceptFiles(true);

그리고 다음의 코드를 원하는 곳에 응용하여 준다.

CHAR  szPath[1024];  // 기본 파일 경로 및 파일명을 가져오기 위해 사용
CFileStatus fileStatus; // file 정보를 가져올 때 사용
DragQueryFile(hDropInfo, 0, (LPTSTR)szPath, 1023);     // 입력된 첫번째 파일 정보를 읽어온다.
CFile::GetStatus(szPath, fileStatus);     // 파일 정보를 읽음

아래 코드를 이용할 수도 있을 것이다.

SHFILEINFO shFileInfo;
SHGetFileInfo(szPath, NULL, &shFileInfo, sizeof(SHFILEINFO), SHGFI_DISPLAYNAME | SHGFI_ICON);


데브피아의 자료실에서 참고한 코드 및 자작 코드 짬뽕 ^^

ShellExecute를 사용하면서 const char를 lpcwstr로 변환할 수 없다는 메세지를 보거나..
혹은 비슷한 메세지를 본다면...
아래의 경우..^^
 
 
VS6에서와 같은 코드로 작성하고 실행하면 컴파일 에러가 발생한다.
이것때문에 삽질을 얼마나..-_-;;
 
예제 -
 
CString str = L"http://www.codeguru.com/Cpp/Cpp/algorithms/checksum/article.php/c2043";
ShellExecute(NULL, _T("open"), str, NULL, NULL, SW_MAXIMIZE );
 
- 예제 끝
 
이렇게 번거롭더라도 _T와 L을 이용하여 코딩해 줘야 에러가 안나더라..흐흑
VS2005에 국한된 이야기가 아니다.
CFileStatus의 m_attribute enum은 아래와 같이 구성되어 있다.
 
enuenum Attribute {
   normal =    0x00,
   readOnly =  0x01,
   hidden =    0x02,
   system =    0x04,
   volume =    0x08,
   directory = 0x10,
   archive =   0x20
};
 
따라서 다음과 같이 파일인지 디렉토리인지 구분할 수 있다.
 
 
CFileStatus fileStatus;
-생략-
if(fileStatus.m_attribute & 0x10)
  디렉토리일 경우
else
  파일일 경우
 
만일 CFileFind 클래스를 사용할 수 있다면 IsDirectory()함수를 사용할 수 있다.
  1. Favicon of http://2010.pe.kr/ BlogIcon 세바스챤 2008.03.11 15:26 신고

    감사합니다 ^o^

  2. Favicon of http://www.specialguy.net BlogIcon 체리 2008.03.12 15:06 신고

    허접한 내용에 감사하다고 해주시니 제가 더 감사합니다 :)

+ Recent posts