피터지고 치열하게 삶을 유지하다  
Front Page
Notice | Keyword | Tag | Location | Guestbook | Admin | Write Article   
 
RepositionBars에 해당하는 글 1건
2007/05/07   CWnd::RepositonBars 고찰


CWnd::RepositonBars 고찰
정의는 비교적 간단하다.

윈도우의 클라이언트 영역안에 들어 있는 Control Bar들의 위치나 크기를 조정하기 위해 호출하는 것이다.

Prototype을 보면 다음과 같다.
void RepositionBars(
   UINT nIDFirst,
   UINT nIDLast,
   UINT nIDLeftOver,
   UINT nFlag = reposDefault,
   LPRECT lpRectParam = NULL,
   LPCRECT lpRectClient = NULL,
   BOOL bStretch = TRUE 
);
nIDFirst 부터 nIDLast의 Control Bar까지 위치나 크기가 조정되며, nIDLeftOver Pane으로 나머지 Client영역을 채운다. 나머지는 Default 값을 사용하거나 다음과 같은 목적으로 조합할 수 있다.

만약 nFlag의 값으로 CWnd::reposQuery 를 사용하면 조정이 실제 행해지지는 않으면서 조정이 실제로 이루어 졌을때의 Client 영역을 얻을 수 있다.

만약 nFlag값을 CWnd::reposExtra 으로 설정하면 nIDLast Client 영역에 lpRectParam 만큼의 영역을 더하여 조정을 하게된다.

lpRectClient는 임의로 윈도우의 Client 영역을 정할 수도 있으며, NULL인경우 윈도우의 현재 Client 영역을 사용한다.

bStretch 는 Bar를 윈도우 Frame 크기에 맏도록 늘릴지를 결정한다.

이상 별로 어려워 보일것 같지 않은 함수이다. 그러나 오늘 이 함수를 깊이 있게 살펴보고자 하는 이유는 다음 때문이다.

FrameWnd가 있는데 그 안쪽에 SplitterWnd를 사용하여 두개의 View를 보여주고 있었다. 이때 FrameWnd에 두개의 ToolBar를 이어붙여 보여줄 필요가 생겼다. 그래서 두 툴바를 이어 붙여주는 함수에서 RepositionBars()를 다음과 같이 사용하였다.

[CODE]void DockRightOf(CXTPToolBar* pBarToDock, CXTPToolBar* pBarOnLeft)
{
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, AFX_IDW_PANE_FIRST);

      CXTPWindowRect rcBar(pBarOnLeft);

       if (IsVerticalPosition(pBarOnLeft->GetPosition()))
            rcBar.OffsetRect(0, rcBar.Height());
       else
            rcBar.OffsetRect(rcBar.Width(), 0);

       GetCommandBars()->DockCommandBar(pBarToDock, rcBar, pBarOnLeft->GetDockBar());
}[/CODE]

그런데 SplitterWnd에서 Assertion이 발생하였다.

AFX_IDW_PANE_FIRST 대신 0 을 넣어준 결과 Assertion도 발생하지 않고 원하는 결과를 보여주었다.

일단 무식하게 유추해 보면 AFX_IDW_PANE_FIRST는 첫번째 걸린 Child Window(보통 View)로 Client영역을 채워주라는 것인데, 그렇게 따지면 SplitterWnd가 되지 않을까? 첫번째 걸린 View로 Client를 채우라는 것인가?

다음에서 pView가 NULL이 되어 Error가 발생한다. 0,0 Pane을 가져오지 못하는 이유를 알 수 없다.

CWnd* CSplitterWnd::GetPane(int row, int col) const
{
ASSERT_VALID(this);

CWnd* pView = GetDlgItem(IdFromRowCol(row, col));
ASSERT(pView != NULL);  // panes can be a CWnd, but are usually CViews
return pView;
}

여하튼, MFC는 CFrameWnd를 상속받은 Frame에 ToolBar, Status Bar등을 배치할 수 있는 함수들을 제공하고 이들의 크기와 위치를 변경하기 위해 RepositionBars()를 활용한다는 것을 확인할 수 있었다.

RepositionBars()와 관련된 다음의 주제들 또한 참고할 만하다.

nFlag, lpRectParam 의 활용 예를 볼 수 있는 MSDN 자료

MFC/ 다이얼로그에 있는 툴바와 상태 표시줄 - 위 문서와 같은 내용을 포함하고 있다. 전반적 이해를 위해서는 이 문서가 더 좋을 것이다.




크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
Tag :
Track this back : http://www.codeforum.net/blog/pitoosung/trackback/73

name    password    homepage
 hidden


BLOG main image
피투성의 IT 분투기
 Notice
(2009.11.30) - ㅠ.ㅠ 안녕! 서버 H/W 시스템 교체(서버보드 사망, HP Workstation으로 교체)
(2008.2.2) IP : 195.225.178.29 - 스팸 차단 조치
(2008.1.14) 오후 06:34 ~ 08:07 : 시스템 복구
(2008.1.14) 오전 00:25(?) : 시스템 다운 - 흠 심각하군!
(2008.1.13) 오후 11:31 : 시스템 리부팅됨
(2008.1.13) 시스템 복구 : 오전(?)~오후 1:00
 Category
전체 (148)
프로그래밍 (42)
IT 세상속으로 (42)
세상 엿보기 (26)
지하창고 (18)
책의 향기 (12)
생각의 힘(바둑) (4)
OCR-내가 다 읽어줄께 (1)
두발의 짐승 (2)
지능형 로봇 (1)
 Calendar
«   2010/09   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
 Recent Entries
투명 Display 그리고 Augm... (2)
64bits(x64) Windows OS...
NFS & Eclipse & CDT & In...
행복에 대해 생각하며
Virtual Audio Cable (가...
 Recent Comments
^^ 안녕! 축하축하. 난 아...
피투성 - 03/16
오랜만에들림니다 아이폰...
쭌 - 03/15
Thanks for your kind tra...
hyungju - 2009
정보 감사합니다 덕분에...
허수 - 2009
관리자만 볼 수 있는 댓글...
- 2009
 Recent Trackbacks
내가 생각하는 한의학의...
Life Is Always Emergency
FreeBSD 6.2, 64bit, 메모...
엘레노아의 작업로그
알약 백신 제대로 사용하...
촌철살인
유용한 블로그 툴 몇개..
ENTClic@blog...just anot...
국내의 검색엔진에 등록하...
케이알선의 이야기
 Archive
2010/01
2009/12
2009/07
2008/09
2008/03
 Link Site
00_피투성의 지식창고_00
 Visitor Statistics
Total : 70563
Today : 57
Yesterday : 46
텍스트큐브 배너
Eolin
rss