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
[689] [MessageBox] ShowMessage를 현재 폼의 가운데...
장성호 [nasilso] 9016 읽음    2007-07-26 11:38
프로그램중에 메세지 박스를 띄우면 항상 스크린 가운데 뜬다.

그런데 Dialogs.hpp 에 보니 원하는 위치에 띄우는 함수가 있다.
얼마전까지 몰랐음

ShowMessagePos("asdfasfd",100,100);  ==> 이렇게 하면 (100,100) 위치에 메세지 박스가 뜬다.


[본론]
그러나 위의 함수들 중에도 현재폼의 가운데에 메세지 박스를 보여주는 것은 없는것 같다.(있으면 누가좀 갈켜줘요)
그래서 ShowMessagePos를 이용해 현재폼의 가운데에 메세지 박스를 만들어 봤다.
void __fastcall ShowMessageCenter(String str)  
{  
    if(Screen->ActiveForm)  
    {  
        TSize ts=Screen->ActiveForm->Canvas->TextExtent(str);  
        if(ts.cx<122)ts.cx=122;  
        int x=Screen->ActiveForm->Left + (Screen->ActiveForm->Width-ts.cx)/2;  
        int y=Screen->ActiveForm->Top  + (Screen->ActiveForm->Height-92-ts.cy)/2;  
        ShowMessagePos(str,x,y);  
    }  
    else  
    {  
        ShowMessage(str);  
    }  
} 
//-----------------------------------------------------------------------

// 위에서 숫자 122 와 92는 Default 넓이, 높이에 대한 계산임

듀얼 모니터이거나 설정 Dialog가 스크린 한쪽에 있는데...
메세지를 가운데 띄워주면 마우스를 옮겨서 클릭해야하니 조끔 불현한데...
그럴때 이용할수 있을듯....



그밖에도 Dialogs.hpp에는 아래와 같은 함수들이있다.
CreateMessageDialog
MessageDlg
MessageDlgPos
MessageDlgPosHelp
ShowMessage
ShowMessageFmt
ShowMessagePos
PromptForFileName


추가  08-07-10
var 
  MsgCanvas: TCanvas; 
procedure ShowMessageCenter(str: String ); 
var 
  ts: TSize; 
  x,y: Integer; 
begin 
  if not Assigned(MsgCanvas) then 
  begin 
     MsgCanvas:=TCanvas.Create; 
     MsgCanvas.Font.Size:=9; 
     MsgCanvas.Font.Name:='MS Sans Serif'; 
  end; 
    if Assigned(Screen.ActiveForm)then 
    begin 
        MsgCanvas.Handle:=GetDC(Screen.ActiveForm.Handle); 
        ts:=MsgCanvas.TextExtent(str); 
        if(ts.cx<102)then ts.cx:=102; 
        x:=Screen.ActiveForm.Left + (Screen.ActiveForm.Width-ts.cx)div 2 - 20 ; 
        y:=Screen.ActiveForm.Top  + (Screen.ActiveForm.Height-92-ts.cy)div 2; 
        ShowMessagePos(str,x,y); 
    end 
    else 
    begin 
        ShowMessage(str); 
    end; 
end;        


@수정 ShowMessageCenter
   좌표가 마이너스 여도 문제없습니다. 그럼..

//C++Builder
void __fastcall ShowMessageCenter(String Msg) 
{ 
  static TCanvas *MsgCanvas=NULL; 

  if(MsgCanvas==NULL) 
  { 
    MsgCanvas=new TCanvas; 
    MsgCanvas->Font->Name="MS Sans Serif"; 
    MsgCanvas->Font->Size=9; 
  } 
  if(Screen->ActiveForm) 
  { 

    MsgCanvas->Handle=GetDC(Screen->ActiveForm->Handle); 
    TSize ts=MsgCanvas->TextExtent(Msg); 
    if(ts.cx<102)ts.cx=102; 
    TForm *MsgForm=CreateMessageDialog(Msg, mtCustom, TMsgDlgButtons () << mbOK); 
    MsgForm->Left=Screen->ActiveForm->Left + (Screen->ActiveForm->Width-ts.cx)/ 2 - 20 ; 
    MsgForm->Top=Screen->ActiveForm->Top  + (Screen->ActiveForm->Height-92-ts.cy)/ 2; 
    MsgForm->ShowModal(); 
  } 
  else 
  { 
      ShowMessage(Msg); 
  } 
}   



//델파이
var 
  MsgCanvas: TCanvas; 


function ShowMessageCenter2(const Msg : String): Integer; 
var 
  ts: TSize; 
  x,y: Integer; 
begin 
  if not Assigned(MsgCanvas) then 
  begin 
     MsgCanvas:=TCanvas.Create; 
     MsgCanvas.Font.Size:=9; 
     MsgCanvas.Font.Name:='MS Sans Serif'; 
  end; 

  if Assigned(Screen.ActiveForm)then 
  begin 
      MsgCanvas.Handle:=GetDC(Screen.ActiveForm.Handle); 
      ts:=MsgCanvas.TextExtent(Msg); 
      if(ts.cx<102)then ts.cx:=102; 
      x:=Screen.ActiveForm.Left + (Screen.ActiveForm.Width-ts.cx)div 2 - 20 ; 
      y:=Screen.ActiveForm.Top  + (Screen.ActiveForm.Height-92-ts.cy)div 2; 
      with CreateMessageDialog(Msg, mtCustom, [mbOK]) do 
      try 
        Left:=x; 
        Top:=y; 
        Result := ShowModal; 
      finally 
        Free; 
      end; 
  end 
  else 
  begin 
      ShowMessage(Msg); 
  end; 
end;        



그럼
장성호 [nasilso]   2008-07-10 15:42 X
ShowMessagePos 함수에 문제가 좀 있네요
Screen좌표가 마이너스인경우( 듀얼모니터에서 보조모니터가 왼쪽에 있을때)
정확히 지정한 위치에 MessageBox가 뜨지 않네요

그럼..
장성호 [nasilso]   2008-07-10 15:57 X
MessageDlgPosHelp 함수에서 좌표가 마이너스인경우 좀 건드네요

function MessageDlgPosHelp(const Msg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer;
  const HelpFileName: string): Integer;
begin
  with CreateMessageDialog(Msg, DlgType, Buttons) do
    try
      HelpContext := HelpCtx;
      HelpFile := HelpFileName;
      if X >= 0 then Left := X;
      if Y >= 0 then Top := Y;
      if (Y < 0) and (X < 0) then Position := poScreenCenter;
      Result := ShowModal;
    finally
      Free;
    end;
end;

+ -

관련 글 리스트
689 [MessageBox] ShowMessage를 현재 폼의 가운데... 장성호 9016 2007/07/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.