叠加图像不工作64位应用程序

时间:2013-07-22 17:13:05

标签: c# .net winforms

我们在c#中有一个Windows应用程序。该应用程序是32位。我们使用以下方法在树视图中设置叠加图像。该功能完美无缺。 现在,我们已将平台目标从x86更改为x64。但从那时起,覆盖覆盖图像未在树视图节点中设置。似乎代码在64位上不起作用。

有人可以建议为什么这个代码适用于32位应用程序而不适用于64位应用程序?

代码既不会抛出任何异常也不会正常工作。

参考:http://msdn.microsoft.com/en-us/library/windows/desktop/bb760017(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/bb773456(v=vs.85).aspx

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, IntPtr msg, IntPtr wParam, ref TVITEM lParam);

private const int TVIS_OVERLAYMASK = 0x0F00;
private const int TVIF_HANDLE = 0x08;
private const int TVIF_STATE = 0x0F;



[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)]
public struct TVITEM
{
    public uint mask;
    public IntPtr hItem;
    public uint state;
    public uint stateMask;
    public IntPtr pszText;
    public int cchTextMax;
    public int iImage;
    public int iSelectedImage;
    public int cChildren;
    public IntPtr lParam;
}

public bool SetNodeOverlayImage(TreeNode node, int overlayIndex)
    {          
        try
        {
            if (overlayIndex < 0 || overlayIndex > 4)
                return false;

            var tvi = new TVITEM
                          {
                              mask = TVIF_HANDLE | TVIF_STATE, 
                              hItem = node.Handle
                          };


            SendMessage(Handle, (IntPtr)WindowsMessages.TVM_GETITEM, IntPtr.Zero, ref tvi);

            uint prevState = tvi.state & TVIS_OVERLAYMASK;

            if (prevState == overlayIndex << 8)
                return false;

            tvi.mask = TVIF_HANDLE | TVIF_STATE;
            tvi.hItem = node.Handle;
            tvi.state = (uint)overlayIndex << 8;
            tvi.stateMask = TVIS_OVERLAYMASK;

          SendMessage(Handle, (IntPtr)WindowsMessages.TVM_SETITEM, IntPtr.Zero, ref tvi);

            return true;
        }
        catch
        {}
        return false;
    }

感谢。

1 个答案:

答案 0 :(得分:1)

您的Pack属性错误,不是1.只需将其删除,默认值为8即可。

这在32位模式下是偶然的,因为所有字段的大小都是4个字节。你在64位模式下运气不好,IntPtr成员是8个字节所以它们需要填充。