2009-01-15 3 views
4

MFC 기능 팩의 일부 클래스를 사용하여 내 MFC 응용 프로그램의 모양을 향상하려고합니다. &CMFCRebar를 사용하여 허용 가능한 룩앤필을 만드는 방법은 무엇입니까?

내 응용 프로그램에서는 하나의 CReBar 개체를 사용하여 세 개의 다른 도구 모음을 도킹합니다. 이 객체의 클래스를 CMFCReBar를 사용하도록 업데이트했지만 시각적 스타일을 사용할 때 좋지 않습니다.

패키지와 함께 배포 된 RebarTest 예제에서도 기능 팩에 문제가있는 것 같습니다.

이것은 단지 오피스 2007의 시각적 스타일을 변경 예제 응용 프로그램의 스크린 샷 (응용 프로그램을 사용하여 메뉴를하지 코드에 의해.)되어

Screenshot of RebarTest example application http://img105.imageshack.us/img105/1057/rebartestep5.png

아무도 성공적으로 CMFCReBar 사용 했습니까? 그것을 사용하지 않고도 동일한 목표를 달성 할 수있는 다른 방법이 있습니까?

답변

1

Paul DiLascia는 class을 작성하여 CToolBar를 잠 그니,이 클래스를 사용하여 CMFCToolbar에서 작동합니다. CMFCMenuBar와 똑같은 일을하도록 복사 할 수 있습니다. MFCToolBar를 MFCMenuBar로 변경하면 완료됩니다.

alt text http://i40.tinypic.com/9sv3vm.jpg

class CLockedMFCToolBar : public CMFCToolBar 
{ 
public: 
    CLockedMFCToolBar() : CMFCToolBar() {} 

protected: 
    LRESULT CLockedMFCToolBar::WindowProc(UINT msg, WPARAM wp, LPARAM lp) 
    { 
     if ((msg==WM_LBUTTONDOWN || msg==WM_LBUTTONDBLCLK)) 
     { 
      // Got click or double-click and toolbar is locked: if mouse in "dead 
      // zone" then ignore the message--don't pass to control bar 
      CPoint pt(lp); 
      if (OnToolHitTest(pt, NULL) == -1) 
       return 0; // return without handling: bypass control bar dragging! 
     } 
     // pass unhandled messages subclassed window--this is important!*/ 
     return CMFCToolBar::WindowProc(msg, wp, lp); 
    } 
}; 


////////////////////////////// 
// in CMainFrame declaration 
protected: 
    CLockedMFCMenuBar m_wndMenuBar; 
    CLockedMFCToolBar m_wndToolBar1; 
    CLockedMFCToolBar m_wndToolBar2; 


//////////////////////////// 
// in 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(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) 
{ 
    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(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) 
{ 
    TRACE0("Failed to create toolbar\n"); 
    return -1;  // fail to create 
} 

EnableDocking(CBRS_ALIGN_ANY); 
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); 
m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY); 
m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY); 
DockPane(&m_wndMenuBar); 
DockPane(&m_wndToolBar2); 
DockPane(&m_wndToolBar1); 
DockPaneLeftOf(&m_wndToolBar1, &m_wndToolBar2); 

m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() & 
      ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT)); 
m_wndToolBar1.SetPaneStyle(m_wndToolBar1.GetPaneStyle() & 
      ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT)); 
m_wndToolBar2.SetPaneStyle(m_wndToolBar2.GetPaneStyle() & 
      ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT)); 
+0

감사! 그게 내가 찾고 있던 것 같아. 한 가지 방법은 도구 모음을 어떻게 만듭니 까? Create/CreateEx 명령에서 사용하는 스타일을 의미합니다. –

+0

작성 코드를 수정했습니다. MFC 마법사가 만든 모든 것입니다. 다음 줄을 주석 처리하여 각 도구 모음의 끝에있는 더러운 추가/제거 단추를 제거 할 수도 있습니다. \t //m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); – demoncodemonkey

0

Office 2007 스타일을 사용할 때 약간의 시각적 인 문제가 있음을 알았습니다. 이는 약간 버그가있는 것 같습니다. 대신 다른 하나를 사용할 수 있습니까? XP 루나는 꽤 안정적인 것 같습니다 ...

+0

헤이 스투! 귀하의 의견에 감사드립니다. 문제는 다른 스타일에서도 발생합니다. 그다지 분명하지 않지만 시각적으로 "결함"이 있습니다. –

+0

네, 저는 다른 스타일에도 문제가있는 것을 보았습니다.하지만 Office 2007만큼 나쁘지는 않습니다. 당신이 평범하지 않은 것을 조금이라도하려고 할 때까지는 테마가 주로 작동하는 것 같습니다. –

2

기본적으로 철근 컨트롤을 더 이상 사용할 필요가 없습니다. 단순히 CMFCToolbars와 CMFCMenuBar를 생성하고 EnableDocking을 호출 한 다음 각각에 DockPane을 사용하면 Office 2007 (또는 사용하는 다른 테마)의 모양과 느낌을 결합하여 가져옵니다. 워드 패드 기능 팩 샘플을 확인하거나 예제를 보려면 응용 프로그램 마법사를 사용하여 새 프로젝트를 만듭니다 (기본 설정이 모두 기본입니다).

의견에서 Ok : 툴바를 서로 옆에 고정하려면 DockPane 다음에 DockPaneLeftOf를 사용할 수 있습니다. 두 도구 모음을 처음에 DockPane으로 만들지 않으면 내 경험상 툴바 배치로 이상하게 작동하는 경향이 있습니다.

도구 모음이 서로 끌어 당기는 동안 도구 모음이 멈추지 않도록하는 간단한 해결책을 찾지 못했지만 CBRS_GRIPPER 스타일을 제거 할 수는 있지만 도구 모음이 끌리지는 않습니다.

메뉴 모음이나 도구 모음에서 EnableDocking을 호출하면 안됩니다. 그러면 고정 된 장소가됩니다. 그러나 DockPaneLeftOf는이 경우에는 작동하지 않는 것 같아서 서로 옆에 툴바를 고정시키지 않아도됩니다.

도킹을 중지하거나 툴바를 서로 가로 놓기를 원한다면 지금처럼 보일 것입니다.

+0

안녕하세요 Alisdair Walker, 답장을 보내 주셔서 감사합니다. 어쩌면 당신이 옳고 문제는 내가 올바른 컨트롤을 사용하지 않는다는 것입니다. 하지만 내 도구 모음을 사용자가 도킹 해제하지 않기를 원하며 같은 행에 세 개의 도구 모음이 필요합니다. 저를 도와 주실 수 있습니까? –

관련 문제