C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[945] [MessageBox] MessageDlg
장성호 [nasilso] 17200 읽음    2009-12-23 22:47
음...

VCL에  대표적인 메세지박스 함수는 ShowMessage 일것입니다.
그런데 ShowMessage외에 다른 메세지 박스 함수가 있는줄 모르는 경우가 많더군요

[ShowMessage의 장단점]
    장점
    - 장점은 매우 쓰기에 간편하다는것입니다.
    단점
    ; 하지만 단점은 매우 기능이 한정되어있죠
        - 메세지박스의 Caption을 바꿀수 마음대로 정할수 없구
        - "확인"버튼 외에 "확인/취소" , "Yes/No/Cancel"등 버튼을 여러가지러 설정하지도 못합니다.
        - 또한 메세지박스의 특징을 나타낸 아이콘을 정해주지도 못하구요
           
    Win32API인 MessageBox 함수로 위의 기능이 모두 가능합니다.
  
    그런데 VCL에도 이런함수가 있습니다.


[MessageDlg]
  바로 MessageDlg라는 함수입니다.
  
   함수 원형은 다음과 같습니다.

  extern PACKAGE int __fastcall MessageDlg(const AnsiString Msg, TMsgDlgType DlgType, TMsgDlgButtons Buttons, int HelpCtx);

     
  그리고 MessageDlg의 사용된 TMsgDlgType과 TMsgDlgButtons는
  
#pragma option push -b-
enum TMsgDlgType { mtWarning, mtError, mtInformation, mtConfirmation, mtCustom };
#pragma option pop

#pragma option push -b-
enum TMsgDlgBtn { mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbHelp };
#pragma option pop

typedef Set  TMsgDlgButtons;




사용예
간단히 다음과 같이 쓰면..
   1) 예제1
	MessageDlg ("경고합니다." mtWarning ,TMsgDlgButtons()<<mbOK,0);
        MessageDlg ("에러입니다." ,mtError ,TMsgDlgButtons()<<mbOK,0);

    
    

   2) 예제2
     if( MessageDlg ("이것은 문제입니다. 계속할까요?" ,mtConfirmation,TMsgDlgButtons() << mbYes << mbNo << mbCancel,0) == mrYes )
    {
        //... 
    }

   ...
    
    
     
    3) 예제3
      ; ShowMessage와 MessageDlg가 똑같이 나오려면..
      다음 두 문장은 똑같은 모양의 메세지박스를 보여줍니다.
    ShowMessage("이 두문장은 같은 모양입니다.");
    MessageDlg ("이 두문장은 같은 모양입니다." ,mtCustom,TMsgDlgButtons() << mbOK,0);

   
   
    TMsgDlgType이 mtCustom인경우에 메세지박스의 캡션이 Application->Title로 나옵니다.

    4) 예제4
       ; 두줄.. 버튼 여러개..

	MessageDlg("다음과 같이 하면 어떤모습일까요? \r\r\nㅋㅋ 두줄에 버튼 여러개 나오죠?",mtInformation,TMsgDlgButtons()<<mbYes<< mbNo<< mbOK<< mbCancel<< mbAbort<< mbRetry,0);




그밖에 함수들
   MessageDlg외에
   1) 메세지박스를 특정 위치에 나타내게 하는 함수로 MessageDlgPos 가 있구

   2) printf함수와 같이 가변 파라메터를 쓸수 있는 ShowMessageFmt라는 함수가 있습니다.
   사용방법은 다음과 같구요
  
   ShowMessageFmt("A=%d B=%d",ARRAYOFCONST((10,20)));

  

   3) Help파일을 지정할수 있는
      MessageDlgPosHelp라는 함수도 있습니다.


MessageDlg의 단점?
   단점이라기 보다. win32api인 MessageBox 함수에 있는 기능인데 MesageDlg에서 없는 기능몇가지가 있는데요

   1) VCL의 모든 Control이 쓰레드에서 안정적이지 못하듯이
      MessageDlg도 메인GUI쓰레드가 아닌 쓰레드에서 사용하는데는 문제가 있습니다.

   2) 메세지박스의 캡션을 지정할수 없습니다.
      지정하지 않아도 되는것이 편리하므로 장점이 되기도하고 지정하고 싶을때는 기능이 없으니 안되는것이지요

   3) 메세지박스에 버튼이 여러개일경우 특정버튼에 focus가 가게 설정할수가 없네요



위에 나열한 아쉬운점에 대해서는 다음에 또 정리해 보겠습니다.


  
그럼..
공수래 [myth0929]   2011-07-28 12:49 X
감사합니다..좋은 자료...^^
bart [kenshin0213]   2011-08-06 11:28 X
C++ Builder에 입문한지 한달입니다. 장성호님 덕분에 감을 잡아갑니다. 감사합니다.
피니아 [jbmggm]   2015-09-24 21:28 X
좋은 자료 감사합니다. 나중에 제가 찾아보기 쉽도록, 제 블로그에 스크랩해놔도 될까요?

+ -

관련 글 리스트
945 [MessageBox] MessageDlg 장성호 17200 2009/12/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.