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
[946] [MessageBox] CreateMessageDialog - 캡션 마음대로 바꾸기
장성호 [nasilso] 13447 읽음    2009-12-24 02:11
음..

어제 올라온 질문중에 메세지박스의 캡션을 설정할수 있냐는 질문이 있었죠?

답변중 하나는 Win32API  MessageBox를 이용하는것이구   
           http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=59516
          (Application->MessageBox는 win32api   MessageBox를 호출합니다.)

           또다른 하나는 Application->Title을 변경한후에 ShowMessage를 하면된다고 했습니다.
           http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=59518

둘다 맞는 말입니다.

첫번째  Win32API를 사용할경우
   특별한 문제가 없습니다만..
    Screen->OnActiveFormChange 이벤트를 사용하고자 할경우 이벤트가 발생하지 않습니다.
    왜냐하면 말그대로 vcl함수가 아니구 vcl의 폼이 아니기 때문이죠

두번째 Appliction->Title을 수정할경우
    Application->Title을 수정하면 작업표시줄에 나타나는 버튼의 캡션이 변경됩니다.
    Application->Title은 말그대로 프로그램의 이름 즉 프로그램을 대표하는 title로써
    메세지박스 띄울때마다 바꾸긴 좀 그렇죠..
    다시 메세지박스를 close한후에 원상태로 해줘야하는 불편함도 있구요


그래서 한번 만들어 보았습니다.
[VCL메세지 박스의 원리]
   음..
   코딩에 앞서 먼저 VCL에 있는 메세지박스의 원리에 대해 간단히 설명해드리겠습니다.

  VCL의 ShowMessage 나 MessageDlg 등을 호출하면
   1) TForm을 상속받은 TMessageForm을 생성합니다.(new TMessageForm(Application); )
   2) 그런다음 넘겨준 파라메터에 맞게
        TButton과 TLabel을 동적으로 생성해서 Form위에 올리고
        Form의 크기도 메세지의 길이에 맞게 조정합니다.
   3) 그런다음 TMessageForm을 ShowModal로 띄워주는 것입니다.

[CreateMessageDialog 함수란?]
   위 1~3과정에서 1,2과정을 CreateMessageDialog라는 함수안에서 합니다.
   
   CreateMessageDialog라는 함수에서 TMessageForm을 생성하고.. return해줍니다.

   만약 caption을 바꾸고 싶으면 CreateMessageDialog함수로
   return받은 TMessageForm의 captionㅇ르 바꾼후에 ShowModal해주면 되는것입니다.'


[ShowMessage캡션 바꾸기]
int __fastcall ShowMessage(String sCaption,String sMessage)
{
    TForm *frm=(TForm *)CreateMessageDialog(sMessage,mtCustom,TMsgDlgButtons() << mbOK);
    frm->Caption=sCaption;
    frm->Position = poScreenCenter;  //메세지 박스 위치 (화면 한가운데)
    frm->ShowModal();
    delete frm;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ShowMessage("타이틀","타이틀이있는 메세지박스 잘보이나요?");
}




위 기능을 방식을 응용하면 엄청 다양한 메세지박스를 만들수 잇습니다.
  * Font를 바꾼다던가
  * 글자의 Color를 바꾼다던지..

[ShowMessage 메세지 color바꾸기 ]
int __fastcall ShowMessage(String sCaption,String sMessage,TColor clMsgColor)
{
    TForm *frm=(TForm *)CreateMessageDialog(sMessage,mtCustom,TMsgDlgButtons() << mbOK);
    frm->Caption=sCaption;
    frm->Position = poScreenCenter;
    TLabel*lbl=(TLabel *)frm->FindComponent("Message");
    if(lbl) lbl->Font->Color=clMsgColor;
    frm->ShowModal();
    delete frm;
}




[메세지박스 캡션을 한글로 ]
;다음과 같이 하면 메세지박스의 버튼 캡션을 한글로 바꿀수도 있구요
void __fastcall ShowMessage(String Msg)
{
  TForm *frm=CreateMessageDialog(Msg,mtCustom,TMsgDlgButtons()<Position=poScreenCenter;
  for(int  idx=0 ; idxControlCount;idx++)
  {
    if(frm->Controls[idx]->InheritsFrom(__classid(TButton)))
    {
        ((TButton *)frm->Controls[idx])->Caption="확인";
        break;
    }
  }
  frm->ShowModal();
  delete frm;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ::ShowMessage("메세지박스 캡션을 한글로...");
}


그럼..
뽀뽀중 [kissjung]   2009-12-30 12:50 X
감사 합니다.
아루스 [tinydew4]   2010-07-19 14:56 X
위에 구현하신 ShowMessage 함수에 return 값이 설정이 되지 않는 버그가 있습니다.

TModelResult mrResult = frm->ShowModal();

하여 delete 후

return mrResult;

해 주면 될 듯 합니다.

물론 new/delete 를 try/finally 로 처리 하실거라면 그냥
return frm->ShowModal();
하셔도 됩니다.

+ -

관련 글 리스트
946 [MessageBox] CreateMessageDialog - 캡션 마음대로 바꾸기 장성호 13447 2009/12/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.