使用CWnd动态创建子窗口不刷新问题

_rock_stone_ 2014-05-28 05:59:29
在视图类的左键消息中,动态创建窗口,样式改为子窗口时窗口就不刷新了,如何处理让子窗口能够刷新呢?
CWnd * wnd = new CWnd;
创建浮动窗口:

wnd->CreateEx(NULL,AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW , NULL,
(HBRUSH) ::GetStockObject(WHITE_BRUSH),NULL), //if pass null, do not erase background
"My Window", WS_POPUP| WS_VISIBLE |WS_OVERLAPPEDWINDOW, CRect(100,100,500,500),this, 0);
创建子窗口:
wnd->CreateEx(NULL,AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW , NULL,
(HBRUSH) ::GetStockObject(WHITE_BRUSH),NULL), //if pass null, do not erase background
"My Window", WS_CHILD| WS_VISIBLE, CRect(100,100,500,500),this, 0);

创建浮动窗口,能够自行刷新:

子窗口不刷新:
...全文
481 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
_rock_stone_ 2014-05-30
  • 打赏
  • 举报
回复
引用 24 楼 schlafenhamster 的回复:
CPtrArray 可以 放 指针 (或 vector) CPtrArray m_arWnds; 、、、 CWnd * wnd = new CWnd; m_arWnds.Add(wnd); 析构 for(inti=0;i < m_arWnds.Getsize(), i++) { m_arWnds[i]->DestroyWindow(); }
====== 好的,谢谢哦。
schlafenhamster 2014-05-30
  • 打赏
  • 举报
回复
CPtrArray 可以 放 指针 (或 vector) CPtrArray m_arWnds; 、、、 CWnd * wnd = new CWnd; m_arWnds.Add(wnd); 析构 for(inti=0;i < m_arWnds.Getsize(), i++) { m_arWnds[i]->DestroyWindow(); }
_rock_stone_ 2014-05-30
  • 打赏
  • 举报
回复
引用 20 楼 guyuguang8628391 的回复:
向子窗口发刷新消息。
===== 之前有用这个,不好使,这次又试了下,居然好使了,谢谢你的回答。
_rock_stone_ 2014-05-30
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
"改成成员变量之后,只能生成一个窗口,再创建时出现异常。" 只能生成一个窗口, 先不管几个, 问题是有没有 刷新?
====== 只有一个窗口,因为只有在子窗口覆盖时才不刷新的,所以没法测试了,应该是刷新的。用这种成员变量有方法多次创建窗口吗?
_rock_stone_ 2014-05-30
  • 打赏
  • 举报
回复
引用 18 楼 schlafenhamster 的回复:
给你说了 CNewWnd *pwnd=0;要放头里. "是同时显示的。" 更要搞一个 数组存这些 CNewWnd *pwnd 你就不怕 内存泄露? BOOL ret=pwnd->Create(0,"CNewWnd",WS_CHILD|WS_BORDER|WS_VISIBLE,CRect(140,10,660,430),this,1000,0); 是vc6上试过的. 你那个 rar 里用了太多的 新 功能,vc6 编不了
======= 内存泄漏这一点我知道,到最后再处理,先实现再说。好的,我会测试,感谢你的回答。
schlafenhamster 2014-05-29
  • 打赏
  • 举报
回复
"CWnd * wnd = new CWnd;" 放哪里了? 试试: CWnd m_wnd;
worldy 2014-05-29
  • 打赏
  • 举报
回复
那你改CWnd * wnd = new CWnd; 为 CWnd * wnd = new CView;试试?
图灵转世 2014-05-29
  • 打赏
  • 举报
回复
向子窗口发刷新消息。
_rock_stone_ 2014-05-29
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
wnd->CreateEx(NULL,AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW , NULL, (HBRUSH) ::GetStockObject(WHITE_BRUSH),NULL), //if pass null, do not erase background "My Window", WS_CHILD| WS_VISIBLE, CRect(100,100,500,500),this, 0); 红色那个参数改为NULL,蓝色那个最好给个唯一值
==== 已测试,窗口直接透明了,且不刷新。
_rock_stone_ 2014-05-29
  • 打赏
  • 举报
回复
引用 1 楼 healer_kx 的回复:
那就自己InvalidateRect吧。

==========
已测试,窗口直接透明了,且不刷新。
_rock_stone_ 2014-05-29
  • 打赏
  • 举报
回复
引用 1 楼 healer_kx 的回复:
那就自己InvalidateRect吧。
====== 这个想到了,添加到按键消息中,可是没有效果。
schlafenhamster 2014-05-29
  • 打赏
  • 举报
回复
"改成成员变量之后,只能生成一个窗口,再创建时出现异常。" 只能生成一个窗口, 先不管几个, 问题是有没有 刷新?
schlafenhamster 2014-05-29
  • 打赏
  • 举报
回复
给你说了 CNewWnd *pwnd=0;要放头里. "是同时显示的。" 更要搞一个 数组存这些 CNewWnd *pwnd 你就不怕 内存泄露? BOOL ret=pwnd->Create(0,"CNewWnd",WS_CHILD|WS_BORDER|WS_VISIBLE,CRect(140,10,660,430),this,1000,0); 是vc6上试过的. 你那个 rar 里用了太多的 新 功能,vc6 编不了
_rock_stone_ 2014-05-29
  • 打赏
  • 举报
回复
引用 14 楼 schlafenhamster 的回复:
CNewWnd *pwnd=0; // BOOL ret=pwnd->Create(0,"CNewWnd",WS_CHILD|WS_BORDER|WS_VISIBLE,CRect(140,10,660,430),this,1000,0); 没问题。
===== 我在视图类的左键方法里改成这两句是报错的,把CNewWnd *pwnd=0;改成CNewWnd * wnd=new CNewWnd;后,可以出现子窗口,但是依旧不刷新。
_rock_stone_ 2014-05-29
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
"CWnd m_wnd;这样的局部变量的话" 看到 这个 m_ 吗 ? 他 表示 模块 变量 不是(局部变量), 所以要放 .h 里。
===== 改成成员变量之后,只能生成一个窗口,再创建时出现异常。
_rock_stone_ 2014-05-29
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
:因为要创建很多窗口“ 如果 同时 存在 多个, 你 一个 new 也 不够 的 吧。 如果 不 同时 可以 dettach 后 再 attach
===== 是同时显示的。
schlafenhamster 2014-05-29
  • 打赏
  • 举报
回复
CNewWnd *pwnd=0; // BOOL ret=pwnd->Create(0,"CNewWnd",WS_CHILD|WS_BORDER|WS_VISIBLE,CRect(140,10,660,430),this,1000,0); 没问题。
schlafenhamster 2014-05-29
  • 打赏
  • 举报
回复
:因为要创建很多窗口“ 如果 同时 存在 多个, 你 一个 new 也 不够 的 吧。 如果 不 同时 可以 dettach 后 再 attach
schlafenhamster 2014-05-29
  • 打赏
  • 举报
回复
"CWnd m_wnd;这样的局部变量的话" 看到 这个 m_ 吗 ? 他 表示 模块 变量 不是(局部变量), 所以要放 .h 里。
_rock_stone_ 2014-05-29
  • 打赏
  • 举报
回复
创建child窗口时其parent最好付值,以便消息循环(除非使用模态对话框)[/quote] ============= wnd->CreateEx(NULL,AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW , NULL, (HBRUSH) ::GetStockObject(WHITE_BRUSH),NULL), //if pass null, do not erase background "My Window", WS_CHILD|WS_VISIBLE, CRect(100,100,500,500),this, m_id++); 是最后一个参数要赋不同的值吗?这样做了,还是那样。源码:http://pan.baidu.com/s/1mgwUhKG
加载更多回复(5)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧