【问题标题】:InvalidateRect in WM_CREATE does not workWM_CREATE 中的 InvalidateRect 不起作用
【发布时间】:2009-03-30 20:53:10
【问题描述】:

我想在创建窗口时使其无效。我怎样才能做到这一点?在 WM_CREATE 期间调用 InvalidateRect 不起作用。

问题是我在 WM_CREATE 中调用 SetWindowLongPtr 并设置 GWLP_USERDATA。 WM_PAINT 在 USER_DATA 中查找一些指针,但是当我第一次收到 WM_PAINT 时,数据显然不在那里,所以它不会绘制我的东西。

也试过这个:

#define MyDefinedMsg (WM_APP+1)
//...//
case WM_CREATE:
  //...//
  SetWindowLongPtr(hWnd,GWLP_USERDATA,ptr);
  PostMessage(hWnd,MyDefinedMsg,0,0);

  break;
case MyDefinedMsg: 
  InvalidateRect(hWnd,NULL,TRUE);
  break;

但没用。

提前致谢

【问题讨论】:

    标签: c++ c windows winapi


    【解决方案1】:
    1. 您的窗口在创建时已经无效
    2. PostMessage 将消息放入队列中,因此很可能在常规创建消息之后到达(WM_CREATE/WM_SIZE/WM_PAINT 等)。

    如果您的绘画由于 GWLP_USERDATA 为 NULL 而失败,那么正在发生其他事情......

    【讨论】:

    【解决方案2】:

    ::CreateWindow(...) 呼叫之后尝试::UpdateWindow(...),而不是发送您的消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-05
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多