WIN32API FrameWork/한단계씩 직접 구현

03. 창이 생성될때의 사이즈 설정하기

2022. 5. 15. 22:23

https://hyrule.tistory.com/111

 

*** 공부 방법 ***

1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. (ex)

hyrule.tistory.com

 

 


 

지난 번에 창을 초기화하는 CreateWindowW() 함수에서 1280x720 사이즈로 창의 크기를 설정했었다. 

근데, 이 방식에는 문제가 있다.

상단 타이틀바까지 합친 길이로 사이즈를 조정해놓는다는 것이다.

하지만 상단 타이틀바를 제외한 하단 클라이언트 창 영역만 1280x720로 잡는 것이 일반적이기 때문에,

CGameManager::Create() 함수에 대한 수정이 필요하다.

 

 


RECT rc = { 0, 0, 1280, 720 };

우선 RECT 구조체를 이용하여 창 크기를 지정해주어야 한다.

typedef struct tagRECT
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

그냥 사각형의 왼쪽 위 좌표, 오른쪽 아래의 LONG타입의 좌표를 저장해 주는 단순한 구조체이다.

그릴때는 두 점 좌표를 이용하여 '직사각형'을 그린다.


AdjustWindowRect();
  • WIN32API의 창 조절은 무조건 타이틀바를 포함한다.
  • AdjustWindowRect() 함수를 사용하면
    지정한 사각형의 크기만큼 '클라이언트 영역'을 잡기 위해서 필요한 창의 크기를 계산해서 리턴해준다.
    • 타이틀바 포함 창 사이즈를 얼마로 해야 클라이언트 영역이 원하는 값이 되는지 계산
  • 인자는 3개 들어간다.
    • 1번 인자는 RECT 구조체의 '주소'
    • 2번 인자는 창의 종류 - 우리는 기존에 WS_OVERRAPPEDWINDOW를 사용하고 있었으므로 똑같이 입력해주면 된다.
    • 3번 인자에는 드롭다운 메뉴를 사용하는지에 대한 bool 타입 변수를 입력한다.
      • 우리는 메뉴를 사용하지 않는다.
  • 해당 인자를 입력하면, 1번 인자에 입력한 RECT 구조체 변수의 주소에 사이즈 크기가 새로 저장된다.

** 주의: 조절된 값에는 음수가 들어올수도 있다. 계산할 때 주의.


 

MoveWindow()
  • 정해놓은 크기로 윈도우 창의 크기를 변경해주는 함수이다.
  • 인자는 6개 들어간다.
    • 1번 인자는 현재 창의 HWND값
    • 2번 인자와 3번 인자는 기준이 될 창의 좌측 상단 좌표
    • 4번 인자는 가로 길이
    • 5번 인자는 세로 길이
    • 6번 인자는 다시 그릴것인지 여부

* 이번에는 글이 길지 않아 수정된 부분의 코드만 업로드

bool CGameManager::Create()
{
    m_hWnd = CreateWindowW(TEXT("GameFramework"), 
        TEXT("GameFramework"), WS_OVERLAPPEDWINDOW,
        100, 0, 0, 0, nullptr, nullptr, m_hInst, nullptr);

    if (!m_hWnd)
    {
        return false;
    }

    // RECT : 사각형을 표현하기 위해서 지원하는 구조체이다.
    // left, top, right, bottom 값으로 이루어져 있다.
    // 윈도우 크기를 표현하는 Rect 구조체를 하나 만들어준다.
    RECT    rc = { 0, 0, 1280, 720 };

    // 위에서 지정한 크기만큼 클라이언트 영역의 크기로 잡기 위해서
    // 필요한 실제 윈도우의 크기를 얻어온다.
    AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);

    // 위에서 얻어온 크기로 윈도우 창의 크기를 변경한다.
    MoveWindow(m_hWnd, 50, 50, rc.right - rc.left,
        rc.bottom - rc.top, TRUE);

    // 윈도우 창을 보여준다. 1번인자에 들어간 핸들의 윈도우 창을 보여줄지 말지를
    // 결정해준다.
    ShowWindow(m_hWnd, SW_SHOW);

    // 이 함수를 호출하여 클라이언트 영역이 제대로 갱신되었다면 0이 아닌 값을 반환하고
    // 갱신이 실패했을 경우 0을 반환한다.
    UpdateWindow(m_hWnd);

	return true;
}

 

 

'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글

05. PeekMessage 함수와 Run() 루프  (0) 2022.05.15
04. crtdbg 헤더를 통한 메모리 누수 잡기  (0) 2022.05.15
*** 공부 방법 ***  (0) 2022.05.15
02. 프레임워크 기본 설정 및 간단한 구현  (0) 2022.05.15
01. 프레임워크에 사용될 WINAPI32 기본 생성 코드 알아보기  (0) 2022.05.15
'WIN32API FrameWork/한단계씩 직접 구현' 카테고리의 다른 글
  • 05. PeekMessage 함수와 Run() 루프
  • 04. crtdbg 헤더를 통한 메모리 누수 잡기
  • *** 공부 방법 ***
  • 02. 프레임워크 기본 설정 및 간단한 구현
hyrule
hyrule
hyrule
C++ 프로그래밍 공부
hyrule
전체
오늘
어제
  • 분류 전체보기 (205)
    • C++기초 (50)
    • WIN32API FrameWork (109)
      • 한단계씩 직접 구현 (82)
      • 원본 (15)
      • 코드별 설명 개별저장(검색용) (12)
    • 자습 (21)
    • C++ TIPS (11)
    • 연습 노트 (3)
    • ETC (6)
    • DX2D StarCraft 모작 (1)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • Tistory
  • C++
  • 스타크래프트
  • notion
  • hello
  • Windows 11

최근 댓글

최근 글

hELLO · Designed By 정상우.
hyrule
03. 창이 생성될때의 사이즈 설정하기
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.