2009-06-30 5 views

답변

6

난 당신이 "표준 방식"무슨 뜻인지 잘 모르겠지만, 당신은 확실히 프로그래밍 방식으로 그것을 할 수 있습니다 : 명령이 dialog-이 어디

// In MyDlg.h 
class CMyDlg : public CDialog 
{ 
... 
    CMFCToolBar m_ToolBar; 
... 
}; 

// In MyDlg.cpp 
BOOL CMyDlg::OnInitDialog() 
{ 
... 
    if(m_ToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, 100)) 
    { 
     m_ToolBar.SetPaneStyle(m_ToolBar.GetPaneStyle() 
      & ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_ANY)); 

     m_ToolBar.InsertButton(CMFCToolBarButton(ID_APP_ABOUT, -1, _T("About"))); 
     m_ToolBar.InsertButton(CMFCToolBarButton(ID_APP_EXIT, -1, _T("Exit"))); 

     CSize sizeToolBar = m_ToolBar.CalcFixedLayout(FALSE, TRUE); 
     m_ToolBar.SetWindowPos(NULL, 0, 0, sizeToolBar.cx, sizeToolBar.cy, 
      SWP_NOACTIVATE | SWP_NOZORDER); 
    } 
... 
} 
+0

감사합니다. 이것은 나를 위해 잘 작동합니다. – mem64k

+0

LoadToolBar를 사용하여 리소스에서 ToolBar를로드 할 수도 있습니다. –

0

위의 OnInitDialog는 경우를 제외하고는 잘 작동 하는가 유일한 명령.

응용 프로그램 또는 메인 프레임 처리기가 없으면 버튼 자체가 비활성화되고 처리기가 호출되지 않습니다. ID_APP_ABOUTID_APP_EXIT에는 이미 CWinAppEx 처리기가 있으므로 위 코드가 올바르게 라우팅됩니다.

OnCmdMsg을 덮어 쓰지 않아도되는 해결 방법은 응용 프로그램 또는 기본 프레임 수준에서 처리기를 추가하는 것입니다. 그러면 도구 모음이 활성 상태로 유지되고 해당 대화 상자 처리기로 올바르게 이동합니다. CMainFrame에 간단한 void 처리기를 추가하면 트릭 (아래 샘플 코드)이 수행됩니다. void 처리기가 호출되지 않습니다.

BOOL CMyDlg::OnInitDialog()      
{      
    ... 
    m_ToolBar.InsertButton(CMFCToolBarButton(**ID_DLG_COMMAND**, -1, _T("DlgCommand"))); 
    ...  
}  

//CMainFrame 
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx) 
... 
    ON_COMMAND(**ID_DLG_COMMAND**, VoidHandler) 
END_MESSAGE_MAP() 

void CMainFrame::VoidHandler() 
{ 
    assert(0); 
} 
1

만 처리해야하는 경우 대화 전용 트릭을 FALSE로 SetRouteCommandsViaFrame을 설정하는 명령. 그런 다음 소유자 (대개 대화 상자)가 주 프레임 대신 명령에 사용됩니다.

관련 문제