VCL에서 Control의 위치 및 크기 조정하기


Parent-Window의 크기에 가변적으로 
Child-Control 의 크기및 위치를 조정하고자 하는 경우에...

Form의 Resize이벤트 등에 Control의 위치 및 Size를 조정해주곤 한다.

  
Control->Left = Control->Parent->ClientWidth / 2 ;
Control->Top = Control->Parent->ClientHeight / 2 ;
Control->Width= Control->Parent->ClientWidth / 4 ;
Control->Height= Control->Parent->ClientHeight / 4 ;

     


그런데  위와같이 코딩을 여러개의 Control에 적용하면 문제점이 발생할수 있다.


그 이유는 Control의 Left  / Top / Width / Height 어느 한가지만 변경하여도
실제 위치및 크기조정 함수가 호출되면 화면 Paint이벤트가 발생하게 된다.


위와같이 Control의 위치및 크기 Property중 1가지 이상 변경하고자 할때는 ..

Control->SetBounds(iLeft,iTop,iWid,iHei); 함수를 호출해줘서

한번에 위치및 크기를 수정해주는것이 좋다.

최대 4배의 시간및 cpu자원의 이득을 얻을수 있을것이다.


Control의 위치및  크기를 조절할때는 SetBounds 함수를 이용하길 권장한다.







보조 모니터 좌상단 좌표는?


보조 모니터의 좌측상단 좌표는 

다음과 같이 Display설정에 따라 다르게 나타난다.

주 모니터만 Left/Top이 항상 (0,0) 이구, 보조모니터는 주모니터에 상대 위치값이 된다.

만약 현재 모니터(주 또는 보조 모니터)의   좌측상단에 어플을 위치하게 하려면 어떻게 하면 될까?

VCL에서는 

Form클래스 내에서 다음과 같이 하면 된다.

this->Left = this->Monitor->Left;
this->Top = this->Monitor->Top;


보조 보니터에서 그냥 Top=0 로 설정한경우에

위 4가지 설정중 2번 4번의 경우엔 실제로 화면 상단에 위치하지 않게된다.


그럼..




유저 의견 확인용 메시지 다이얼로그




  
  String sMsg;
  sMsg.sprintf(L"%d개의 이슈를 삭제할까요?", DBG_Issue->SelectedRows->Count);

  if (Application->MessageBox(sMsg.c_str(), L"삭제 확인", MB_YESNO + MB_ICONWARNING)
     == IDNO)
  {
    return ;
  }
     

  1. i블로그 2012.04.25 10:08 신고

    Application->MessageBox 는 win32 MessageBox 입니다.

    단지 맨 앞에 Handle 파라메터를 생략 할수 있도록 해둔것이죠




  
void __fastcall TForm1::Button1Click(TObject *Sender) 

  if (DBGrid1->SelectedRows->Count > 0) 
  { 
    AnsiString s = ""; 
    TDataSet *pDS = DBGrid1->DataSource->DataSet; 
    for (int i=0; i < DBGrid1->SelectedRows->Count; i++) 
    { 
      pDS->GotoBookmark((void *)DBGrid1->SelectedRows->Items[i].c_str()); 
      for (int j = 0; j < pDS->FieldCount; j++) 
      { 
        if (j>0) 
          s = s+", "; 

        s = s + pDS->Fields->Fields[j]->AsString; 
      } 
      ListBox1->Items->Add(s); 
      s = ""; 
    } 
  } 
}
     

DroppedDown을 true 해주면 리스트가 열리지만

[ENTER]키 때문에 바로 닫혀버린다.


[ENTER] 키로 DropDown을 처리해 주려면 아래와 같이 코딩해야 한다.





  
//---------------------------------------------------------------------------
void __fastcall TF_IssueEditDlg::CB_PrjNameKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{

  if( Key != '\r' )
    return ;

  Key = 0;

  if( CB_PrjName->DroppedDown )
  {
    CB_PrjName->DroppedDown = false;
    return;
  }


  CB_PrjName->DroppedDown = true;
}
//---------------------------------------------------------------------------




void __fastcall TF_IssueEditDlg::CB_PrjNameKeyPress(TObject *Sender, wchar_t &Key)

{
  if( Key=='\r' && CB_PrjName->DroppedDown)
  {
    Key = 0;
    return;
  }

}
     

+ Recent posts