hermeskid吧 关注:61贴子:2,718
  • 11回复贴,共1

MFC窗口过程和三国志12窗口过程关于WM_DRAWITEM的对比

只看楼主收藏回复



IP属地:江西1楼2016-02-14 23:31回复
    先上CWnd,WindowProc->OnWndMsg->OnDrawItem
    WindowProc直接调用OnWndMsg
    LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    // OnWndMsg does most of the work, except for DefWindowProc call
    LRESULT lResult = 0;
    if (!OnWndMsg(message, wParam, lParam, &lResult))
    lResult = DefWindowProc(message, wParam, lParam);
    return lResult;
    }
    OnWndMsg获得msg后通过检索MESSAGE_MAP获得函数地址进行处理
    BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
    ·
    ·
    ·
    for (/* pMessageMap already init'ed */; pMessageMap->pfnGetBaseMap != NULL;//根据messageMap调用msg,包括WM_DRAWITEM
    pMessageMap = (*pMessageMap->pfnGetBaseMap)())
    {
    // Note: catch not so common but fatal mistake!!
    // BEGIN_MESSAGE_MAP(CMyWnd, CMyWnd)
    ASSERT(pMessageMap != (*pMessageMap->pfnGetBaseMap)());
    if (message < 0xC000)
    {
    // constant window message
    if ((lpEntry = AfxFindMessageEntry(pMessageMap->lpEntries,
    message, 0, 0)) != NULL)
    {
    pMsgCache->lpEntry = lpEntry;
    winMsgLock.Unlock();
    goto LDispatch;
    }
    }
    ·
    ·
    ·
    }
    BEGIN_MESSAGE_MAP(CWnd, CCmdTarget)
    ON_MESSAGE(WM_CTLCOLORSTATIC, &CWnd::OnNTCtlColor)
    ON_MESSAGE(WM_CTLCOLOREDIT, &CWnd::OnNTCtlColor)
    ON_MESSAGE(WM_CTLCOLORBTN, &CWnd::OnNTCtlColor)
    ON_MESSAGE(WM_CTLCOLORLISTBOX, &CWnd::OnNTCtlColor)
    ON_MESSAGE(WM_CTLCOLORDLG, &CWnd::OnNTCtlColor)
    ON_MESSAGE(WM_CTLCOLORMSGBOX, &CWnd::OnNTCtlColor)
    ON_MESSAGE(WM_CTLCOLORSCROLLBAR, &CWnd::OnNTCtlColor)
    ON_WM_SETFOCUS()
    ON_WM_DRAWITEM()
    ON_WM_MEASUREITEM()
    ON_WM_CTLCOLOR()
    ON_WM_COMPAREITEM()
    ON_WM_ENTERIDLE()
    ON_WM_HSCROLL()
    ON_WM_VSCROLL()
    ON_WM_DELETEITEM()
    ON_WM_CHARTOITEM()
    ON_WM_VKEYTOITEM()
    ON_WM_NCDESTROY()
    ON_WM_PARENTNOTIFY()
    ON_WM_SYSCOLORCHANGE()
    ON_WM_DEVMODECHANGE()
    ON_WM_HELPINFO()
    ON_WM_SETTINGCHANGE()
    ON_WM_DESTROY()
    ON_MESSAGE(WM_ACTIVATETOPLEVEL, &CWnd::OnActivateTopLevel)
    ON_WM_DISPLAYCHANGE()
    ON_REGISTERED_MESSAGE(CWnd::m_nMsgDragList, &CWnd::OnDragList)
    ON_MESSAGE(WM_GETOBJECT, &CWnd::OnGetObject)
    ON_MESSAGE(WM_TOUCH, &CWnd::OnTouchMessage)
    ON_MESSAGE(WM_TABLET_QUERYSYSTEMGESTURESTATUS, &CWnd::OnTabletQuerySystemGestureStatus)
    ON_MESSAGE(WM_GESTURE, &CWnd::OnGesture)
    END_MESSAGE_MAP()
    OnDrawItem将lpDrawItemStruct传递给子控件
    void CWnd::OnDrawItem(int /*nIDCtl*/, LPDRAWITEMSTRUCT lpDrawItemStruct)//获得WM_DRAWITEM并传递给子控件
    {
    if (lpDrawItemStruct->CtlType == ODT_MENU)
    {
    CMenu* pMenu = CMenu::FromHandlePermanent(
    (HMENU)lpDrawItemStruct->hwndItem);
    if (pMenu != NULL)
    {
    pMenu->DrawItem(lpDrawItemStruct);//如果是menu类型就调用子控件的DrawItem函数
    return; // eat it
    }
    }
    // reflect notification to child window control
    if (ReflectLastMsg(lpDrawItemStruct->hwndItem))
    return; // eat it
    // not handled - do default
    Default();
    }


    星座王
    点亮12星座印记,去领取
    活动截止:2100-01-01
    去徽章馆》
    IP属地:江西2楼2016-02-14 23:38
    回复
      2025-06-05 23:56:51
      广告
      三国志12窗口过程
      00682AB0 55 push ebp
      00682AB1 8BEC mov ebp,esp
      00682AB3 83E4 F8 and esp,0xFFFFFFF8
      00682AB6 81EC 14010000 sub esp,0x114
      00682ABC A1 A066E801 mov eax,dword ptr ds:[0x1E866A0]
      00682AC1 33C4 xor eax,esp
      00682AC3 898424 10010000 mov dword ptr ss:[esp+0x110],eax
      00682ACA 8B45 0C mov eax,dword ptr ss:[ebp+0xC]//消息
      00682ACD 8B4D 14 mov ecx,dword ptr ss:[ebp+0x14]
      00682AD0 53 push ebx
      00682AD1 56 push esi
      00682AD2 8B75 08 mov esi,dword ptr ss:[ebp+0x8]
      00682AD5 57 push edi
      00682AD6 8B7D 10 mov edi,dword ptr ss:[ebp+0x10]
      00682AD9 897424 0C mov dword ptr ss:[esp+0xC],esi
      00682ADD 894C24 10 mov dword ptr ss:[esp+0x10],ecx
      00682AE1 83F8 1C cmp eax,0x1C
      00682AE4 0F87 B9010000 ja 映雪.00682CA3//DrawItem=2B,跳
      00682AEA 0F84 3F010000 je 映雪.00682C2F
      00682AF0 83E8 05 sub eax,0x5//WM_SIZE
      00682AF3 0F84 ED000000 je 映雪.00682BE6
      00682AF9 48 dec eax//WM_ACTIVATE
      00682AFA 0F84 D7000000 je 映雪.00682BD7
      00682B00 83E8 0D sub eax,0xD//WM_QUERYOPEN
      00682B03 0F85 F4000000 jnz 映雪.00682BFD
      |
      00682CA3 3D 00020000 cmp eax,0x200
      00682CA8 0F87 04030000 ja 映雪.00682FB2
      00682CAE 0F84 E5020000 je 映雪.00682F99
      00682CB4 83C0 E0 add eax,-0x20
      00682CB7 3D F7000000 cmp eax,0xF7
      00682CBC ^ 0F87 3BFFFFFF ja 映雪.00682BFD
      00682CC2 0FB680 28316800 movzx eax,byte ptr ds:[eax+0x683128]
      00682CC9 ^ FF2485 FC306800 jmp dword ptr ds:[eax*4+0x6830FC] ; 映雪.00682BFD
      |
      00682BFD 8B5424 10 mov edx,dword ptr ss:[esp+0x10]
      00682C01 8B4424 0C mov eax,dword ptr ss:[esp+0xC]
      00682C05 8B4D 0C mov ecx,dword ptr ss:[ebp+0xC]
      00682C08 52 push edx
      00682C09 50 push eax
      00682C0A 8BC7 mov eax,edi
      00682C0C E8 AF927001 call 映雪.01D8BEC0
      |
      01D8BEC0 55 push ebp
      01D8BEC1 8BEC mov ebp,esp
      01D8BEC3 51 push ecx
      01D8BEC4 53 push ebx
      01D8BEC5 8B5D 0C mov ebx,dword ptr ss:[ebp+0xC]
      01D8BEC8 56 push esi
      01D8BEC9 8BF1 mov esi,ecx//消息
      01D8BECB 57 push edi
      01D8BECC 8BF8 mov edi,eax
      01D8BECE 83FE 10 cmp esi,0x10
      01D8BED1 0F87 89000000 ja 映雪.01D8BF60//DrawItem=2B,跳
      01D8BED7 74 61 je X映雪.01D8BF3A
      01D8BED9 8BC6 mov eax,esi
      01D8BEDB 83E8 02 sub eax,0x2//WM_DESTROY
      01D8BEDE 74 4B je X映雪.01D8BF2B
      01D8BEE0 83E8 05 sub eax,0x5//WM_SETFOCUS
      01D8BEE3 74 23 je X映雪.01D8BF08
      01D8BEE5 83E8 08 sub eax,0x8//WM_PAINT
      01D8BEE8 0F85 85000000 jnz 映雪.01D8BF73
      01D8BEEE E8 9DFBFFFF call 映雪.01D8BA90
      |
      01D8BF60 8BC6 mov eax,esi
      01D8BF62 83E8 14 sub eax,0x14
      01D8BF65 ^ 74 BA je X映雪.01D8BF21
      01D8BF67 2D FB020000 sub eax,0x2FB
      01D8BF6C ^ 74 B3 je X映雪.01D8BF21
      01D8BF6E 83E8 02 sub eax,0x2
      01D8BF71 ^ 74 AE je X映雪.01D8BF21
      01D8BF73 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
      01D8BF76 53 push ebx
      01D8BF77 E8 54FDFFFF call 映雪.01D8BCD0
      |
      01D8BCF3 81FE 1A010000 cmp esi,0x11A
      01D8BCF9 77 31 ja X映雪.01D8BD2C
      01D8BCFB 81FE 19010000 cmp esi,0x119
      01D8BD01 73 42 jnb X映雪.01D8BD45
      01D8BD03 8D46 E6 lea eax,dword ptr ds:[esi-0x1A]
      01D8BD06 3D F9000000 cmp eax,0xF9
      01D8BD0B 77 55 ja X映雪.01D8BD62
      01D8BD0D 0FB690 78BDD801 movzx edx,byte ptr ds:[eax+0x1D8BD78]//WM_DRAWITEM=2B,未处理
      01D8BD14 FF2495 6CBDD801 jmp dword ptr ds:[edx*4+0x1D8BD6C]
      01D8BD1B 83FF 69 cmp edi,0x69
      01D8BD1E 75 42 jnz X映雪.01D8BD62
      01D8BD20 E8 EB020000 call 映雪.01D8C010


      星座王
      点亮12星座印记,去领取
      活动截止:2100-01-01
      去徽章馆》
      IP属地:江西6楼2016-02-14 23:59
      回复
        通过过程研究出程序所用框架也不是难事,有了相同的框架,加UI会更加轻松


        星座王
        点亮12星座印记,去领取
        活动截止:2100-01-01
        去徽章馆》
        IP属地:江西来自Android客户端8楼2016-02-15 00:43
        回复


          IP属地:上海10楼2016-02-15 09:16
          收起回复


            IP属地:浙江12楼2016-02-15 14:15
            收起回复
              可啪的H喵


              IP属地:福建14楼2016-02-19 16:53
              收起回复
                😨😨


                IP属地:江苏来自Android客户端15楼2016-07-14 23:08
                回复