代码之家  ›  专栏  ›  技术社区  ›  John Smith

如何子类Windows公共控件?

  •  2
  • John Smith  · 技术社区  · 9 年前

    我有个问题。 我的TreeView子类如下:

    SetWindowSubclass(hTV, SubClassProc, 0, 0);
    

    其中hTv-CreateWindowEx生成的WC_TREEVIEW窗口的句柄。 这是我的SubClassProc:

    LRESULT CALLBACK    SubClassProc(HWND hWnd, UINT uMsg, WPARAM wParam,
                                     LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
    {
        switch (uMsg)
        {
        case TVM_EXPAND:
            // This line of code is never executed
            MessageBox(NULL, _T("I'm expanded"), _T("TreeView"), MB_ICONINFORMATION);
            break;
        case WM_NCDESTROY:
            RemoveWindowSubclass(hWnd, SubClassProc, uIdSubclass);
            break;
        }
    
        return DefSubclassProc(hWnd, uMsg, wParam, lParam);
    }
    

    为什么我不能处理TVM_EXPAND消息?我的代码有什么问题?

    我上传了我的项目 here .

    1 回复  |  直到 9 年前
        1
  •  3
  •   Barmak Shemirani    9 年前

    这在主窗口过程中处理。在这种情况下不需要子类。

    检查 TVN_ITEMEXPANDED ,这是项目展开时收到的通知。邮寄 TVM_EXPAND 消息。

    另请参见:
    - TreeView send M essages (例如: TVM_EXPAND(电视扩展) )
    - TreeView receive N otifications (例如: TVN_item展开 )

    BOOL CALLBACK mainProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lParam)
    {
        switch (msg)
        {
    
        case WM_NOTIFY:
        {
            LPNMHDR hdr = (LPNMHDR)lParam;
            if (hdr->hwndFrom == hWndTree && hdr->code == TVN_ITEMEXPANDED)
            {
                MessageBox(hwnd, _T("I'm expanded"), _T("TreeView"), MB_ICONINFORMATION);
                break;
            }
            break;
        }
        ...    
    }