2014-11-18 6 views
1

나는 고정 된 크기를 사용하는 오래된 GUI에서 wxWidgets (여기서 나는 sizer의 기초를 배우려고 노력하고있다)의 어플리케이션을 움직이고있다.sizer는 양식을 처리하는 좋은 방법입니까?

응용 프로그램 내에서 나는 꽤 복잡한 구조로 여러 형태가 있습니다. 데이터 및 워크 플로의 성격 때문에 이러한 모든 데이터를 한 화면에 모으는 것이 좋습니다. 그러나이 화면은 사용할 수 있도록 적절하게 설계되어야합니다. 여기

다음 양식의 이전 버전은 ...

form with fix layout

... 그리고 더 많거나 적은 내가 사용 선별기 가지고 올 수 있는지의 ...

form with wxSizers

위젯 중 일부는 행 전체에 걸쳐 있고 다른 일부는 고정 그리드 등에서 나오기 때문에 wxGridSizer를 사용할 수 없습니다.

분명히 나는 ​​추악하지 않게하기 위해 계속해서 작업 할 수 있었지만, sizer가 올바른 도구가 아닌 것 같았다. 내가 원하는 것을 얻기 위해서는 어떤 종류의 colspan/rowspan 메카니즘을 가진 wxGridSizer와 비슷한 것이 필요할 것이고 아마도 충분하지 않을 것입니다.

그래서 나는 완전히 형태의 형상을 차단하기 위해, 모든 위젯의 상대적 크기를 설정합니다

int w,h; 
GetClientSize(&w,&h); 
MyFormSizer *formSizer(w,h); 
formSizer->SetDimension(widget1, 100, 20); 
formSizer->SetDimension(widget2, 500, 20); 
formSizer->newRow(); 
formSizer->SetDimension(widget3, 100, 20); 
formSizer->SetDimension(widget4, 250, 20); 
formSizer->SetDimension(widget5, 250, 20); 
formSizer->Layout(); 

사용자처럼 뭔가를 갈 수있는 자신에 의해 "양식 크기 조절기"를 구축 할 생각하기 시작했다. 이 구조는 적절한 배율 f을 계산합니다 Layout() 크기를 조정할 때 wxPanel에 맞게 다음 등

widget1->SetSize(CalculatedX, CalculatedY, 100/f, 20/f); 
CalculatedX+=100/f; 
widget2->SetSize(CalculatedX, CalculatedY, 500/f, 20/f); 
CalculatedX+=0; 
CalculatedY+=20/f; 

과 같은 일을하고 모든 크기와 위치를 설정합니다 (이 그냥 처음이다, 거친로서을 만들려면 위젯의 텍스트를 맞추기에 너무 작은 모든 것을 만들거나 글꼴 크기를 그에 맞게 조정하는 메커니즘이 있어야합니다.

합리적인 것처럼 보입니까? 주제에 대해 어떻게 생각하십니까? 이 선택은 내 미래의 개발에 영향을 미칠 것입니다. 따라서 어떤 대답, 비판 및 의견도 매우 환영받을 것입니다.

답변

1

wxGridSizer 귀하의 요구를 충족하지 못할 수도 있지만 wxGridBagSizer과 같은 더 유연한 클래스는 원하는 것을해야합니다. 이 클래스를 사용하면 wxGridBagSizer::Add을 호출 할 때 wxGBSpan을 설정하여 여러 행과 열에 걸쳐 항목을 설정할 수 있습니다.

+0

슈퍼! 나는 나의 브라우징과 독서에서 이것을 결코 발견하지 못했다는 것이 부끄럽다. 정말 내 해결책 인 것 같다. 나에게 약간의 시험을주고 나는이 대답을 받아 들일 것이다. – dirluca

+0

당신이 제안한 것을 구현하는 데 어려움을 겪고 있습니다. 그러나 제트기가 도구를 사용하고 있거나 자신감이 부족한 경우 제트라고 말할 수는 없습니다. 즉, 열 너비를 관리하는 데 큰 어려움이 있습니다. 내용이 다르더라도 모두 같아지는 경향이 있으며 "비례"매개 변수가 없습니다. 'wxSizer :: SetItemMinSize()'는 일부 작업을하지만, 예를 들어 나는 모든 행에서 colspanned하지만 20X20 버튼이있는 열을 가지고 있습니다. 너비가 20px가 될 것으로 예상되지만 대신 다른 열과 동일합니다. 나는 시험을 계속한다! – dirluca

+0

몇 가지 테스트를 더 마친 후에 대답을 수락하기로 결정했습니다. 'wxGridBagSizer'는 완벽하지는 않지만 내 요구에 가장 잘 맞는 것 같습니다. – dirluca

1

@ sjdowling의 대답에서 언급했듯이 wxGridBagSizer을 사용할 수 있습니다. 그러나이 클래스는 절대 위치 지정과 관련된 몇 가지 문제로 인해 사용하지 않는 것이 좋습니다. 특히 주변 요소를 이동하거나 끝에 추가하는 것이 매우 어렵습니다.

wxWidgets sizer가 다른 크기로 요소를 정렬하는 기능이 부족합니다. 이는 일반적인 상자 또는 격자 크기 조절기를 사용하는 경우 여기에 필요한 기능이며 성가신 항목입니다.그러나 열의 크기를 명시 적으로 고정하여 하드 코딩 할 수 있습니다 (특히 높은 DPI 상황에서 레이아웃이 손상되지 않도록 대화 상자 단위 만 사용하고 픽셀은 사용하지 마십시오). 또는 전체를 반복하여 라벨에 모두 GetTextExtent()을 호출하고 가장 긴 것을 선택하십시오 (특히 문자열의 너비를 픽셀 단위로 변경할 수있는 번역을 사용할 때 훨씬 더 신뢰할 수 있습니다). 그런 다음 간단히 작성한 레이블에이 너비를 지정하십시오. 초기 너비가 최소 너비이기 때문에 다른 sizer에 있더라도 모든 너비가이 너비를 갖도록 정렬됩니다.

필자가 쓴 것처럼이 코드는 다소 짜증나지만 실제로 코드에서 레이아웃을 만들면 그리 나쁘지 않습니다. GUI 디자이너에서 작업하는 경우 더 이상한 일이지만 여전히 코드에서 wxSizer::SetItemMinSize()으로 전화 할 수 있습니다. 물론 유일한 해결책은 사이 사이 저 정렬을 지원하는 것이지만 지금은 wxGridBagSizer IMO를 사용하는 것이 더 좋습니다.

+0

모르겠다. @sjdowling이 제안한 것을 구현하는 데 어려움을 겪고있다.하지만 도구 나 자신감이 부족한 경우 제트라고 말할 수는 없다. 절대 위치 지정을 사용할 계획은 없습니다. 당신이 제안하는 것은 흥미 롭습니다. 그러나 저는 sizer의 wrapper를 만들어야 만합니다. (나는 30 가지 형식을 가지고 있고, 30 번 과정을 거치고 싶지 않습니다.) 왜 그렇게 많은 제약을 가하면서 왜 왜 그런지 궁금합니다. 이 상황에서 sizer를 사용하십시오 - plaese는 "필사적으로 바퀴를 재발 명하고자하는 사람들"에 나를 넣지 않습니다 :-) – dirluca