2010년 2월 9일 화요일

인스톨실드로 커스텀 다이얼로그 만들기

기본적으로 인스톨실드에서는 다양한 형태의 다이얼로그를 제공합니다.

SdWelcome, SdFinish 등등 여러가지가 있지만 이런 기본 형태의 윈도우가 아닌 즉 다양한 사용자

Input 이 필요한 경우에는 어쩔수 없이 다이얼로그(커스텀 다이얼로그 제작)를 직접 만들어 사용해야 합니다.

 

예전 버전 6.x, 7.x 버전의 인스톨실드는 vc 6.0 을 사용하여 리소스 작업후 _IsUser.dll 로 릴리즈하여

import  하는 방식으로 작업을 했습니다.

vc 작업에 능숙하지 않은 분들에게는 조금 어려웠죠.

 

최신 버전의 인스톨실드는 인스톨실드 내부에서 이작업을 지원합니다.

지원한지 이제는 벌써 꽤 되는거 같네요. (10.X 버전부터 지원을 했는지...)

차례대로 설명 드리겠습니다.

 

1> User Interface -> Dialogs -> All Dialogs -> New Dialog  를 실행합니다.

 

2>Dialog Template 에서 NewScriptBasedDialog 를 선택합니다.

 

 

 3>SdSample 로 다이얼로그 이름 변경 후 커스텀 다이얼로그에 사용할 컨트롤들을 다이얼로그에

올려 놓습니다.

다이얼로그의 고유 Resource Identifier 를 12345 로 변경합니다.

예제 다이얼로그에 사용할 컨트롤 세가지  Edit, Combo, Check 의 Resource Identifier 도 확인합니다.

 

4>스크립트 작업

이제 리소스에디터에서의 작업은 종료되었고, 스트립트 작업이 필요합니다.

SetUp.rul 파일의 Before Move Data -> OnFirstUIBefore 함수를 아래와 같이 수정합니다.

 

function OnFirstUIBefore()
    number  nResult,nCmdValue;
    string  szDialogName,szStr;  
    BOOL bDone,bCheck;
    HWND    hwndDlg,hwndItem;  
    LIST   liSampleID;
begin
 
   //커스텀 다이얼로그에 사용되는 컨트롤들의 ID 를 정의합니다.
   //이 값들은 User Interface -> Dialog 의 resource Identifier 와 동일합니다.
 
   #define RES_CUSTOM_DIALOG     12345   // 커스텀 다이얼로그 아이디
   #define RES_CUSTOM_CANCEL 9   //취소 버튼
   #define RES_CUSTOM_NEXT   1   // Next 버튼                    
   #define RES_CUSTOM_BACK 12    // BACK 버튼                    
   #define RES_CUSTOM_EDIT 1302    // 커스텀 Edit
   #define RES_CUSTOM_COMBO 1303   // 커스텀 Combo
   #define RES_CUSTOM_CHECKBOX 1304   // 커스텀 CheckBox        
 
   //커스텀 다이얼로그를 정의합니다.
    szDialogName = "CustomDialog";
    nResult = EzDefineDialog (szDialogName, "", "", RES_CUSTOM_DIALOG);
               
    if (nResult < 0) then

        //정의된 다이얼로그가 존재하지 않거나 기타 에러가 발생한 경우
        //에러창을 띄우고 인스톨을 종료합니다.
        MessageBox ("Error in defining dialog box", SEVERE);
        abort;

    endif;

   
    bDone = FALSE;
 
    //bDone 이 TRUE 가 될때까지 loop 를 수행합니다.

    repeat

        // loop 를 돌면서 사용자가 선택하는 다이얼로그 내의 컨트롤의 값들을 받아옵니다.
        //nCmdValue 는 컨트롤 ID 즉 resource Identifier 와 동일합니다.
       
        nCmdValue = WaitOnDialog(szDialogName);
           
        switch (nCmdValue)
           
            case DLG_ERR: //에러가 발생한 경우 인스톨을 종료합니다.

                MessageBox ("Unable to display dialog box. Setup canceled.", SEVERE);
                abort;
   
      case DLG_INIT: //다얼로그가 초기화되는 부분입니다.
                           // 다이얼로그 생성시 한번만 이벤트가 들어옵니다.
              
               //생성된 다이얼로그의 핸들을 받아옵니다.
               hwndDlg = CmdGetHwndDlg( szDialogName );
              
               //이 함수는 Sdint.h   에 정의된 함수입니다.
               //Sdint.h \isrt\include\. 에 위치합니다.
               //Sdint.rul 에 선언되어 있고 스크립트 다이얼로그용 유틸리티 함수들이 존재합니다.
                 //인스톨실드 라이브러리 자체에 포함되어 있고 사용자가 직접 액세스 할수는 없습니다.
                 SdGeneralInit( szDialogName, hwndDlg, STYLE_BOLD, szSdProduct );
      
        //RES_CUSTOM_EDIT 의 값을 testedit 로 설정합니다.
        CtrlSetText ( szDialogName, RES_CUSTOM_EDIT, "testedit");
        
        //콤보 박스에 사용할 리스트를 생성합니다.
                liSampleID = ListCreate (STRINGLIST);
          
          if (liSampleID = LIST_NULL) then
           MessageBox ("Unable to create list.", SEVERE);
           abort;
     
       else
         //abc를  리스트에  추가합니다.
      if (ListAddString (liSampleID, "abc" , AFTER) < 0) then
            MessageBox ("ListAddString failed.", INFORMATION);
          endif;
   
        //def를 리스트에  추가합니다.
     if (ListAddString (liSampleID, "def" , AFTER) < 0) then
            MessageBox ("ListAddString failed.", INFORMATION);
        endif;
       endif;
     
       //리스트를 RES_CUSTOM_COMBO 에 설정합니다.
     CtrlSetList (szDialogName, RES_CUSTOM_COMBO, liSampleID);
     //사용된 리스트는 제거합니다.
                ListDestroy (liSampleID);
                                 
                //최초 다이얼로그가 뜰때  def에  값이 선택되도록 합니다.
                CtrlSetCurSel (szDialogName, RES_CUSTOM_COMBO,"def"

 

5>정상적으로 컴파일 및 빌드후 실행을 하게 되면 아래와 같은 커스텀 다이얼로그가 보이게 됩니다.

댓글 없음:

댓글 쓰기