레이블이 context-menu인 게시물을 표시합니다. 모든 게시물 표시
레이블이 context-menu인 게시물을 표시합니다. 모든 게시물 표시

2009년 6월 24일 수요일

notepad2 컴파일 삽질기 부록#5 : context-menu 통합 및 수정 (#1, #2 통합)

구차니님께서 수고해주신 덕분에 context 메뉴(오른쪽 버튼 클릭 메뉴)를 통해 Notepad2를 사용할 수 있었다.
(삽질기 부록#1 : context-menu 추가 및 삽질기 부록#2 : context-menu 추가 업그레이드 참조)

그런데, Notepad2 3.1.21 정식버전에서는 이 수정을 미묘하게 바꿔야 했으며, okto님의 수정요청도 받아들여 수정한 것도 있어 전체를 통합한 수정방법을 포스팅한다.
(File 메뉴에서 context-menu 관련 체크박스 2개가 동시에 체크되지 않도록 수정)


삽질기 1~3을 모두 적용했다고 가정하고 시작함.

수정 대상파일은 resource.h, Notepad2.rc, Notepad2.c의 3개이며, 모두 src 폴더에 저장되어 있다.


1. resource.h

다음 두 줄을 추가한다.
#define IDM_REGISTRY_UNKNOWN            40690
#define IDM_REGISTRY_ALL                40691


2. Notepad2.rc

IDR_MAINWND MENU DISCARDABLE에서 아래 내용을 찾는다.
MENUITEM "Propert&ies...",              IDM_FILE_PROPERTIES
MENUITEM "Create &Desktop Link",        IDM_FILE_CREATELINK
MENUITEM SEPARATOR
POPUP "&Favorites"
BEGIN
    MENUITEM "&Open Favorites...\tAlt+I",   IDM_FILE_OPENFAV
    MENUITEM "&Add Current File...\tAlt+K", IDM_FILE_ADDTOFAV
    MENUITEM "&Manage...\tF9",              IDM_FILE_MANAGEFAV
END
이 부분을 아래와 같이 수정한다.
MENUITEM "Propert&ies...",              IDM_FILE_PROPERTIES
MENUITEM SEPARATOR
MENUITEM "Create &Desktop Link",        IDM_FILE_CREATELINK
MENUITEM "Add context-menu to all file type", IDM_REGISTRY_ALL, CHECKED
MENUITEM "Add context-menu to unknown file type", IDM_REGISTRY_UNKNOWN, CHECKED
MENUITEM SEPARATOR
POPUP "&Favorites"
BEGIN
    MENUITEM "&Open Favorites...\tAlt+I",   IDM_FILE_OPENFAV
    MENUITEM "&Add Current File...\tAlt+K", IDM_FILE_ADDTOFAV
    MENUITEM "&Manage...\tF9",              IDM_FILE_MANAGEFAV
END

구분자 하나와 context-menu에 관련된 두 줄을 추가하는 내용임.


3. Notepad2.h

새로운 함수 하나를 추가한다.
void CheckRegistry();


4. Notepad2.c

파일 앞부분의 변수 선언부에 다음 내용을 추가한다.
BOOL      bRegistryUnknownType;
BOOL      bRegistryAllType;


다음, LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)에서 아래 내용을 찾는다.
case WM_COMMAND:
  return MsgCommand(hwnd,wParam,lParam);
여기에 아래와 같이 한 줄을 추가한다.
case WM_COMMAND:
  CheckRegistry();
  return MsgCommand(hwnd,wParam,lParam);


다음, void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam)에서 아래 내용을 찾는다.
EnableCmd(hmenu,IDM_EDIT_SELTONEXT,i);
EnableCmd(hmenu,IDM_EDIT_SELTOPREV,i && lstrlenA(efrData.szFind));
EnableCmd(hmenu,IDM_EDIT_REPLACE,i /*&& !bReadOnly*/);

CheckCmd(hmenu,IDM_VIEW_USE2NDDEFAULT,Style_GetUse2ndDefault(hwndEdit));
이 부분을 아래와 같이 수정한다. 2줄을 추가하는 것이다.
EnableCmd(hmenu,IDM_EDIT_SELTONEXT,i);
EnableCmd(hmenu,IDM_EDIT_SELTOPREV,i && lstrlenA(efrData.szFind));
EnableCmd(hmenu,IDM_EDIT_REPLACE,i /*&& !bReadOnly*/);

CheckCmd(hmenu,IDM_REGISTRY_UNKNOWN,bRegistryUnknownType);
CheckCmd(hmenu,IDM_REGISTRY_ALL,bRegistryAllType);

CheckCmd(hmenu,IDM_VIEW_USE2NDDEFAULT,Style_GetUse2ndDefault(hwndEdit));


다음은 LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)의 수정이다.
이 함수는 전체가 하나의 switch-case 문으로 되어있는데, 이 case 중에 IDM_REGISTRY_ALL, IDM_REGISTRY_UNKNOWN 둘을 추가한다.
case IDM_REGISTRY_ALL:
// Register registry - type unknown
if (bRegistryAllType)
{
//WinNT requires the key to have no subkeys
RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2\\command");
RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2");
}
else
{
HKEY key1;
LONG res = RegCreateKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2",&key1);
if (res == ERROR_SUCCESS)
{
WCHAR cmd[] = L"Open with &notepad2";
RegSetValue(key1, NULL, REG_SZ, cmd, wcslen(cmd));
}
RegCloseKey(key1);

  res = RegCreateKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2\\command",&key1);
if (res == ERROR_SUCCESS)
{
WCHAR cmd[MAX_PATH + 4];
WCHAR path[MAX_PATH];
int len;
GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
len = wsprintf(cmd, L"%s %%1", path);
RegSetValue(key1, NULL, REG_SZ, cmd, len);
}
RegCloseKey(key1);

if (bRegistryUnknownType)
{
//WinNT requires the key to have no subkeys
RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2\\command");
RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2");
bRegistryUnknownType = FALSE;
}

}
bRegistryAllType = !bRegistryAllType;
break;

case IDM_REGISTRY_UNKNOWN:
// Register registry - type all
if (bRegistryUnknownType)
{
//WinNT requires the key to have no subkeys
RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2\\command");
RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2");
}
else
{
HKEY key1;
LONG res = RegCreateKey(HKEY_CLASSES_ROOT,L"Unknown\\shell\\Open with notepad2",&key1);
if (res == ERROR_SUCCESS)
{
WCHAR cmd[] = L"Open with &notepad2";
RegSetValue(key1, NULL, REG_SZ, cmd, wcslen(cmd));
}
RegCloseKey(key1);

res = RegCreateKey(HKEY_CLASSES_ROOT,L"Unknown\\shell\\Open with notepad2\\command",&key1);
if (res == ERROR_SUCCESS)
{
WCHAR cmd[MAX_PATH + 4];
WCHAR path[MAX_PATH];
int len;
GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
len = wsprintf(cmd, L"%s %%1", path);
RegSetValue(key1, NULL, REG_SZ, cmd, len);
}
RegCloseKey(key1);
if (bRegistryAllType)
{
//WinNT requires the key to have no subkeys
RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2\\command");
RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2");
bRegistryAllType = FALSE;
}

}
bRegistryUnknownType = !bRegistryUnknownType;
break;


마지막으로 함수를 하나 추가한다.
void CheckRegistry()
{
    HKEY key;
    LONG res;

    res = RegOpenKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2",&key);
    if(res == ERROR_SUCCESS)
            bRegistryAllType = TRUE;
    else    bRegistryAllType = FALSE;
    RegCloseKey(key);

    res = RegOpenKey(HKEY_CLASSES_ROOT,L"unknown\\shell\\Open with notepad2",&key);
    if(res == ERROR_SUCCESS)
            bRegistryUnknownType = TRUE;
    else    bRegistryUnknownType = FALSE;
    RegCloseKey(key);
}

이렇게 수정하면 아래처럼 File 메뉴에서 context-menu 관련 기능을 사용할 수 있다.

사용자 삽입 이미지

두 개의 context-menu중 하나만 선택되도록 수정했음. ^^;


2008년 12월 30일 화요일

notepad2 컴파일 삽질기 부록#2 : context-menu 추가 업그레이드

구차니님께서 context-menu기능을 수정하신 내용을 notepad2 컴파일 삽질기 부록: context-menu 추가에 포스팅했습니다.
그런데, 수정 이후에 두 가지 내용을 수정하게되어 수정내용을 포스팅합니다.
수정된 내용은 아래와 같습니다.

흔쾌히 코드를 수정해주신 구차니님께 감사드립니다.

  1. 레지스트리 키 이름이 바로 메뉴에 뜨지 않고 별도의 문자열이 뜨도록 수정
  2. context-menu 등록여부를 ini파일이 아니라 레지스트리에서 직접 확인

코드를 수정하는 절차는 아래와 같습니다.
수정 대상 파일은 Notepad2.h, Notepad2.c 두 개입니다.

반드시 notepad2 컴파일 삽질기 부록 : context-menu 추가대로 수정한 후에 수정해야합니다.


1. Notepad2.h

새로운 함수 하나를 추가합니다.
void CheckRegistry();



2. Notepad2.c

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)에서 아래 내용을 찾습니다.
case WM_COMMAND:
  return MsgCommand(hwnd,wParam,lParam);
여기에 아래와 같이 한 줄을 추가합니다.
case WM_COMMAND:
  CheckRegistry();
  return MsgCommand(hwnd,wParam,lParam);



다음으로, LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)에서 아래 내용을 찾습니다. (notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 부분입니다)
case IDM_REGISTRY_ALL:
// Register registry - type unknown
if (bRegistryAllType)
{
  //WinNT requires the key to have no subkeys
  RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2\\command");
  RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2");
}
else
{
  HKEY key1;
  LONG res = RegCreateKey(HKEY_CLASSES_ROOT,
      L"*\\shell\\Open with notepad2\\command",
      &key1);
  if (res == ERROR_SUCCESS)
  {
      WCHAR cmd[MAX_PATH + 4];
      WCHAR path[MAX_PATH];
      int len;
      GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
      len = wsprintf(cmd, L"%s %%1", path);
      RegSetValue(key1, NULL, REG_SZ, cmd, len);
  }
}       
bRegistryAllType = (bRegistryAllType) ? FALSE : TRUE;
break;

case IDM_REGISTRY_UNKNOWN:
// Register registry - type all
if (bRegistryUnknownType)
{
  //WinNT requires the key to have no subkeys
  RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2\\command");
  RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2");
}
else
{
  HKEY key1;
  LONG res = RegCreateKey(HKEY_CLASSES_ROOT,
      L"Unknown\\shell\\Open with notepad2\\command",
      &key1);
  if (res == ERROR_SUCCESS)
  {
      WCHAR cmd[MAX_PATH + 4];
      WCHAR path[MAX_PATH];
      int len;
      GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
      len = wsprintf(cmd, L"%s %%1", path);
      RegSetValue(key1, NULL, REG_SZ, cmd, len);
  }
}
bRegistryUnknownType = (bRegistryUnknownType) ? FALSE : TRUE;
break;
이 내용을 아래와 같이 수정합니다.
case IDM_REGISTRY_ALL:
// Register registry - type unknown
if (bRegistryAllType)
{
  //WinNT requires the key to have no subkeys
  RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2\\command");
  RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2");
}
else
{
  HKEY key1;
    LONG res = RegCreateKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2",&key1);
  if (res == ERROR_SUCCESS)
    {
    WCHAR cmd[] = L"Open with &notepad2";
    RegSetValue(key1, NULL, REG_SZ, cmd, wcslen(cmd));
  }
    RegCloseKey(key1);

  res = RegCreateKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2\\command",&key1);
  if (res == ERROR_SUCCESS)
  {
    WCHAR cmd[MAX_PATH + 4];
      WCHAR path[MAX_PATH];
        int len;
        GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
    len = wsprintf(cmd, L"%s %%1", path);
    RegSetValue(key1, NULL, REG_SZ, cmd, len);
  }
    RegCloseKey(key1);
}       
bRegistryAllType = (bRegistryAllType) ? FALSE : TRUE;
break;

case IDM_REGISTRY_UNKNOWN:
// Register registry - type all
if (bRegistryUnknownType)
{
  //WinNT requires the key to have no subkeys
  RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2\\command");
  RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2");
}
else
{
  HKEY key1;
    LONG res = RegCreateKey(HKEY_CLASSES_ROOT,L"Unknown\\shell\\Open with notepad2",&key1);
  if (res == ERROR_SUCCESS)
  {
    WCHAR cmd[] = L"Open with &notepad2";
    RegSetValue(key1, NULL, REG_SZ, cmd, wcslen(cmd));
  }
  RegCloseKey(key1);

  res = RegCreateKey(HKEY_CLASSES_ROOT,L"Unknown\\shell\\Open with notepad2\\command",&key1);
  if (res == ERROR_SUCCESS)
  {
    WCHAR cmd[MAX_PATH + 4];
        WCHAR path[MAX_PATH];
        int len;
        GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
    len = wsprintf(cmd, L"%s %%1", path);
    RegSetValue(key1, NULL, REG_SZ, cmd, len);
  }
    RegCloseKey(key1);
}
bRegistryUnknownType = (bRegistryUnknownType) ? FALSE : TRUE;
break;



다음은 LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) 함수를 수정합니다.
아래 내용을 찾아 삭제합니다. (이 부분 역시 notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 곳입니다)
case IDM_REGISTRY_UNKNOWN:
// Register registry - type unknown
break;

case IDM_REGISTRY_ALL:
// Register registry - type all
break;



다음으로 void LoadSettings() 함수를 수정합니다.
아래 내용을 찾아 삭제합니다.(이 부분도 notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 곳입니다)
bRegistryUnknownType = IniSectionGetInt(pIniSection,L"RegistryUnknownType",0);
if (bRegistryUnknownType) bRegistryUnknownType = 1;

bRegistryAllType = IniSectionGetInt(pIniSection,L"RegistryAllType",0);
if (bRegistryAllType) bRegistryAllType = 1;



다음으로 void SaveSettings(BOOL bSaveSettingsNow) 함수를 수정합니다.
아래 내용을 찾아 삭제합니다.(이 부분도 notepad2 컴파일 삽질기 부록 : context-menu 추가에서 수정한 곳입니다)
IniSectionSetInt(pIniSection,L"RegistryUnknownType",bRegistryUnknownType);
IniSectionSetInt(pIniSection,L"RegistryAllType",bRegistryAllType);



마지막으로 함수를 하나 추가합니다.
void CheckRegistry()
{
    HKEY key;
    LONG res;

    res = RegOpenKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2",&key);
    if(res == ERROR_SUCCESS)
            bRegistryAllType = TRUE;
    else    bRegistryAllType = FALSE;
    RegCloseKey(key);

    res = RegOpenKey(HKEY_CLASSES_ROOT,L"unknown\\shell\\Open with notepad2",&key);
    if(res == ERROR_SUCCESS)
            bRegistryUnknownType = TRUE;
    else    bRegistryUnknownType = FALSE;
    RegCloseKey(key);
}


수정된 결과는 아래와 같습니다.
(한글화를 위해 메뉴 내용을 한글로 수정했습니다)

사용자 삽입 이미지


2008년 12월 29일 월요일

notepad2 컴파일 삽질기 부록#1 : context-menu 추가


나름 열심히 뜯어고친 Notepad2를 잘 쓰고 있었는데, 구차니님께서 소스 일부를 수정하셨습니다.
context-menu(마우스 오른쪽 버튼 클릭시 뜨는 메뉴)에 Notepad2를 손쉽게 등록할 수 있도록 수정해주셨는데, 수정 방법을 간략하게만 포스팅하셨더군요.

이왕 연재한 것이라 이 내용까지 포스팅하겠습니다.
삽질기 1~4를 모두 적용했다고 가정하고 시작합니다.

수정 대상파일은 resource.h, Notepad2.rc, Notepad2.c의 3개이며, 모두 src 폴더에 저장되어 있습니다.


1. resource.h

다음 두 줄을 추가합니다.
#define IDM_REGISTRY_UNKNOWN            40226
#define IDM_REGISTRY_ALL                40227


그리고, 아래 내용을 찾습니다.
#define _APS_NEXT_COMMAND_VALUE         40226
이 코드를 아래와 같이 수정합니다.
#define _APS_NEXT_COMMAND_VALUE         40228
resource.h 파일은 두 부분으로 나뉘는 모습인데, 앞의 두 줄은 앞부분에 삽입하면 됩니다.


2. Notepad2.rc

IDR_MAINWND MENU DISCARDABLE에서 아래 내용을 찾습니다.
MENUITEM "Propert&ies...",              IDM_FILE_PROPERTIES
MENUITEM "Create &Desktop Link",        IDM_FILE_CREATELINK
MENUITEM SEPARATOR
POPUP "&Favorites"
BEGIN
    MENUITEM "&Open Favorites...\tAlt+I",   IDM_FILE_OPENFAV
    MENUITEM "&Add Current File...\tAlt+K", IDM_FILE_ADDTOFAV
    MENUITEM "&Manage...\tF9",              IDM_FILE_MANAGEFAV
END
이 부분을 아래와 같이 수정합니다.
MENUITEM "Propert&ies...",              IDM_FILE_PROPERTIES
MENUITEM SEPARATOR
MENUITEM "Create &Desktop Link",        IDM_FILE_CREATELINK
MENUITEM "Add context-menu to all file type", IDM_REGISTRY_ALL
, CHECKED
MENUITEM "Add context-menu to unknown file type",
                                        IDM_REGISTRY_UNKNOWN
, CHECKED
MENUITEM SEPARATOR
POPUP "&Favorites"
BEGIN
    MENUITEM "&Open Favorites...\tAlt+I",   IDM_FILE_OPENFAV
    MENUITEM "&Add Current File...\tAlt+K", IDM_FILE_ADDTOFAV
    MENUITEM "&Manage...\tF9",              IDM_FILE_MANAGEFAV
END

구분자 하나와 context-menu에 관련된 두 줄을 추가하는 내용입니다.


3. Notepad2.c

파일 앞부분의 변수 선언부에 다음 내용을 추가합니다.
BOOL      bRegistryUnknownType;
BOOL      bRegistryAllType;


다음, void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam)에서 아래 내용을 찾습니다.
EnableCmd(hmenu,IDM_EDIT_SELTONEXT,i);
EnableCmd(hmenu,IDM_EDIT_SELTOPREV,i && lstrlenA(efrData.szFind));
EnableCmd(hmenu,IDM_EDIT_REPLACE,i /*&& !bReadOnly*/);

CheckCmd(hmenu,IDM_VIEW_USE2NDDEFAULT,Style_GetUse2ndDefault(hwndEdit));
이 부분을 아래와 같이 수정합니다. 2줄을 추가하는 것입니다.
EnableCmd(hmenu,IDM_EDIT_SELTONEXT,i);
EnableCmd(hmenu,IDM_EDIT_SELTOPREV,i && lstrlenA(efrData.szFind));
EnableCmd(hmenu,IDM_EDIT_REPLACE,i /*&& !bReadOnly*/);

CheckCmd(hmenu,IDM_REGISTRY_UNKNOWN,bRegistryUnknownType);
CheckCmd(hmenu,IDM_REGISTRY_ALL,bRegistryAllType);

CheckCmd(hmenu,IDM_VIEW_USE2NDDEFAULT,Style_GetUse2ndDefault(hwndEdit));


다음은 LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam)의 수정입니다.
이 함수는 전체가 하나의 switch-case 문으로 되어있는데, 이 case 중에 IDM_REGISTRY_ALL, IDM_REGISTRY_UNKNOWN 둘을 추가합니다.
case IDM_REGISTRY_ALL:
    // Register registry - type unknown
      if (bRegistryAllType)
      {
         //WinNT requires the key to have no subkeys
          RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2\\command");
          RegDeleteKey(HKEY_CLASSES_ROOT, L"*\\shell\\Open with notepad2");
      }
      else
      {
          HKEY key1;
          LONG res = RegCreateKey(HKEY_CLASSES_ROOT,
              L"*\\shell\\Open with notepad2\\command",
              &key1);
          if (res == ERROR_SUCCESS)
          {
              WCHAR cmd[MAX_PATH + 4];
            WCHAR path[MAX_PATH];
            int len;
            GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
              len = wsprintf(cmd, L"%s %%1", path);
              RegSetValue(key1, NULL, REG_SZ, cmd, len);
          }
      }       
    bRegistryAllType = (bRegistryAllType) ? FALSE : TRUE;
    break;

case IDM_REGISTRY_UNKNOWN:
    // Register registry - type all
    if (bRegistryUnknownType)
      {
         //WinNT requires the key to have no subkeys
          RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2\\command");
          RegDeleteKey(HKEY_CLASSES_ROOT, L"Unknown\\shell\\Open with notepad2");
      }
      else
      {
          HKEY key1;
          LONG res = RegCreateKey(HKEY_CLASSES_ROOT,
              L"Unknown\\shell\\Open with notepad2\\command",
              &key1);
          if (res == ERROR_SUCCESS)
          {
              WCHAR cmd[MAX_PATH + 4];
            WCHAR path[MAX_PATH];
            int len;
            GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
              len = wsprintf(cmd, L"%s %%1", path);
              RegSetValue(key1, NULL, REG_SZ, cmd, len);
          }
      }
    bRegistryUnknownType = (bRegistryUnknownType) ? FALSE : TRUE;
    break;


다음은 LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam)의 수정입니다.
이 함수는 하나의 switch-case 문으로 되어있고, 각 case 내에 switch-case 문이 또 들어있는 구조입니다.
외부의 switch문인 switch(pnmh->idFrom)의 case 중에 IDM_REGISTRY_UNKNOWN, IDM_REGISTRY_ALL를 추가합니다.
case IDM_REGISTRY_UNKNOWN:
    // Register registry - type unknown
    break;

case IDM_REGISTRY_ALL:
    // Register registry - type all
    break;


다음은 void LoadSettings()의 수정입니다.
아래 내용을 찾습니다.
iPathNameFormat = IniSectionGetInt(pIniSection,L"PathNameFormat",0);
찾은 줄의 앞에 다음의 내용을 추가합니다. (앞의 내용을 삭제하면 안됩니다)
bRegistryUnknownType = IniSectionGetInt(pIniSection,L"RegistryUnknownType",0);
if (bRegistryUnknownType) bRegistryUnknownType = 1;

bRegistryAllType = IniSectionGetInt(pIniSection,L"RegistryAllType",0);
if (bRegistryAllType) bRegistryAllType = 1;


마지막으로 void SaveSettings(BOOL bSaveSettingsNow)를 수정합니다.
아래 내용을 찾습니다.
IniSectionSetInt(pIniSection,L"PathNameFormat",iPathNameFormat);
찾은 줄의 앞에 다음 2줄을 추가합니다. (이번에도 추가입니다)
IniSectionSetInt(pIniSection,L"RegistryUnknownType",bRegistryUnknownType);
IniSectionSetInt(pIniSection,L"RegistryAllType",bRegistryAllType);

수정을 완료하면 아래와 같은 모양을 볼 수 있습니다.

사용자 삽입 이미지

짜잔~~~~~~~~~