【问题标题】:Something wrong either with lParam or with WCHAR[]lParam 或 WCHAR[] 有问题
【发布时间】:2013-03-02 04:37:53
【问题描述】:

首先,这个函数被多次调用。需要注意的是 wString[] 确实包含字符常量 '\n'。

void D2DResources::PutToLog(WCHAR wString[])
{
    int strLen=wcslen(wString);
    int logLen=wcslen(log);

    if(strLen+logLen>=MaxLogSize)
        wcsncpy(log, log, logLen-strLen);

    wcscat (log, wString);

    int nLines=0;

    for(int x=0; x<wcslen(log); x++)
    {
        if(log[x]=='\n')
        {
            nLines++;
            if(nLines>5)
            {
                log[x]='\0';
            }
        }
    }

    SendMessage (m_hWnd, WM_PAINT, NULL, (LPARAM)nLines);
}

最后,发送一条 WM_PAINT 消息,而 nLines 应为非零,因为日志包含多个 '\n'。我的 WndProc 接收消息并处理它。

case WM_PAINT:
    {
        pD2DResources->OnRender((int)lParam);
        ValidateRect(hWnd, NULL);
    }
    break;

在此之后,使用(假定的)非零 int 作为 lParam 调用 OnRender。

void D2DResources::OnRender(int nLogLines)
{
    D2D1_SIZE_F screenSize = pCurrentScreen->GetSize();

    D2D1_SIZE_F rTSize = pRT->GetSize();

    pRT->BeginDraw();

    pRT->DrawBitmap(
        pCurrentScreen,
        D2D1::RectF(0.0f, 0.0f, screenSize.width, screenSize.height)
        );

    pRT->DrawText(
        log,
        ARRAYSIZE(log) - 1,
        pTextFormat,
        D2D1::RectF(0, rTSize.height - ((nLogLines*textSize)+textSize) , rTSize.width, rTSize.height),
        pWhiteBrush
        );

    pRT->EndDraw();
}

由于某种原因,在 OnRender 函数中,nLogLines 的值为 0。这是怎么回事?

【问题讨论】:

  • 发送或发布 WM_PAINT 不是一个好主意。使需要重新绘制的窗口的任何部分无效。然后 WM_PAINT 在您下次访问消息队列时生成
  • 我现在使用了 WCHAR*,nLines 确实获得了应有的价值。但是,我确实遇到了另一个问题,这可能与发送的 WM_PAINT 消息有关。我将使用 invalidateRect 代替。谢谢。

标签: c++ arrays string pointers lparam


【解决方案1】:

“怎么了?”

很可能您正在处理的 WM_PAINT 不是来自您的 SendMessage

一般建议:不要发送或发布 WM_PAINT,让系统生成该消息(当您从线程的消息队列中检索消息并且窗口需要重新绘制时,系统会生成该消息)

【讨论】:

  • 我现在使用了 WCHAR* 并且 nLines 确实获得了它应该得到的值。但是,我确实遇到了另一个问题,这可能与发送的 WM_PAINT 消息有关。我将使用 invalidateRect 代替。
  • @MickaelBergeronNéron:WCHAR wString[]WCHAR* wString 两个形式参数声明是等价的,没有区别。
  • 使用自定义消息而不是 WM_PAINT 可以吗?
  • @Mickael :是的,这是首选方法,并且您应该从一开始就这样做。 ;-]
猜你喜欢
  • 2017-04-23
  • 2018-04-18
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多