본문 바로가기
C & C++/MFC 컨트롤

툴바의 위치를 레지스트리에 저장하자

by izen8 2011. 11. 17.
반응형

레지스트리에 툴바의 위치를 저장하자

 [ 레지스트리에 툴바의 위치를 저장하자 ]
 
 

윈도우 프로그램을 쓰면서, 자주 사용하는 항목은 툴바라는 것으로 묶어 놓게 됩니다. 한두 개정도의 툴바가 있을 경우는 상관없지만, 아주 많은 툴바가 존재할 경우나, 자신에게는 필요없는 툴바인 경우는 제거하거나, 위치를 바꿔서 사용하신 경험이 있으실껍니다. 그런데, 그 프로그램을 종료하고, 또 사용하시려고 하면, 정리했거나, 제거했던 툴바가 다시 도로 생기게되죠 ? 그러면, 또 제거하고, 위치옮겨놓고... 이러면 짜증~ 나겠져.. 이럴 경우에 사용하는 테크닉입니다. 바로 레지스트리를 이용하여, 데이터를 저장시키면 됩니다. 일단 한번 보시죠 ^_^

 
 
 

먼저 툴바의 생성과정 및 이용방법에 대해 알아보겠습니다. 툴바의 관리는 CMainFrame에서 하며, 다음과 같은 과정을 거치게 됩니다.(물론, 아래의 소스는 모두 CMainFrame내에 존재시키면 됩니다.)

onCreate 함수내에 다음과 같은 항목이 존재합니다.

 

 

if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP  |

    CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)

    ||  !m_wndToolBar1.LoadToolBar(IDR_MAINFRME)){

                TRACE0("Failed to create toolbar\n");

                return -1;      // fail to create

}

 

위의 코드는 일반적으로 Studio에서 지원해 주는 툴바를 생성하는 부분입니다. 이를 다음과 같이 고쳐서 3개의 툴바를 생성합니다. 여기서 IDR_TOOLBAR1,..은 스튜디오의 자원관리 항목에서 insert해서, 자신의 툴바를 간단히 만들고, 그 아이디를 만들어 주시면 됩니다.

 

/* CMainFrame.h */

        CToolBar    m_wndToolBar1;

        CToolBar    m_wndToolBar2;

        CToolBar    m_wndToolBar3;

 

/* CMainFrame.cpp */

if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP  |

    CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)

    ||  !m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1)){

                TRACE0("Failed to create toolbar\n");

                return -1;      // fail to create

}

if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP  |

    CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)

    ||  !m_wndToolBar2.LoadToolBar(IDR_TOOLBAR2)){

                TRACE0("Failed to create toolbar\n");

                return -1;      // fail to create

}

if (!m_wndToolBar3.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP  |

    CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)

    ||  !m_wndToolBar3.LoadToolBar(IDR_TOOLBAR3)){

                TRACE0("Failed to create toolbar\n");

                return -1;      // fail to create

}
 

 

위와 같이 교체한 뒤에는 이에대한 속성을 지정합니다. 도킹여부와 그 툴바의 툴팁을 적을 수 있습니다.

 

m_wndToolBar1.SetWindowText("1번 툴바입니다.");
m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

...

DockControlBar(&m_wndToolBar1, AFX_IDW_DOCKBAR_TOP);
...

LocateToolBar(this, &m_wndToolBar1, &m_wndToolBar2);     // 정의된 명령어가 아닙니다.
...
 

첫 번째 라인은 툴바에 툴팁을 적용시킴을 의미합니다. 그리고 다음행은, 토킹툴바를 사용할 수 있도록 해 줍니다.만일 도킹툴바로써 움직이지 못하게 할려면, 아래 두줄을 제거하면 되겠죠 ? 그리고, 위와같이 나머지 두 개도 그 밑으로 적어주면 됩니다.(첫번째 ...부분에 적습니다.) CBRS_ALIGN_ANY는 프레임 윈도우에 속하는 모든 툴바는 프레임윈도우의 위쪽아래쪽 양옆 모두 붙을 수 있음을 의미합니다.

그리고는 프레임 윈도우에 도킹툴바를 붙이는 작업이 오게 됩니다. 여기서, 인자를 살펴보면, this 포인터를 이용하며, 이 어플리케이션의 CMainFrame 오브젝트를 가리키게 됩니다. 그리고, 두 번째와 세 번째 인자순으로 툴바를 위치시킵니다.(만약에 LocateToolBar를 쓰지 않을 경우, 디폴트로 세로로 나열이 됩니다.) 이 코드는 아래와 같이 프레임클래스에 추가합니다.

 

 

void CMainFrame::LocateToolBar(CFrameWnd *pFW, CToolBar *pBar1, CToolBar *pBar2)
{

DWORD dw;
int n=0;
CRect rect;

pFW->RecalcLayout();
pBar1->GetWindowRect(&rect);
rect.OffsetRect(1,0);
dw=pBar1->GetBarStyle();
n = (dw & CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;
n = (dw & CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;
n = (dw & CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;
n = (dw & CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;

pFW->DockControlBar(pBar2, n, &rect);

}
 

자.. 이러면, 일단 툴바의 생성은 끝이 납니다. 이제 본격적으로 위의 데이터를 레지스트리에 저장하고, 복원하는 방법에 대해 알아보겠습니다. 이 작업은 의외로 간단합니다. 먼저, LocateToolBar명령어 바로 앞에 아래와 같이 작성합니다.

 

LoadBarState("ToolBarState");

 

이것은 복구에 대한 문장입니다. 그렇다면, 먼저번의 프로그램의 툴바 데이터를 저장해야겠죠 ? 그렇게하기위해서는 종료시킬 때 사용되는 onClose함수에 다음과 같이 코딩을합니다.

 

void CMainFrame::OnClose()

SaveBarState("ToolBarState");

}
 

간단하게 끝났죠 ? 이렇게 함으로써, 복구와 저장이 끝났습니다.

레지스트리 다루는 프로그램 작성시 주의사항~

레지스트리를 다룰 경우, 시행착오를 격으면서, 레지스트리상에 데이터 때문에 ASSERT가 걸리거나, 에러가 발생할 수 있습니다. 이 경우에는 레지스트리에 있는 값을 제거한뒤에 다시 실행시켜야 합니다.

먼저 regedit.exe를 실행하면 레지스트리 편집기가 나오죠 ? 보통 어플리케이션의 정보가 레지스트리에 등록되는 곳은 HKEY_CURRENT_USER와 HKEY_LOCAL_MACHINE이라는 항목에 저장이 됩니다. 그 항목에 가서 오른쪽 마우스를 누른뒤 찾기 항목에서 어플리케이션의 이름을 찾습니다. 일단 찾게 되면, 그것을 모두 지워주고나, 툴바에 관련된 정보를 지워주면 됩니다.

참고로, 혹시 찾아도 안나타나면, F5키를 눌러 재 갱신해 주셔야 합니당~

반응형

댓글