프로그램중에 메세지 박스를 띄우면 항상 스크린 가운데 뜬다.
그런데 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;
그럼
Screen좌표가 마이너스인경우( 듀얼모니터에서 보조모니터가 왼쪽에 있을때)
정확히 지정한 위치에 MessageBox가 뜨지 않네요
그럼..