基于VC++6.0 windows程序设计 子窗口输出的诡异问题~~~~~~~~~~!

ShiningPig 发布于 2012/04/08 11:39
阅读 1K+
收藏 0
VC
用C语言调用windowsAPI写界面,遇到了一个很诡异的问题,不知如何解决~所以来向各位大仙请教!!!!!

创建父窗口,大小固定,无最大化按钮:
hwnd=CreateWindow(szAppName,szAppCation,
  WS_OVERLAPPED | WS_MINIMIZEBOX | WS_CAPTION | WS_THICKFRAME | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,
  NULL, NULL, hInstance, NULL);
父窗口中还有一些按键和label,此处略去……

子窗口位于父窗口中固定位置,实现输出,创建如下:
hwndChild = CreateWindow (szChildClass, NULL,
  WS_CHILDWINDOW | WS_VISIBLE, 
  0, 0, 0, 0,
  hwnd, (HMENU) CHILD_ID,hInst, NULL) ;
程序其他部分略去。

子窗口过程中,在自定义输出消息下,每次输出前先将子窗口屏幕向上滚动一行ScrollWindow (hwnd, 0, -cyChar, &rect, &rect),然后输出,即输出从子窗口中最底部开始。

若采用当前这种父窗口创建方式,子窗口输出会发生堆叠,即下一次输出堆叠在上一次输出上,类似下面这种形式:
ABCDEFGHJK  
OKCDEFGHJK
ENDDEFGHIK

如果将父窗口的style改为WS_OVERLAPPEDWINDOW则不存在这样的问题,输出正常:
ABCDEFGHJK
OK
END

后来研究发现,只要加上WS_THICKFRAME就能正常,但是加上后就可以改变窗口大小了,这不符合我的需求。

在网上搜了一下,貌似大家还没有遇到过这样的问题,我纠结了………………

加载中
0
ShiningPig
ShiningPig

引用来自“Lunar_Lin”的答案

好久不搞WIN SDK的界面细节了. 有点像是子窗口风格和父窗口风格的问题.
 你试下 不输出,只是简单ScrollWindow(),是否旧的显示内容也不会消失.
手动产生一下重画消息?

今天又好好研究了一下程序的其他部分,发现在自定义消息的最后用的是ValidateRect(),怪不得没法立马更新窗口,所以出现重叠,现在改成了InvaliteRect()就好了。

 

0
ShiningPig
ShiningPig
静等大仙!
0
中山野鬼
中山野鬼

很久不玩这些事情了。我也不清楚你现在具体的问题。你得确认两个事情。

1、前面的错,是否都是子窗口内的内容。而不是父窗口的输出和子窗口输出的叠加。

2、子窗口的参数配置是否正确。

0
Lunar_Lin
Lunar_Lin

好久不搞WIN SDK的界面细节了. 有点像是子窗口风格和父窗口风格的问题.
 你试下 不输出,只是简单ScrollWindow(),是否旧的显示内容也不会消失.
手动产生一下重画消息?

0
ShiningPig
ShiningPig

引用来自“中山野鬼”的答案

很久不玩这些事情了。我也不清楚你现在具体的问题。你得确认两个事情。

1、前面的错,是否都是子窗口内的内容。而不是父窗口的输出和子窗口输出的叠加。

2、子窗口的参数配置是否正确。

我是在子窗口的窗口过程中输出的,这和父窗口有关系?

请问你指的子窗口参数配置正确应该怎么配置呀?

0
中山野鬼
中山野鬼
我要最近2年内还碰过win 的编程,我就直接回答你了。真不知道了。哈。只能说点思路而已。这就是我讨厌win的地方。花了很多时间在上面,回头发现没什么大价值了。而如果你有时间7,8年前学VI,你现在依然可以在linux的server牛B装大爷。
0
ShiningPig
ShiningPig

引用来自“中山野鬼”的答案

我要最近2年内还碰过win 的编程,我就直接回答你了。真不知道了。哈。只能说点思路而已。这就是我讨厌win的地方。花了很多时间在上面,回头发现没什么大价值了。而如果你有时间7,8年前学VI,你现在依然可以在linux的server牛B装大爷。
……好吧。。。看来我注定要悲剧了
0
ShiningPig
ShiningPig

引用来自“Lunar_Lin”的答案

好久不搞WIN SDK的界面细节了. 有点像是子窗口风格和父窗口风格的问题.
 你试下 不输出,只是简单ScrollWindow(),是否旧的显示内容也不会消失.
手动产生一下重画消息?

……我不懂了,刚才还那重叠的。按你说的方式单步试了一下,发现没有这个问题了,再次运行又好了……这是神马!!!
ShiningPig
ShiningPig
回复 @中山野鬼 : ……某个不知名的学长而已
中山野鬼
中山野鬼
回复 @ShiningPig : 那个前辈啊?几年前听得啊?
ShiningPig
ShiningPig
@中山野鬼 : 当初就是想入个门,方便以后学习其它语言,因为听前辈说这个是基础……看来我是还没入门就选了个大仙才能使的装备。。。。。
中山野鬼
中山野鬼
@ShiningPig : 哈哈。这年头真的只有大仙玩SDK。还有现在玩WIN API32的也是极品了。
ShiningPig
ShiningPig
@中山野鬼 : 看来只能这次采取这种方式当作学习了解一下,以后绝对不能用啊,不然周期也太长了,真的是自找麻烦……
下一页
0
ShiningPig
ShiningPig

引用来自“Lunar_Lin”的答案

好久不搞WIN SDK的界面细节了. 有点像是子窗口风格和父窗口风格的问题.
 你试下 不输出,只是简单ScrollWindow(),是否旧的显示内容也不会消失.
手动产生一下重画消息?

昨天发现是设置了WS_THICKFRAME……白高兴了一场。

今天只设置了WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_BORDER,然后按你说的方法试了一遍,确实,如果不输出的话向上滚动出来的都是前一次的内容。还请问这应该怎么解决呢?

ShiningPig
ShiningPig
回复 @Lunar_Lin : 有什么办法能从根本上解决吗?
ShiningPig
ShiningPig
@Lunar_Lin : 额……刚刚把页面存储写好,可能写的比较山寨。我把存储的内容重画写在WM_PAINT里,原来的输出是在自定义消息里面,现在的情况是WM_PAINT里的输出是正确的,还是自定义消息里面的输出有问题……只要打开的时候最小化一下,之后的输出就正常了。。。。
Lunar_Lin
Lunar_Lin
应急办法: 主动重画窗口咯.擦除旧有内容.
返回顶部
顶部