C++ Builder XE4, 10.2 Tokyo > 폼의 좌표 위치 > Width 대신 ClientWidth 사용(Win10 대응)

빌드 환경
RAD Studio 10.2 Tokyo Update 2 + Windows 10 Pro (v1709)

실행 환경
Windows 10 Pro (v1709)
Windows 8.1 Pro
Windows 7 Pro

관련


  • C++ Builder 10.2 Tokyo > Forms > Bug > 8개의 자식 폼을 부모 폼 아래에 4행 x 2열로 배치 > 공백이 뚫린다 > 10.2 Tokyo의 문제가 아닐 것

  • 처리 개요



    폼을 늘어놓는 소프트를 시험하고 있어, C++ Builder 10.2 Tokyo로 빌드했을 경우에 폼간에 「빈」을 할 수 있다.
    한층 더 조사하고 있으면, 10.2 Tokyo의 문제가 아니고, Windows 10에서의 실행시에 여유가 있는 것 같았다.

    재현용의 코드로서 이하를 시험해 본다.

    Unit1.h
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <Vcl.Controls.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <Vcl.Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // IDE で管理されるコンポーネント
        TButton *B_makeDouble;
        void __fastcall B_makeDoubleClick(TObject *Sender);
    private:    // ユーザー宣言
    public:     // ユーザー宣言
        __fastcall TForm1(TComponent* Owner);
        __fastcall ~TForm1();
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    TForm2 *s_forms[2] = {NULL, NULL};
    
    void __fastcall TForm1::B_makeDoubleClick(TObject *Sender)
    {
        // 1. フォームの作成
        if (s_forms[0] == NULL) {
            s_forms[0] = new TForm2(this);
        }
        if (s_forms[1] == NULL) {
            s_forms[1] = new TForm2(this);
        }
        s_forms[0]->Show();
        s_forms[1]->Show();
    
        // 2. 位置調整
        s_forms[1]->Top = s_forms[0]->Top;
    
        s_forms[0]->Left = this->Left + B_makeDouble->Left + B_makeDouble->Width;
        s_forms[1]->Left = s_forms[0]->Left + s_forms[0]->Width;
    
    }
    
    __fastcall TForm1::~TForm1()
    {
        if (s_forms[0] != NULL) {
            delete s_forms[0];
        }
        if (s_forms[1] != NULL) {
            delete s_forms[1];
        }
    }
    //---------------------------------------------------------------------------
    
    



    본래는 오른쪽의 아이 폼이 왼쪽의 아이 폼에 달라붙을 것이지만, 그렇게는 되지 않는다.

    발생 상황은 다음과 같습니다.
  • Windows 10: 여유 공간
  • Windows 8.1: 여유 공간이 없습니다
  • Windows 7: 여유 없음

  • Windows 10에서 「텍스트, 앱, 그 외의 항목의 사이즈를 변경한다」는 「100%」에서도 「175%」에서도 똑같이 여유가 생긴다.
    폼의 속성 "Scaled"를 false로 해도 동일합니다.

    좌표 확인



    Unit1.cpp
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
              int X, int Y)
    {
        TPoint pt;
    
        pt = Mouse->CursorPos;
    
        String msg = IntToStr((int)pt.X) + L"," + IntToStr((int)pt.Y);
        OutputDebugString(msg.c_str());
    }
    

    마우스 좌표를 표시하려고했습니다.
    확인한 결과, 아이 폼이 축소 표시되어 있는 것 같다.
    (추기: 이 점은 실수였던 것 같습니다)

    관련


  • Windows10에서 폼의 크기, 위치가 예상대로 되지 않는다

  • Vista 이후의 변경에 대해서 기재되어 있다. 이쪽에서의 확인에서는 Vista 이후라고 하기보다는 Windows 10 자체의 차이의 느낌은 한다.
    ClientWidth를 사용한다는 제안이 되고 있다.

    실제로 ClientWidth로 변경하면 아래와 같이 자식 폼이 연결하게 되었다.



    Windows8.1까지 좌표 관계가 문제 없었던 소프트도 Windows 10에서 사용할 때 변경하게 될지도 모른다(Width에서 ClientWidth로의 변경).

    위의 이유



    C++ Builder 10.2 Tokyo > Width와 ClientWidth의 차이 on (Win7, Win8.1, Win10) > 똑같이 다르다 | 폼 외부 프레임: Win10에는 없다
    보시다시피 Windows 10에서 창 프레임 (왼쪽, 오른쪽, 아래)이 표시되지 않는 것 같습니다.

    이 문제는 XE4로 빌드한 소프트웨어에서도 발생할 것이다.

    좋은 웹페이지 즐겨찾기