오른쪽에 고정된 컨트롤이 있는 Borland C++Builder 5 양식이 Vista에서 잘못 나타나는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/525517

문제

솔루션을 찾기 위해 짧은 시간을 보냈고 이제 그것을 찾았으므로 이것이 스택 오버플로에 대한 문서화에 좋을 것이라고 생각했습니다.그래서 내 대답은 이 질문 바로 뒤에 나올 것입니다.

저는 볼랜드 C++ 빌더 5를 사용하고 있었습니다.이는 아마도 동등한 버전의 Delphi에도 적용될 것입니다.TPanel에 TButton이 있는 양식이 있었습니다.버튼은 akRight,akBottom으로 설정되었습니다.XP 및 이전 Windows에서는 모든 것이 괜찮았습니다.Vista에서 Aero를 사용하면 버튼이 오른쪽으로 너무 멀리 4픽셀 표시되었습니다.앵커링은 계속해서 잘 작동했습니다.

또 다른 예는 akTop,akRight,akLeft가 있는 TComboBox가 있는 양식입니다.Vista에서는 콤보가 4픽셀 너비로 너무 넓게 나타났습니다.

Vista의 "클래식" 모양으로 돌아가면 모든 것이 올바르게 표시됩니다.

도움이 되었습니까?

해결책

내가 시도한 첫 번째 작업은 작동하지 않았습니다.나는 문제가 Vista의 더 넓은 창 테두리와 관련이 있다고 추측했습니다.저는 VCL의 UpdateAnchorRules가 Vista의 디자인 너비와 실제 창 너비의 차이로 인해 어떻게든 잘못 계산되고 있다고 생각했습니다.VCL 소스를 살펴보면 앵커를 변경하면 UpdateAnchorRules가 다시 호출되고 (희망적으로) 올바르게 계산된다는 것이 분명했습니다. 이제 사용 가능한 양식의 실제 너비가 있기 때문입니다.

나는 추가했다

TAnchors t = BlahBtn->Anchors;
t >> akRight;
BlahBtn->Anchors = t;
t << akRight;
BlahBtn->Anchors = t;

내 양식의 생성자에게.

기쁨이 없습니다.동작에는 전혀 영향이 없었습니다.

프로세스 초기 단계일 수 있다고 생각했기 때문에 동일한 코드를 FormShow 메서드로 옮겼지만 마찬가지로 실패했습니다.마지막 시도로 더 이상 버튼에 akRight가 없도록 양식 디자인을 변경하고 코드를 다음으로 변경했습니다.

TAnchors t = BlahBtn->Anchors;
t << akRight;
BlahBtn->Anchors = t;

...역시 실패했습니다. 동작에는 전혀 영향을 미치지 않았습니다. 단, 저장된 양식 크기(레지스트리에서 읽고 FormShow의 양식에 적용)가 다음과 같은 경우 XP에서 버튼 위치가 깨졌습니다. 기본값은 아닙니다.

양식 너비, 버튼 너비, 버튼 왼쪽, 양식의 ClientRect 등을 출력하는 디버그 코드 미터톤을 추가했습니다.양식 수명 동안 여러 지점에서 문제를 발견했습니다.어떤 이유에서인지(아마도 여전히 창 테두리 관련 - 이유가 무엇인지 정확히 알 수 없었음) VCL은 너비가 4픽셀 아래인 창을 열었습니다.그 직후 너비가 수정되었지만 그 시점에는 앵커링(및 UpdateAnchorRules)이 이미 버튼의 위치를 ​​4픽셀 오른쪽으로 너무 멀리 수정했습니다.

수정 사항은 다음과 같습니다.

void __fastcall TFooBarDlg::CreateParams(TCreateParams &Params)
{
    TForm::CreateParams(Params);
    int i = GetSystemMetrics(SM_CXSIZEFRAME);
    Params.Width=Params.Width+(2*(i-4));
}

이는 Vista에서 보고된 다양한 테두리 크기를 사용하여 양식의 초기 너비를 수정합니다.다른 Windows 버전(및 "클래식" 모양의 Vista)에서는 이를 유지하면서 Vista에서는 올바른 동작이 발생합니다.

이것이 누군가에게 도움이 되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top