2010년 6월 1일 화요일

FCKeditor java 버전 설치 하기

FCKeditor java 버전 설치
- 환경
O/S : Window XP Professional
Servlet Engine : Tomcat 5.0.28
Character Set : UTF-8
IDE Tool : Eclipse 3.2
FCKEditor Version : 2.3.1( http://prdownloads.sourceforge.net/fckeditor/FCKeditor_2.3.1.zip?download )FCKEditor.Java Version 2.3
( http://sourceforge.net/project/showfiles.php?group_id=75348&package_id=129511 )
1. editor 폴더를 생성하고 톰캣 컨텍스트의 루트를 editor 폴더 경로로 지정
2. fckeditor 다운로드
2-1. http://www.fckeditor.net/download/ 에서 다운로드
2-2. editor 폴더에 다운로드 된 압축 파일의 압축을 풉니다.
2-3. 압축을 풀면 나오는 디렉토리인 FCKeditor 폴더를 editor 하위 폴더로 되게끔 이동합니다.


3. 톰캣을 가동한 후 FCKeditor\_samples\default.html 을 실행하여 fckeditor 를 실행


4. 그러나 이미지 업로드를 할려고 서버 보기를 할 경우 에러가 발생합니다.


5. java 버전용 fckeditor 를 editor 폴더로 다운로드(FCKeditor-2.3.zip)
5-1. http://sourceforge.net/project/showfiles.php?group_id=75348&package_id=129511 에서 다운로드
5-2. editor 폴더에 다운로드 된 압축 파일의 압축을 풉니다.


6. 지정폴더\editor\FCKeditor-2.3\web 하위에 있는
_samples 폴더와 WEB-INF 폴더를 각각 이동.
6-1. 2번에서 만들어진 \editor\FCKeditor\_samples 폴더에
\editor\FCKeditor-2.3\web\_samples 폴더를 붙여넣기 합니다.
6-2.  \editor\WEB-INF 폴더에 \editor\FCKeditor-2.3\web\WEB-INF 폴더를 붙여넣기 합니다.


* 새로운 컨텍스트라면 web.xml 을 그대로 덮어씌운 후 복사하고,
기존에 컨텍스트에 다른 체계가 돌아가 있다면 web.xml 내용 중 <web-app> 부분을
기존 사용중인 컨텍스트에 web.xml 에 붙여넣기 합니다.
( load-on-startup 이 이미 있다면 숫자를 변경함 )

완료하면 폴더 구조는 다음과 같습니다.
( UserFiles 디렉토리는 사용자가 업로드한 이미지 저장 디렉토리입니다. )


* 톰캣 리스타트시에 콘솔 창에 다음과 같이 업로드 제한 파일 확장자 리스트가 나옵니다.
( web.xml 파일에 DeniedExtensionsFile 이란 param-name 으로 지정되어 있습니다. )


7. jsp 샘플을 실행
그러나 다음과 같이 fckeditor.html 파일을 찾을수 없다는 메시지가 뜹니다.


\editor\FCKeditor\_samples\jsp\sample01.jsp 내용을 보면
oFCKeditor.setBasePath( "/FCKeditor/" ) ;
위와 같은 부분이 있습니다.


컨텍스트의 루트 폴더가 FCKeditor 이라면 에러 없이 수행되었겠지만
루트가 editor 폴더로 지정되어 있으므로
oFCKeditor.setBasePath( "/editor/FCKeditor/" ) ;
위처럼 수정해주면 제대로 수행되는 것을 확인할수 있습니다.


7-3. 이미지 버튼을 눌러서 서버보기를 눌러보지만 4. 처럼 스크립트 오류가 발생합니다.


8. sample02.jsp 의 태그 라이브러리를 이용한 파일 브라우저 경로 수정
8-1. \editor\FCKeditor\_samples\jsp\sample02.jsp 를 보면 7. 처럼 fckeditor.html 을 찾을수 없다는 메시지가 뜹니다.
<FCK:editor id="EditorDefault" basePath="/FCKeditor/"
위 부분에서 basePath 를 현재 테스트 경로에 맞게끔
<FCK:editor id="EditorDefault" basePath="/editor/FCKeditor/" 로 수정 후 sample02.jsp 를 수정하면
에디터는 잘 나오나 역시 이미지 뷰어나 업로드 부분은 작동하지 않습니다.

sample02.jsp 에선 다음과 같이 브라우저 URL 과 업로드 URL 을 정의한 부분을 볼수 있습니다.
imageBrowserURL="/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector"
linkBrowserURL="/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=connectors/jsp/connector"
flashBrowserURL="/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/jsp/connector"
imageUploadURL="/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Image"
linkUploadURL="/FCKeditor/editor/filemanager/upload/simpleuploader?Type=File"
flashUploadURL="/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Flash"


editor 폴더 하위에 FCKeditor 폴더가 위치한 구조이니 /FCKeditor/editor... 부분 앞에
/editor/FCKeditor/editor... 형식으로 수정하고,


web.xml 의
<servlet-mapping>
 <servlet-name>Connector</servlet-name>
 <url-pattern>/editor/filemanager/browser/default/connectors/jsp/connector</url-pattern>
</servlet-mapping>
<servlet-mapping>
 <servlet-name>SimpleUploader</servlet-name>
 <url-pattern>/editor/filemanager/upload/simpleuploader</url-pattern>
</servlet-mapping> 


위 url-pattern 경로대로 Connector 부분과 UploadURL 을 현재 경로를 예를 들어 재구성하자면
다음과 같이 수정하여 sample02.jsp 을 작성하면 됩니다.
imageBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
linkBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
flashBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
imageUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=Image"
linkUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=File"
flashUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=Flash"


위 URL은 web.xml 의 url-pattern 과 매핑된다는 점을 이해하셔야 합니다.
이런 특징을 통하여 경로를 판별할수 있습니다.


8-2. 이미지링크,플래쉬 브라우저 및 업로드가 제대로 동작하지 않을 경우...

8-2-1. browser.html 파일의 경로가 틀렸을 경우
basePath 만 수정한 후 위 8-1. 에서처럼 경로를 수정하지 않을 경우
다음과 같은 화면을 볼수 있습니다.


8-2-2. Connector 부분의 경로가 틀릴 경우
Connector 의 경로는 수정하지 않은채 browser.html 의 경로만 옳바르게 설정할 경우
다음과 같은 화면을 볼수 있습니다.


* Connector 의 경로는 web.xml 의 Connector 의 url-pattern 과 관련이 되어있습니다.
8-1. 에서 보신 web.xml 처럼 /editor/filemanager/browser/default/connectors/jsp/connector 으로
지정되어 있따면 Connector 의 주소는
http://서버url/컨텍스트명/editor/filemanager/browser/default/connectors/jsp/connector 이 됩니다.



위 화면처럼 파일을 찾을수 없다는 화면이 아닌 다른 화면이 나오게 되면 맞는 경로이므로
Connector 부분은 http://서버url/ 을 제외한 나머지 주소를 기술하면 됩니다.
( 8-1. 의 Connector 주소 설정 참조 )


* 옳바른 주소 설정에도 불구하고 위 화면에서처럼 Connector 을 브라우저에서 실행했을 때
다른 에러가 발생한다면 XML 을 생성하는 xalan 콤포넌트가 존재하는지 의심해봐야 합니다.


왜 에러가 발생하는지 보기 위한 테스트URL)
http://서버url/컨텍스트명/editor/filemanager/browser/default/connectors/jsp/connector?Command=GetFoldersAndFiles&Type=Image&CurrentPath=/


위 화면에서처럼
javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found
에러가 발생한다면 Xerces-J-tools의 xalan.jar 를(http://www.apache.org/dist/xml/xerces-j/)

찾아 다운로드 하여 \WEB-INF\lib 폴더에 넣은 후 톰캣 재가동후 새로운 브라우저에서
테스트 URL 을 확인해보면 다음과 같이 에러 없이 XML 화면이 나오는 것을 확인할수 있습니다.


8-2-3. 업로드 URL 의 확인
Connector 와 마찬가지로 web.xml 의 SimpleUploader 의 url-pattern 의 영향을 받습니다.
위 web.xml 에선 url-pattern 이 /editor/filemanager/upload/simpleuploader 이므로
테스트 URL)
http://서버url/컨텍스트명/editor/filemanager/upload/simpleuploader 을 쳤을 경우 다음과 같은 화면이 나와야 정상입니다.


위 결과대로 나온다면 image,link,flash UploadUrl 을 설정하면 됩니다.( 8-1. 의 각 UploadUrl 확인 )


9. 테스트
이미지를 업로드하고, 목록에 정상적으로 출력된다면 모든 설치가 성공적으로 완료된 것입니다.


10. 샘플이 아닌 기존 체계에 fckeditor 를 적용할 경우.
태그 라이브러리 사용을 위한
<%@ taglib uri="http://fckeditor.net/tags-fckeditor" prefix="FCK" %> 를 페이지 상단에 삽입 하고,
<TEXTAREA></TEXTAREA> 부분에 sample02.jsp 의 <FCK:editor ~ </FCK:editor> 부분을 복사하여 붙여넣기 합니다.
기본 sample02.jsp 에는 <FCK:editor id="EditorDefault" 처럼 id 가 EditorDefault 로 되어있는데
만약 <TEXTAREA name = "contents" 와 같이 name 이 contents 였다면
<FCK:editor id="contents" 로 지정하면 받는 부분에서 contents 로 받을 수 있습니다.


예)
- \editor\board\create_form.jsp(UTF-8 로 작성)

<%@ taglib uri="http://fckeditor.net/tags-fckeditor" prefix="FCK" %>

<%@ page contentType = "text/html;charset=utf-8" %>
<HTML>
<HEAD>
<TITLE>글 입력 폼</TITLE>
<META http-equiv = "Content-Type" content = "text/html;charset=utf-8" />
<SCRIPT>
 function send()
 {
  create_form.submit();
 }
</SCRIPT>
</HEAD>
<BODY>
<FORM name = "create_form" method = "post" action = "./create.jsp">
 <FCK:editor id="contents" basePath="/editor/FCKeditor/"
  imageBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
  linkBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
  flashBrowserURL="/editor/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&Connector=/editor/editor/filemanager/browser/default/connectors/jsp/connector"
  imageUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=Image"
  linkUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=File"
  flashUploadURL="/editor/editor/filemanager/upload/simpleuploader?Type=Flash">
  This is some <strong>sample text</strong>. You are using <a href="http://www.fredck.com/fckeditor/">FCKeditor</a>.
 </FCK:editor>
</FORM>
<INPUT type = "button" onClick = "return send()" value = "전송">
</BODY>
</HTML>


- \editor\board\create.jsp(UTF-8 로 작성)

<%@ page contentType = "text/html;charset=utf-8" %>
<%
 String contents = request.getParameter("contents");

 contents = new String(contents.getBytes("8859_1"), "UTF-8");
%>
<HTML>
<HEAD>
<TITLE></TITLE>
<META http-equiv = "Content-Type" content = "text/html;charset=utf-8" />
</HEAD>
<BODY>
<%= contents %>
</BODY>
</HTML>


11. 몇가지 Tip.
11-1. 공백 값 입력을 방지하기 위해선 스크립트를 다음과 같이 수정합니다.

/**
 * 데이터 전송전 체크
 */
function send()
{
 var oEditor = FCKeditorAPI.GetInstance('contents') ;

 var div = document.createElement("DIV");
 
 div.innerHTML = oEditor.GetXHTML();

 if( isNull( div.innerText ) )
 {
  alert("내용을 입력하세요."); 
  oEditor.Focus();
  return false; 
 }

 create_form.submit();
}

/**
 * 정규표현식을 이용한 공백 체크
 */
function isNull( text ) 

 if( text == null ) return true; 

 var result = text.replace(/(^\s*)|(\s*$)/g, ""); 

 if( result ) 
  return false; 
 else 
  return true; 
}



11-2. 페이지 로딩시 바로 포커스를 주고 싶다면
\editor\FCKeditor\fckconfig.js 의 FCKConfig.StartupFocus 의 값을 true 로 변경하거나

태그라이브러리 옵션으로 startupFocus="true" 를 설정합니다.


11-3. 읽기 전용으로 변환하고 싶다면

var oEditor = FCKeditorAPI.GetInstance('contents') ;
oEditor.EditorDocument.body.contentEditable = false;
oEditor.EditorDocument.body.unselectable = true;


11-4. 기타 환경 설정은 fckconfig.js 파일을 참조하고 아래 사이트를 참조하시기 바랍니다.
http://sourceforge.net/forum/forum.php?forum_id=257180 ( fckeditor help 포럼 )
http://java.lin4u.com/my/index.php?category=&keyfield=title&keyword=fck&favorite ( 폰트 관련 참조 )
http://wiki.fckeditor.net/ ( fckeditor 위키 사이트 )

http://www.ghlab.com/blog/fckeditor/editor.zip ( 위 샘플들을 테스트한 컨텍스트 모든 파일들 )

FCKeditor

 

Styles

http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/Configuration/Styles

Templates

http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/Configuration/Templates

참고

  • Form이 submit되어 서블릿쪽으로 값을 넘길 때는 등록하거나 수정한 내용이 적용 되지만, validatorUtil.js를 이용해서 입력폼을 검증시에 직접 에디터의 내용을 가져오지는 못하는 것 같다. 이때는 에디터를 페이지에 삽입했을 때 다음과 같이 들어가는 것을 이용해서 직접 히든 필드에 에디터의 값을 할당하고 검증한다.

 

  1. <td>코드명 </td><td>$editor.get("cd_nm", "$!cd_nm")</td>

이 VTL 코드는 다음과 같은 HTML로 파싱된다.

  1. <td>코드명 </td><td><div><input value="" type="hidden" name="cd_nm" id="cd_nm" /><input value="CustomConfigurationsPath=%2Feditor%2Fconfig.js" type="hidden" id="cd_nm___Config" /><iframe frameborder="0" width="780" height="200" scrolling="no" src="/editor/editor/fckeditor.html?InstanceName=cd_nm&amp;Toolbar=Custom" id="cd_nm___Frame"> </iframe></div></td>

 

검증 시는 다음과 같이 직접 히든 필드에 값을 입력하고 검증한다.

 

  1. function fn_update(){
  2. $("cd_nm").value = FCKeditorAPI.GetInstance ('cd_nm').GetXHTML(true);

  3. var val = new Validator($("formDetl"));

  4. if(!cfn_isEmpty("$!codeMgr.badWord")) {

  5. val.setBadWord("$!codeMgr.badWord");

  6. }

  7. ...

  8. val.addItem("cd_nm", "Y:maxByteLength=75:Y:코드명:");

  9. val.addItem("cd_nm", "Y:badword:Y:코드명:");

  10. ...

  • 에디터 밖에서 편집 모드 변경
  1. var oEditor = FCKeditorAPI.GetInstance('cd_nm') ;
  2. oEditor.SwitchEditMode(true) ;
  • 자바와 연동시 한글 파일 업로드 파일명 깨짐 방지

http://nextframe.jp/flash/matsnp/matsnp.html
fckeditor-java-core-2.4.1.jar
FCKeditor업로더창은 utf-8

2010년 5월 17일 월요일

resizeFullScreen

    function resizeFullScreen()
    {
        top.window.moveTo(0,0);
        if (document.all)
        {
            top.window.resizeTo(screen.availWidth,screen.availHeight);
        } else if (document.layers||document.getElementById) {
            if (top.window.outerHeight<screen.availHeight||top.window.outerWidth<screen.availWidth)
            {
                top.window.outerHeight = screen.availHeight;
                top.window.outerWidth = screen.availWidth;
            }
        }
    }

2010년 5월 7일 금요일

PSP 3005 커펌 방법

일단 PSP 3005 5.05이상이신분들은 커펌이 안니다.

 

5.03 이하이신분들은 5.03으로 업그레이드 해주세요

http://www.psp-hacks.com/file/1645 < 5.03 업데이트 다운

 

1. PSP 5.03 압축풀기

2. PSP 3005 USB에 연결

3. PSP 연결폴더 -> GAME -> UPDATE (없으면 만들기)

4. 1번에서 푼 파일들 중에 EBOOT.PBP 파일을 3번 UPDATE 에 넣기

5. USB 를 빼고 버젼을 확인

 

 

 

1. 받은 첵헨 압축파일 풀기

 

2. PSP 전원을 킨후 시스템설정 -> 문자집합 -> 맨위 US-latin 설정
(UMD 자동기능 과 캐시를 끄기로 하고 UMD충전 과 자동연결을 끄기로 한다 , 색공간을 표준으로 한다 , 테마를 클래식으로 바꾼다.)

 

3. USB를 PSP와 연결

 

4. Picture 에 있는 모든 사진을 없에기

 

5. 최상위(PSP 연결폴더)에 h.bin 을 복사 -> 붙여넣기

 

6. 그다음 칙헨 폴더에 있는 슬림파일을 열어주고 그안에 있는 칙헨 파일을 Picture에 넣어준다

 

7. USB를 뺀다

 

8. PSP에서 사진에 들어간다

 

9. 사진폴데에 들어간후 칙헨파일을 누르면 잠시후 갑자기 픽하면서 화면이 깨지면서 꺼지면 반커펌이 성공한것이다.

(성공한 경우 다시 PSP가 켜진다)

 

11. 커펌파일 (GEN-C) 압축을 푼다

 

12. 폴더가 많은데 가다가 맨끝 폴더에 EBOOT과 readme가 있을거다.

 

13. GEN-C 압축풀면 나오는 PSP 폴더 복사해준 후 USB를 연결한다

 

14. PSP를 연결한 폴더에 들어가서 최상위에 붙여넣기를 해준다.

 

15. USB를 빼준다

 

16. 메모리스틱에서 GEN-C를 실행 X를 눌러준다.

 

 

반벽돌 , 벽돌시 책임지지 않습니다 용자만 도전하세요 훗

 

3005는 완전커펌이 아닌 휘발성 커펌입니다. 배터리를 빼면 커펌이 날아갑니다. ( GEN-C 는 종료가 안됌 슬립모드만 됨 ㅋ )

 

5.03만 가능합니다.

 

http://popotz.textcube.com/1153 < ChickHen 입니다 이거 먼저 받고 밑에꺼 받으세용

http://popotz.textcube.com/1449 < GEN - C [FULLE] 을 받습니다.

 

 

2010년 4월 15일 목요일

전처리 구문에 대해

#define, #ifndef, #ifdef, #endif... 등등이 쓰이는 이유는

컴파일 하기 처리한다는 뜻이죠.

저 구문들을 먼저 처리한 뒤 컴파일이 이루어집니다.

 

이해를 돕도록 한 가지 예를 들겠습니다.

 

//  먼저 아무 의미 없어보이는 HELLO를 define했습니다.

#define HELLO

 

//  여기서 의미가 생기죠. 이 구문을 해석하면 "HELLO가 define이 되었다면.."입니다. 일반 if와 다르지 않습니다.

#ifdef HELLO

printf("Hello\n");

#else                 // 이건 HELLO가 define되지 않았다면..이 되겠죠

printf("Bye\n");

#endif                // end if 즉 if를 끝낸다...뭐 그런 뜻이죠

 

그럼 이 코드가 어떻게 되냐면..

printf("Hello\n");

이거 하나만 컴파일 됩니다.

 

만약에 printf("Bye\n");를 prif"Bye\n"); 이 따위로 써도 컴파일 시 에러가 안납니다.

 

그럼 왜 printf("Bye\n"); 같이 쓰지도 않을 코드를 써서 낭비하는가...

 

프로그램을 많이 짜다가 보면

어쩔 때는 printf("Hello\n");로 컴파일 해야하고

어쩔때는 printf("Bye\n");로 컴파일 해야할 때가 있습니다.

이게 한 줄이면 모르겠지만...

100줄 1000줄..이러면 일일이 컴파일 할 때마다 주석처리하기 엄청 짜증나겠죠.

이럴 때 #define HELLO만 살짝 손보면 컴파일 결과가 사사삭 바뀌니 엄청 편리합니다.

 

 

그럼 질문하신 부분중에

#ifndef TURBOC_HEADER

#define TURBOC_HEADER

 

ifndef는 if no define...if not define??? 뭐 그런겁니다.

그래서 TURBOC_HEADER가 define되지 않았다면 TURBOC_HEADER를 define해라...

뭐 그런겁니다.

 

이게 왜 필요하냐면..

프로젝트가 커질 수록 헤더파일을 여기 저기서 가져다 쓰게 됩니다.

그럼 컴파일시 같은 내용을 반복해서 컴파일 하게 되고 에러가 발생할 수도 있습니다.

질문하신 코드의 경우 #include문이 여러개 있는데 한번만 하면 될 일을 여러번 할 수도 있다는 겁니다.

분명히 에러의 소지도 있고요. (아주 쉬운 예로 전역변수를 헤더에 선언했다면 바로 에러나겠죠)

 

그래서 TURBOC_HEADER가 define되지 않았다면 define하고 헤더를 컴파일하고..

또 다른 곳에서 헤더를 컴파일 하려고 하면 이미 TURBOC_HEADER가 define 되었으니까

그냥 넘어가겠죠.

MFC같은 것을 할 때는 이런 구조가 기본적으로 생성됩니다. 그만큼 꼭 필요한 구조입니다.

 

#endif는 #ifndef와 쌍이고요..

 

출처: http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=68987639&qb=YysrIOunpO2BrOuhnOqwgCDrqLzqsIDsmpQ=&enc=utf8&section=kin&rank=1&sort=0&spq=0

2010년 4월 6일 화요일

[MFC] DoModal() 이란??

비주얼 C++에 다이얼로그는 두가지 종류가 있습니다.

 

한가지가 모달리스 다이얼로그이고...

또 다른 한가지가 모달 다이얼로그입니다.

 

이 두 다이얼로그의 차이는

모달 다이얼로그의 경우는 다이얼로그가 생성되면

자신을 생성시킨 다이얼로그가 활성화되지 않습니다.

 

하지만 모달리스 다이얼로그는 다이얼로그가 생성되더라도

자신을 생성시킨 다이얼로그로 마음대로 왔다 갔다 할 수 있습니다.

 

사실 이게 정확한 설명은 아니지만 대략의 차이점이라고 생각하시면 될 것 같고..^^;;

 

 

DoModal 함수에 대한 간단한 예제를 들면...

 

일단 모달 다이얼로그로 클래스가 생성되어 있다고 하죠...

그 클래스 이름을 "TestClassModal" 이라고 했을 때...

 

다이얼로그를 생성시킬 곳에서는

일단 해당 다이얼로그 클래스의 해더 파일을 포함시켜야 할 거구요..

 

그 다음에는 그 클래스를 선언해 주어야 겠지요~^^

 

TestClassModal   dlg;

 

if (dlg.DoModal == IDOK)   // 다이얼로그가 종료될 때 반환되는 값을 검사, OK 버튼으로 종료되었을 경우 IDOK를 반환

{

      // OK 로 다이얼로그가 종료되었을 경우의 작업 코딩

}

else

{

       // 그렇지 않을 경우의 작업 코딩..

}

 

 

DoModal 함수는 보통 위와 같은 형태로 사용됩니다.

[MFC] CDialog::EndDialog

1. 함수의 원형
 
    void EndDialog(int nResult);
 
 
2. 함수의 기능
 
    CDialog 대화상자를 이용해서 프로그램 하는 경우, 대화상자를 종료시킬 때, 어떤 함수를
    사용해야하는지 고민하는 경우가 종종있습니다. 일반적으로는 OnOK, OnCancel 을 호출해서
    많이 종료시키는데, EndDialog 함수도 대화상자를 종료시킬 때 사용합니다.
 
 
3. 함수의 매개변수에 대한 설명
 
    3.1 nResult
 
        대화상자는 보통 DoModal 이라는 함수를 이용해서 대화상자를 출력하게 됩니다. 그리고
        대화상자가 종료될때 DoModal 함수를 빠져나오게 됩니다. DoModal 이라는 함수는 종료될 때,
        정수형 값을 반환하는데 그 값을 이 변수를 이용해서 지정할 수 있습니다.
 
        일반적으로 대화상자가 종료되었을때, 확인 버튼을 눌러서 종료했는지 또는 취소버튼을 눌러서
        종료했는지를 구분하려면 아래와 같이 코드를 작성하시면 됩니다.
 
        MyTestDlg ins_dlg;
        int return_value = ins_dlg.DoModal();
        if(IDOK == return_value){
            // 확인을 눌러서 대화상자가 종료된 경우를 처리 한다.
        } else if(IDCANCEL == return_value){
            // 취소를 눌러서 대화상자가 종료된 경우를 처리 한다.
        }
 
        위 코드에서 보시는것과 같이 DoModal 함수는 IDOK 또는 IDCANCEL 값을 반환하게 됩니다.
        왜냐하면, 대부분 OnOK, OnCancel 함수로 종료시키기 때문입니다. 하지만, 좀더 효과적으로
        프로그램을 하려고 하다보면 DoModal 함수가 또다른 값을 반환해야 하는 경우도 있습니다.
        이럴때, EndDialog 함수를 호출하고 이 매개변수에 DoModal 이 반환할 값을 명시하면 됩니다.
 
        EndDialog(5);
 
        이렇게 종료하면 DoModal 함수는 5의 값을 반환하게 됩니다.
 
 
4. 함수의 주의사항
 
    EndDialog 함수는 즉각적으로 대화상자를 닫는 함수는 아닙니다. 따라서 EndDialog 함수 아래에
    코드가 있다면 그 코드를 수행합니다. 그리고 EndDialog 함수를 사용한 함수가 종료되는 시점에
    대화상자를 종료 시킵니다.
 
    // m_member_data는 MyTestDlg 클래스의 멤버 변수이고 1의 값을 가진다고 가정하겠습니다.
    void MyTestDlg::CloseMyDlg()
    {
        EndDialog(5);         // 대화상자가 종료되어야 한다는 값을 내부적으로 설정.
                                    // 하지만 이 순간에 종료되지는 않는다.
 
        m_member_data++; // 값을 2로 증가시킨다.
    }  // CloseMyDlg 함수가 종료되면서, CDialog 클래스는 종료상황이 체크된것을 인지하고
       // 대화상자를 종료합니다.