小编Nik*_*san的帖子

滚动事件和绘制事件之间存在滞后,也许介于两者之间

我在表单上有一个简单的面板,我正在使用 AutoScrollMinSize 和 AutoScroll 在面板上获取一些滚动条,一切正常。

我还有一个滚动事件,我用它来使整个面板区域无效,因为事实上它似乎只使左/右、上/下滚动时所需的位无效。除此之外,我使用与面板大小相同的 BufferedGraphics,然后执行 .Render(e.Graphics),因为我希望它在整个面板上绘制,就好像滚动条不存在一样。

现在,我遇到的问题是,滚动和绘制内容时似乎存在视觉上的滞后,我认为这是因为在滚动事件之前有一个我不熟悉的额外绘制/设置阶段调用或在该事件与调用的 Paint 事件之间进行。

如果我在绘制方法中有一个无效面板,您不会看到问题,但这更多地与多次调用绘制事件隐藏问题有关。

所以我认为我理解它的方式是,当你滚动时,引擎盖下的某个东西会做一个大矩形 blit 移动已经存在的内容,然后调用需要填充区域的矩形 invalidate 。

如果是这种情况,是否有任何围绕此问题的方法,例如抑制此阶段或我缺少的一些其他设置以消除跟上滞后?

PS:我还重写了 OnPaintBackground 方法,它是一个空存根。

.net c# panel onpaint autoscroll

5
推荐指数
1
解决办法
2128
查看次数

在 C# 中将 uchar[] 从本机 dll 编组到 byte[] 的正确方法

我正在尝试将我的本机 dll 通过 CoTaskMemAlloc 分配的一些数据编组到我的 c# 应用程序中,并想知道我这样做的方式是否完全错误,或者我错过了方法 c# 方面的一些微妙装饰。

目前我有c++方面。

extern "C" __declspec(dllexport) bool __stdcall CompressData(  unsigned char* pInputData, unsigned int inSize, unsigned char*& pOutputBuffer, unsigned int& uOutputSize)
{ ...
    pOutputBuffer = static_cast<unsigned char*>(CoTaskMemAlloc(60000));
    uOutputSize = 60000;
Run Code Online (Sandbox Code Playgroud)

在 C# 方面。

    private const string dllName = "TestDll.dll";

    [System.Security.SuppressUnmanagedCodeSecurity]
    [DllImport(dllName)]
    public static extern bool CompressData(byte[] inputData, uint inputSize, out byte[] outputData, out uint outputSize );
    ...
    byte[] outputData;
    uint outputSize;
    bool ret = CompressData(packEntry.uncompressedData, (uint)packEntry.uncompressedData.Length, out outputData, out outputSize);
Run Code Online (Sandbox Code Playgroud)

这里的outputSize是预期的60000,但是outputData的大小为1,当我memset缓冲区c++端时,它似乎只复制1个字节,所以这是错误的,我需要使用IntPtr + outputSize,或者我是否缺少一些微妙的东西来完成我已经拥有的工作? …

.net c# pinvoke marshalling

4
推荐指数
1
解决办法
4005
查看次数

标签 统计

.net ×2

c# ×2

autoscroll ×1

marshalling ×1

onpaint ×1

panel ×1

pinvoke ×1