BOOL Create( CWnd* pParentWnd,  
             DWORD dwStyle = WS_CHILD   ¦ WS_VISIBLE   ¦ CBRS_TOP,  
             UINT nID = AFX_IDW_TOOLBAR  
           );  
中,nID是工具条子窗口的ID,由于每个工具条的ID都不一样,为什么会有缺省值AFX_IDW_TOOLBAR?不是必须用户指定吗?如果我创建了几个工具条,岂不每个工具条的ID都一样了?(试过了,创建几个都可以), 请大哥尽快帮小弟一把!!!谢谢谢谢! 
参数nID到底是指向什么?工具条的ID?MSDN说是“nID--The toolbar’s child-window ID.”,这该翻译成“工具条的子窗口的ID”吗?指工具条本身还是工具条的子窗口,如果是工具条的子窗口,那么谁是工具条的子窗口?还有,工具条内所有按钮图标是建立在一个位图上的,可是每个按钮也都有自己的ID啊,怎么会共有一个ID呢?不然怎么响应啊?我在Create()中随便用几个整数代替AFX_IDW_TOOLBAR,也完全一样,看不出有什么区别,  
到底这个nID和工具条有啥关系????? 
      大哥,感激不尽!(我是菜鸟,呵呵)  

解决方案 »

  1.   

    你很坚持,不过有些东西不一定有合理的答案的。有时要放弃一些细节,否则学习进度就受影响了。经过单步跟踪,这个id只在两个地方使用
    一个是在下面函数中设置风格:BOOL CToolBar::CreateEx(CWnd* pParentWnd, DWORD dwCtrlStyle, DWORD dwStyle, CRect rcBorders, UINT nID)
    {
    ASSERT_VALID(pParentWnd);   // must have a parent
    ASSERT (!((dwStyle & CBRS_SIZE_FIXED) && (dwStyle & CBRS_SIZE_DYNAMIC))); SetBorders(rcBorders); // save the style
    m_dwStyle = (dwStyle & CBRS_ALL);
    if (nID == AFX_IDW_TOOLBAR)
    m_dwStyle |= CBRS_HIDE_INPLACE; dwStyle &= ~CBRS_ALL;
    dwStyle |= CCS_NOPARENTALIGN|CCS_NOMOVEY|CCS_NODIVIDER|CCS_NORESIZE;
    dwStyle |= dwCtrlStyle; // initialize common controls
    VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTL_BAR_REG));
    _AfxGetComCtlVersion();
    ASSERT(_afxComCtlVersion != -1);
    _AfxGetDropDownWidth();
    ASSERT(_afxDropDownWidth != -1); // create the HWND
    CRect rect; rect.SetRectEmpty();
    if (!CWnd::Create(TOOLBARCLASSNAME, NULL, dwStyle, rect, pParentWnd, nID))
    return FALSE; // sync up the sizes
    SetSizes(m_sizeButton, m_sizeImage); // Note: Parent must resize itself for control bar to be resized return TRUE;
    }
    另外一个则是在后面函数中映射为HMENUBOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
    LPCTSTR lpszWindowName, DWORD dwStyle,
    int x, int y, int nWidth, int nHeight,
    HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
    {
    // allow modification of several common create parameters
    CREATESTRUCT cs;
    cs.dwExStyle = dwExStyle;
    cs.lpszClass = lpszClassName;
    cs.lpszName = lpszWindowName;
    cs.style = dwStyle;
    cs.x = x;
    cs.y = y;
    cs.cx = nWidth;
    cs.cy = nHeight;
    cs.hwndParent = hWndParent;
    cs.hMenu = nIDorHMenu;
    cs.hInstance = AfxGetInstanceHandle();
    cs.lpCreateParams = lpParam; if (!PreCreateWindow(cs))
    {
    PostNcDestroy();
    return FALSE;
    } AfxHookWindowCreate(this);
    HWND hWnd = ::CreateWindowEx(cs.dwExStyle, cs.lpszClass,
    cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy,
    cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);#ifdef _DEBUG
    if (hWnd == NULL)
    {
    TRACE1("Warning: Window creation failed: GetLastError returns 0x%8.8X\n",
    GetLastError());
    }
    #endif if (!AfxUnhookWindowCreate())
    PostNcDestroy();        // cleanup if CreateWindowEx fails too soon if (hWnd == NULL)
    return FALSE;
    ASSERT(hWnd == m_hWnd); // should have been set in send msg hook
    return TRUE;
    }
    因此MSDN在这个问题上描述的并不准确,也许VC6根本没有怎么真正使用这个ID。对于CToolBar,你还是只用那个缺省的id吧。
    所谓子窗口的id,和你的控件Id无关,是用于一个父窗口管理自己的子窗口的。但是windows到底怎么使用这个子窗口id,我们就不知道了
      

  2.   

    拷贝错一个函数,nIDorHMenu就是你说的ID,参见
    BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
    LPCTSTR lpszWindowName, DWORD dwStyle,
    const RECT& rect, CWnd* pParentWnd, UINT nID,
    LPVOID lpParam /* = NULL */)
    {
    return CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,
    rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
    pParentWnd->GetSafeHwnd(), (HMENU)nID, lpParam);
    }
      

  3.   

    这个ID就是ToolBarCtrl的窗口ID。框架窗口中的每个子窗口都有一个ID,类似于对话框中的控件ID,可以用GetDlgItem等函数根据窗口ID查找子窗口。这个ID的值并不重要。