윈도우즈 응용 프로그램은 다수의 창을 포함하는 것이 보통
따라서 원한다면 각각의 창에 픽셀 포맷을 지정하는 것도 가능
각각의 창에 대해 한 번씩 SetPixel Format 함수를 호출
현재의 렌더링 창을 지정하는 방법을 구현
GDI 함수들이 이용하는 창 장치 컨텍스트의 개념이 OpenGL 환경에서는 렌더링 컨텍스트라 불리는 개념에 포함
장치 컨텍스트가 GDI를 위한 드로잉 모드와 명령을 기억하는 것처럼 렌더링 컨텍스트는 OpenGL 설정과 명령을 기억
wglCreateContext 함수를 이용하면 OpenGL 렌더링 컨텍스트를 만들 수 있음
이 함수는 올바른 픽셀 포맷을 가진 창의 장치 컨텍스트를 인자로 받으며 OpenGL 렌더링 컨텍스트의 데이터 타입은 HGLRC 이다
HGLRC hRC;
HDC hDC;
hRC = wglCreateContext(hDC);
렌더링 컨텍스트는 이를 만드는데 이용한 창과 호환
두 개의 창이 서로 다른 드로잉 모드나 원근 모드를 사용할 수 있으므로 응용 프로그램은 두 개 이상의 렌더링 컨텍스트 가질 수 있음
OpenGL 명령은 작업할 목적지 창을 알아야 하므로 한 스레드 당 하나의 렌더링 컨텍스만을 활성화
활성화된 컨텍스트를 "현재 컨텍스트"
렌더링 컨텍스트는 디바이스 컨텍스트와 연결되며 결국 특정한 창과 연결
OpenGL 명령이 어느 창에 렌더링 해야 하는지 알 수 있다
하나의 창에서 다른 창으로 OpenGL 렌더링 컨텍스트를 바꿀 수도 있지만 이 때는 각 창이 같은 픽셀 포맷을 가져야 함
렌더링 컨텍스트를 활성화 하고 특정한 창과 연결하는 데는 wglMakeCurrent 함수가 사용
wglMakeCurrent(hDC, hRC);
윈도우즈의 디바이스 컨텍스트 개념은 2D 그래픽 응용 프로그램에 맞게 디자인
메모리 장치 컨텍스트를 만들지만, 이 경우 모델 역할을 해줄 장치 컨텍스트를 제시
창 인자에 NULL을 지정하더라도 데스크 톱의 장치 컨텍스트를 모델로 이용
3D 그래픽 렌더링의 대상이 되는 창이나 장치는 단순한 색상 깊이 이상의 다양한 특성을 필요하며 하드웨어 렌더링 장치 (3D 그래픽 카드)를 이용하는 경우는 더욱
OpenGL이 렌더링을 시작하기 전에 필요한 렌더링 설정에 따라 창을 설정
하드웨어와 소프트웨어 렌더링 중 어떤 방식을 사용하는가?
단일 버퍼와 이중 버퍼 방식 중 어떤 방식을 사용하는가?
깊이 버퍼가 필요한가?
스텐실 버퍼와 목표 알파, 누적 버퍼 등을 사용하는가?
일단 이러한 창의 인자를 지정한 뒤에는 나중에 변경 불가능
깊이 버퍼와 색상 버퍼만을 가진 창을 스텐실과 색상 버퍼만을 가진 창으로 바꾸고자 한다면, 첫 번째 창을 제거하고 새로운 특성을 가진 창을 다시 만들어야 함
일반적으로 창의 3D 특성은 창이 만들어진 직후에 한 번 설정
픽셀 포맷을 지정하기 위해 PIXELFORMATDESCRIPTOR 구조체를 제공
이들 멤버 값은 임의로 결정할 수 없으며 하나의 창에 대해서 제한된 종류의 픽셀 포맷만을 사용
픽셀 포맷값은 OpenGL 드라이버나 소프트웨어 렌더러에서 얻을 수 있음
* 픽셀 포맷의 선택과 설정
ChoosePixelFormat 제공
이 함수는 먼저 여러분이 원하는 3D 창의 속성들을 포함하는 픽셀 포맷 구조체를 만들고 이와 가장 유사한 픽셀 포맷을 찾아 이에 해당하는 인덱스를 리턴
이렇게 받은 픽셀 포맷을 두 번째 윈도우즈 함수 SetPixelFormat에 전달하여 픽셀 포맷을 지정
무엇보다 먼저 원하는 3D 창의 특성을 나타내도록 PIXELFORMATDESCRIPTOR 구조체를 채워야 함
ChoosePixelFormat 함수는 항상 바른 픽셀 포맷을 찾아 돌려주며 가능하면 하드웨어 가속 픽셀 포맷을 우선적으로 선택
도구 - 옵션 - 키보드 - 다음 추가 키보드 매핑 구성표 적용 - Visual C++ 6
이러면 빌드를 F7을 눌러서 실행할 수 있다
Ctrl + D 찾기 창 메뉴에 보이게 하기
파일에서 찾기 아이콘 옆에 단추 추가/제거 를 눌렀을 때
Ctrl + D 를 단축키로 하는 찾기 창을 추가할 수 있다
1. 탭 컨트롤을 다이얼로그에 붙인 후 변수를 추가한다
카테고리(범주) : Control
CTabCtrl m_tabCtrl;
2. 탭 개수를 추가하고 헤더에 이름을 추가한다
3. 각 탭에 다이얼로그를 보여줄 다이얼로그를 생성한다
그대로는 자식 윈도우로 사용할 수 없으므로 일부 속성을 변경
Border 속성 : None
Style 속성 : Child
- 이렇게 수정한 대화상자 리소스는 메인 프레임 윈도우가 되지 못하고 특정 윈도우의 자식 윈도우로 생성/동작
4. 수정한 대화상자의 클래스를 추가한다
5. 탭 컨트롤 영역을 얻어와 탭 컨트롤의 자식으로 각 다이얼로그를 생성하고
보여주는 다이얼로그를 설정한다 - OnInitDialog()
6. 탭을 눌렀을 때 이벤트 처리는 현재 보여주는 윈도우는 닫고 선택한 윈도우를 보여준다 - OnTcnSelchangeTab()
7. 창이 삭제될 때 객체들을 삭제한다 - OnDestroy()