最好列一个表出来,以后好用,书上的太散了。
随便问一个白痴问题:宏max(参数1,参数2)和min(参数1,参数2)功能是什么?参数又是什么。

解决方案 »

  1.   

    太多了,还是用到具体的消息再看msdn吧。
    max返回参数1,参数2中的大者,参数类型可以随便,但参数1,参数2的类型必须一致。min返回小者。
      

  2.   

    这个问题太不好回答了,因为当初设计这两个参数的时候并没有定死了他的具体含义,你甚至可以自定义它,例如在跟 EDIT 通用空间通信的时候会有另外的含义, 如果你以后在自己的程序里使用 SendMessage 来跟自定义的控件通信的话,也许你会有自己重新定义的含义。 宏max(参数1,参数2)和min(参数1,参数2)最主要的是看看 宏的返回值,参数1,参数2 是随便两个数, 宏max(参数1,参数2)返回其中大的那个参数,另外一个正好相反。
      

  3.   

    这种东西只能查MSDN,因为实在太多了,用到的时候再查嘛
      

  4.   

    It depends on special message :)
      

  5.   

    u'd see more details via MSDN
      

  6.   

    这就说不准了,参数是void类型的,你可以传自定义的类型,然后强制转换过来用。
      

  7.   

    lParam和wParam是参数的类型,这是MFC的基本数据类型,在 <<深入浅出MFC>>
    中有他的解释
      

  8.   

    对于不同的消息,lParam和wParam有不同的意义,用到时再看吧
      

  9.   

    这个共用体中全都有:union MessageMapFunctions;
    LRESULT lResult = 0; // special case for commands
    if (message == WM_COMMAND)
    {
    if (OnCommand(wParam, lParam))
    {
    lResult = 1;
    goto LReturnTrue;
    }
    return FALSE;
    } // special case for notifies
    if (message == WM_NOTIFY)
    {
    NMHDR* pNMHDR = (NMHDR*)lParam;
    if (pNMHDR->hwndFrom != NULL && OnNotify(wParam, lParam, &lResult))
    goto LReturnTrue;
    return FALSE;
    } // special case for activation
    if (message == WM_ACTIVATE)
    _AfxHandleActivate(this, wParam, CWnd::FromHandle((HWND)lParam)); // special case for set cursor HTERROR
    if (message == WM_SETCURSOR &&
    _AfxHandleSetCursor(this, (short)LOWORD(lParam), HIWORD(lParam)))
    {
    lResult = 1;
    goto LReturnTrue;
    } const AFX_MSGMAP* pMessageMap; pMessageMap = GetMessageMap();
    UINT iHash; iHash = (LOWORD((DWORD)pMessageMap) ^ message) & (iHashMax-1);
    AfxLockGlobals(CRIT_WINMSGCACHE);
    AFX_MSG_CACHE* pMsgCache; pMsgCache = &_afxMsgCache[iHash];
    const AFX_MSGMAP_ENTRY* lpEntry;
    if (message == pMsgCache->nMsg && pMessageMap == pMsgCache->pMessageMap)
    {
    // cache hit
    lpEntry = pMsgCache->lpEntry;
    AfxUnlockGlobals(CRIT_WINMSGCACHE);
    if (lpEntry == NULL)
    return FALSE; // cache hit, and it needs to be handled
    if (message < 0xC000)
    goto LDispatch;
    else
    goto LDispatchRegistered;
    }
    else
    {
    // not in cache, look for it
    pMsgCache->nMsg = message;
    pMsgCache->pMessageMap = pMessageMap;#ifdef _AFXDLL
    for (/* pMessageMap already init'ed */; pMessageMap != NULL;
    pMessageMap = (*pMessageMap->pfnGetBaseMap)())
    #else
    for (/* pMessageMap already init'ed */; pMessageMap != NULL;
    pMessageMap = pMessageMap->pBaseMap)
    #endif
    {
    // Note: catch not so common but fatal mistake!!
    //      BEGIN_MESSAGE_MAP(CMyWnd, CMyWnd)
    #ifdef _AFXDLL
    ASSERT(pMessageMap != (*pMessageMap->pfnGetBaseMap)());
    #else
    ASSERT(pMessageMap != pMessageMap->pBaseMap);
    #endif if (message < 0xC000)
    {
    // constant window message
    if ((lpEntry = AfxFindMessageEntry(pMessageMap->lpEntries,
    message, 0, 0)) != NULL)
    {
    pMsgCache->lpEntry = lpEntry;
    AfxUnlockGlobals(CRIT_WINMSGCACHE);
    goto LDispatch;
    }
    }
    else
    {
    // registered windows message
    lpEntry = pMessageMap->lpEntries;
    while ((lpEntry = AfxFindMessageEntry(lpEntry, 0xC000, 0, 0)) != NULL)
    {
    UINT* pnID = (UINT*)(lpEntry->nSig);
    ASSERT(*pnID >= 0xC000 || *pnID == 0);
    // must be successfully registered
    if (*pnID == message)
    {
    pMsgCache->lpEntry = lpEntry;
    AfxUnlockGlobals(CRIT_WINMSGCACHE);
    goto LDispatchRegistered;
    }
    lpEntry++;      // keep looking past this one
    }
    }
    } pMsgCache->lpEntry = NULL;
    AfxUnlockGlobals(CRIT_WINMSGCACHE);
    return FALSE;
    }
    ASSERT(FALSE);      // not reachedLDispatch:
    ASSERT(message < 0xC000);
    union MessageMapFunctions mmf;
    mmf.pfn = lpEntry->pfn; // if we've got WM_SETTINGCHANGE / WM_WININICHANGE, we need to
    // decide if we're going to call OnWinIniChange() or OnSettingChange() int nSig;
    nSig = lpEntry->nSig;
    if (lpEntry->nID == WM_SETTINGCHANGE)
    {
    DWORD dwVersion = GetVersion();
    if (LOBYTE(LOWORD(dwVersion)) >= 4)
    nSig = AfxSig_vws;
    else
    nSig = AfxSig_vs;
    }
      

  10.   

    switch (nSig)
    {
    default:
    ASSERT(FALSE);
    break; case AfxSig_bD:
    lResult = (this->*mmf.pfn_bD)(CDC::FromHandle((HDC)wParam));
    break; case AfxSig_bb:     // AfxSig_bb, AfxSig_bw, AfxSig_bh
    lResult = (this->*mmf.pfn_bb)((BOOL)wParam);
    break; case AfxSig_bWww:   // really AfxSig_bWiw
    lResult = (this->*mmf.pfn_bWww)(CWnd::FromHandle((HWND)wParam),
    (short)LOWORD(lParam), HIWORD(lParam));
    break; case AfxSig_bWCDS:
    lResult = (this->*mmf.pfn_bWCDS)(CWnd::FromHandle((HWND)wParam),
    (COPYDATASTRUCT*)lParam);
    break; case AfxSig_bHELPINFO:
    lResult = (this->*mmf.pfn_bHELPINFO)((HELPINFO*)lParam);
    break; case AfxSig_hDWw:
    {
    // special case for OnCtlColor to avoid too many temporary objects
    ASSERT(message == WM_CTLCOLOR);
    AFX_CTLCOLOR* pCtl = (AFX_CTLCOLOR*)lParam;
    CDC dcTemp; dcTemp.m_hDC = pCtl->hDC;
    CWnd wndTemp; wndTemp.m_hWnd = pCtl->hWnd;
    UINT nCtlType = pCtl->nCtlType;
    // if not coming from a permanent window, use stack temporary
    CWnd* pWnd = CWnd::FromHandlePermanent(wndTemp.m_hWnd);
    if (pWnd == NULL)
    {
    #ifndef _AFX_NO_OCC_SUPPORT
    // determine the site of the OLE control if it is one
    COleControlSite* pSite;
    if (m_pCtrlCont != NULL && (pSite = (COleControlSite*)
    m_pCtrlCont->m_siteMap.GetValueAt(wndTemp.m_hWnd)) != NULL)
    {
    wndTemp.m_pCtrlSite = pSite;
    }
    #endif
    pWnd = &wndTemp;
    }
    HBRUSH hbr = (this->*mmf.pfn_hDWw)(&dcTemp, pWnd, nCtlType);
    // fast detach of temporary objects
    dcTemp.m_hDC = NULL;
    wndTemp.m_hWnd = NULL;
    lResult = (LRESULT)hbr;
    }
    break; case AfxSig_hDw:
    {
    // special case for CtlColor to avoid too many temporary objects
    ASSERT(message == WM_REFLECT_BASE+WM_CTLCOLOR);
    AFX_CTLCOLOR* pCtl = (AFX_CTLCOLOR*)lParam;
    CDC dcTemp; dcTemp.m_hDC = pCtl->hDC;
    UINT nCtlType = pCtl->nCtlType;
    HBRUSH hbr = (this->*mmf.pfn_hDw)(&dcTemp, nCtlType);
    // fast detach of temporary objects
    dcTemp.m_hDC = NULL;
    lResult = (LRESULT)hbr;
    }
    break; case AfxSig_iwWw:
    lResult = (this->*mmf.pfn_iwWw)(LOWORD(wParam),
    CWnd::FromHandle((HWND)lParam), HIWORD(wParam));
    break; case AfxSig_iww:
    lResult = (this->*mmf.pfn_iww)(LOWORD(wParam), HIWORD(wParam));
    break; case AfxSig_iWww:   // really AfxSig_iWiw
    lResult = (this->*mmf.pfn_iWww)(CWnd::FromHandle((HWND)wParam),
    (short)LOWORD(lParam), HIWORD(lParam));
    break; case AfxSig_is:
    lResult = (this->*mmf.pfn_is)((LPTSTR)lParam);
    break; case AfxSig_lwl:
    lResult = (this->*mmf.pfn_lwl)(wParam, lParam);
    break; case AfxSig_lwwM:
    lResult = (this->*mmf.pfn_lwwM)((UINT)LOWORD(wParam),
    (UINT)HIWORD(wParam), (CMenu*)CMenu::FromHandle((HMENU)lParam));
    break; case AfxSig_vv:
    (this->*mmf.pfn_vv)();
    break; case AfxSig_vw: // AfxSig_vb, AfxSig_vh
    (this->*mmf.pfn_vw)(wParam);
    break; case AfxSig_vww:
    (this->*mmf.pfn_vww)((UINT)wParam, (UINT)lParam);
    break; case AfxSig_vvii:
    (this->*mmf.pfn_vvii)((short)LOWORD(lParam), (short)HIWORD(lParam));
    break; case AfxSig_vwww:
    (this->*mmf.pfn_vwww)(wParam, LOWORD(lParam), HIWORD(lParam));
    break; case AfxSig_vwii:
    (this->*mmf.pfn_vwii)(wParam, LOWORD(lParam), HIWORD(lParam));
    break; case AfxSig_vwl:
    (this->*mmf.pfn_vwl)(wParam, lParam);
    break; case AfxSig_vbWW:
    (this->*mmf.pfn_vbWW)(m_hWnd == (HWND)lParam,
    CWnd::FromHandle((HWND)lParam),
    CWnd::FromHandle((HWND)wParam));
    break; case AfxSig_vD:
    (this->*mmf.pfn_vD)(CDC::FromHandle((HDC)wParam));
    break; case AfxSig_vM:
    (this->*mmf.pfn_vM)(CMenu::FromHandle((HMENU)wParam));
    break; case AfxSig_vMwb:
    (this->*mmf.pfn_vMwb)(CMenu::FromHandle((HMENU)wParam),
    LOWORD(lParam), (BOOL)HIWORD(lParam));
    break; case AfxSig_vW:
    (this->*mmf.pfn_vW)(CWnd::FromHandle((HWND)wParam));
    break; case AfxSig_vW2:
    (this->*mmf.pfn_vW)(CWnd::FromHandle((HWND)lParam));
    break; case AfxSig_vWww:
    (this->*mmf.pfn_vWww)(CWnd::FromHandle((HWND)wParam), LOWORD(lParam),
    HIWORD(lParam));
    break; case AfxSig_vWp:
    {
    CPoint point((DWORD)lParam);
    (this->*mmf.pfn_vWp)(CWnd::FromHandle((HWND)wParam), point);
    }
    break; case AfxSig_vWh:
    (this->*mmf.pfn_vWh)(CWnd::FromHandle((HWND)wParam),
    (HANDLE)lParam);
    break; case AfxSig_vwW:
    (this->*mmf.pfn_vwW)(wParam, CWnd::FromHandle((HWND)lParam));
    break; case AfxSig_vwWb:
    (this->*mmf.pfn_vwWb)((UINT)(LOWORD(wParam)),
    CWnd::FromHandle((HWND)lParam), (BOOL)HIWORD(wParam));
    break; case AfxSig_vwwW:
    case AfxSig_vwwx:
    {
    // special case for WM_VSCROLL and WM_HSCROLL
    ASSERT(message == WM_VSCROLL || message == WM_HSCROLL ||
    message == WM_VSCROLL+WM_REFLECT_BASE || message == WM_HSCROLL+WM_REFLECT_BASE);
    int nScrollCode = (short)LOWORD(wParam);
    int nPos = (short)HIWORD(wParam);
    if (lpEntry->nSig == AfxSig_vwwW)
    (this->*mmf.pfn_vwwW)(nScrollCode, nPos,
    CWnd::FromHandle((HWND)lParam));
    else
    (this->*mmf.pfn_vwwx)(nScrollCode, nPos);
    }
    break; case AfxSig_vs:
    (this->*mmf.pfn_vs)((LPTSTR)lParam);
    break; case AfxSig_vws:
    (this->*mmf.pfn_vws)((UINT) wParam, (LPCTSTR)lParam);
    break; case AfxSig_vOWNER:
    (this->*mmf.pfn_vOWNER)((int)wParam, (LPTSTR)lParam);
    lResult = TRUE;
    break; case AfxSig_iis:
    lResult = (this->*mmf.pfn_iis)((int)wParam, (LPTSTR)lParam);
    break; case AfxSig_wp:
    {
    CPoint point((DWORD)lParam);
    lResult = (this->*mmf.pfn_wp)(point);
    }
    break; case AfxSig_wv: // AfxSig_bv, AfxSig_wv
    lResult = (this->*mmf.pfn_wv)();
    break; case AfxSig_vCALC:
    (this->*mmf.pfn_vCALC)((BOOL)wParam, (NCCALCSIZE_PARAMS*)lParam);
    break; case AfxSig_vPOS:
    (this->*mmf.pfn_vPOS)((WINDOWPOS*)lParam);
    break; case AfxSig_vwwh:
    (this->*mmf.pfn_vwwh)(LOWORD(wParam), HIWORD(wParam), (HANDLE)lParam);
    break; case AfxSig_vwp:
    {
    CPoint point((DWORD)lParam);
    (this->*mmf.pfn_vwp)(wParam, point);
    break;
    }
    case AfxSig_vwSIZING:
    (this->*mmf.pfn_vwl)(wParam, lParam);
    lResult = TRUE;
    break; case AfxSig_bwsp:
    lResult = (this->*mmf.pfn_bwsp)(LOWORD(wParam), (short) HIWORD(wParam),
    CPoint(LOWORD(lParam), HIWORD(lParam)));
    if (!lResult)
    return FALSE;
    }
      

  11.   

    以摘自:BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)