过去两年,用c写的gui程序我一般使用的套路是:

在 winMain()中, 先创建一个主窗口, 紧接着就是在下面创建子窗口(子控件).

可能是因为写这方面的程序较少,所以也没遇到什么大问题,之前就是想枚举主窗口所有子窗口,然后设置所有子窗口的字体时使用:EnumChildWindows()会意外的抛内存访问错误,记得当时就是把EnumChildWindows()在winMain()中向前或向后移了一下位置,就没有报内存访问错误了。

我还以为只需要移动一下EnumChildWindows()在winMain()中的执行位置(顺序),这个问题就解决了。

但今天在修改以前一个程序的时候,无意间发现一个奇怪现象:

在winMain()中定义的一个局部变量的值竟然被意外的修改,这个局部变量初始化后,在接下来的代码是并没有显式的去修改这个变量的值,但为什么执行了几行代码后,再次输出这个变量的值时,发现这个变量的值已经被修改了?

经过几十分钟的一行一行的排查,首先找到有关的执行代码又是:EnumChildWindows()

可在EnumChildWindows()中并没有任何地方会修改这个局部变量的值,如果我注销掉EnumChildWindows()这一行,那么这个局部变量的值就不会被修改,当时是百思不得其解!因为这个问题,差不多花了2个小时左右的时间不断的测试,最后也不知怎么想到把 初始化子窗口和设置子窗口的字体的代码移到 WM_CREATE中执行的,但没想到把代码移到WM_CREATE中执行后,那个局部变量的值就没有再被修改了。

其实之前我在网上看到一些代码中,基本上都是在 case WM_CREATE: 中添加子窗口(初始化主窗口里所有控件).

我当时还不是太明白,为什么要在WM_CREATE中初始化子窗口呢?我一般都是在winMain()中初始化的。

经过这一次问题后,以后再写新的代码,把子窗口的初始化也放到 case WM_CREATE: 中执行吧

---------------------------------------------------------------------------------------------------------------------------------------

今天还遇到另一个问题,就是刷新一个子窗口时,窗口出现闪烁问题。

情况是这样的,在一个子窗口A里又有20个子窗口,并且拉动子窗口A的垂直滚动条,里面的20个子窗口会同时移动,移动后就需要刷新才能显示最新的位置,但刷新的时间会出现闪烁。

为了解决这个问题,试了各种办法,由于我在纯C(SDK)模式下进行开发,网上相关资料也不是很多。

后来无意发现一篇文章提到:WS_CLIPCHILDREN,说把窗口样式设置为WS_CLIPCHILDREN,就可以解决刷新闪烁的问题。

一开始,我把主窗口设置为WS_CLIPCHILDREN,测试发现果然有效果,刷新时基本上很肉眼看不出闪烁,但是同时出现2个新的问题:

1. 有些滚动条在经典模式下,用鼠标点击向上或向下按钮时,没有显示为按下去的效果,但在xp模式下又能看出来效果

2. 在ListView控件中,拖动鼠标选择多个item时,那个选择虚线框闪一下就自动消失了,这个情况有点麻烦了。

原以为找到了解决办法,没想到原来的问题是解决了,现在又出现新的问题。

后来我又试了一下,主窗口不设置为WS_CLIPCHILDREN,单独为那个子窗口A设置为WS_CLIPCHILDREN:

CreateWindowEx(WS_CLIPCHILDREN, "CodeBlocksWindowsApp", "panel", //注意: WS_CLIPCHILDREN
                                WS_CHILD | WS_VISIBLE | SS_BITMAP | WS_VSCROLL, // | SS_NOTIFY | WS_BORDER
                                650, 56, 260, 600,
                                hwnd_frame, (HMENU)id_panel, g_hInstance, NULL);

这样就有点类似于Java中的JPanel。

通过测试发现,把子窗口A设置为WS_CLIPCHILDREN后,子窗口A的滚动条效果上还是有一点问题,不过 listview在选择的时候,选择虚线框不会闪一下就自动消失了。同时也解决了刷新闪烁的问题。

目前,也只能这样了。

另外一个意外发现,当将窗口样式设置为:WS_CLIPCHILDREN,使用 SetWindowPos(...HWND_TOP) 调整子窗口的 z-order才有效果。 

2013-05-10

笔记: c开发gui程序 (WM_CREATE, WS_CLIPCHILDREN , SetWindowPos)的更多相关文章

  1. QT +go 开发 GUI程序

      ,转载 https://blog.csdn.net/lanbery/article/details/81745611 如果你是一个墨守成规的coding,请移步其他内容,这部分内容可能不适合你.如 ...

  2. 树莓派入门教程——使用Qt开发界面程序

    前言        Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器.Qt是面向对象的框架,使用特 ...

  3. 客户端GUI程序开发漫谈

    这篇文章包含了这个领域的很多开源项目的介绍,还有我多年来的心血和汗水  去年夏天的时候,我用QT做了一个小工具 后来还用QT做了流程设计器 我把程序分享给飞扬青云之后,他甚至搞出来一套QT的皮肤来 说 ...

  4. 微信小程序开发:学习笔记[7]——理解小程序的宿主环境

    微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器

  5. 日常开发技巧:x11-forward,使用远程机器的gui程序

    背景 日常用过ssh登录服务器进行工作,尽管大部分时间,都只需要终端操作,编辑源码也是vim就够用了. 但有时候,还是需要使用gui程序的,比如打开一份pdf,word,ppt,excel等. 碰到这 ...

  6. OpenTK学习笔记:C#的中开发OpenGL程序的4种开源封包库SharpGL、CsGL、OpenTK、Tao框架的简单对比

    最近要在C#的语言环境下开发OpenGL程序,参考了网上的博客论坛http://www.cnblogs.com/hanyonglu/archive/2012/06/12/2546581.html,总结 ...

  7. [笔记]Android开发环境配置及HelloWorld程序

    Android的开发须要下面四个工具: 1.JDK 2.Eclipse 3.Android SDK 4.ADT   具体功能: 1.JDK.JDK即Java Development Kit(Java开 ...

  8. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  9. 使用PyQt来编写第一个Python GUI程序

    原文:使用PyQt来编写第一个Python GUI程序 本文由 伯乐在线 - Lane 翻译,Daetalus 校稿.未经许可,禁止转载!英文出处:pythonforengineers.com.欢迎加 ...

随机推荐

  1. Spark Streaming简介及原理

    简介: SparkStreaming是一套框架. SparkStreaming是Spark核心API的一个扩展,可以实现高吞吐量的,具备容错机制的实时流数据处理. 支持多种数据源获取数据: Spark ...

  2. 系统重启后DNS地址默认修改修改引起的一次事故(Tomcat报错:java.net.UnknownHostException)

    事故描述:公司的一个内部业务系统由于程序bug,导致系统崩溃,需要强制重启服务器.系统重启后,赶紧将业务程序启动.随后发现/etc/resolv.conf文件的DNS地址被修改成了默认地址.发现之后, ...

  3. Jmeter-使用Stepping Thread Group插件来设置负载场景

    前言: 什么是实际的性能测试???1)思考时间:用户在做不同操作之间有时间停顿,或者延迟,思考时间就是模拟用户的操作过程中的停顿的间.2)步伐,速度:主要包括,大量用户进来的时间和退出时间,控制迭代之 ...

  4. 状态模式-State-订单状态

    JAVA设计模式-状态模式-State-订单状态 21. State(状态)     意图: 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 解释: 比如说对订单的提交,第一 ...

  5. spatial-temporal information extraction典型方法总结

    ==================================== 咳咳咳 由于科研的直接对象就是video sequence,所以,如何更好地提取spatial-temporal inform ...

  6. Distances to Zero CodeForces - 803B (二分)

    题目链接:https://vjudge.net/problem/CodeForces-803B#author=0 题意: 给你一个数组,其中至少包括一个0,求每一个元素距离最近一个0的距离是多少. 样 ...

  7. java数值运算后精度丢失问题

    最近连续俩次遇到运算后数值精度丢失问题,所以记录一下. 问题1:java计算百分比,应该得到57,可返回的就是56 在java代码中 BigDecimal progress; BigDecimal a ...

  8. [转帖]VBS 教程

    VBS教程 http://www.cnblogs.com/veggiegfei/p/5943260.html 原作者真牛B 网上找了好多 没找到 没想到整理的这么好, 转来学习一下 改天打印出来. V ...

  9. awk、sed、grep三大shell文本处理工具之grep的应用

    1.基本格式grep pattern [file...](1)grep 搜索字符串 [filename](2)grep 正则表达式 [filename]在文件中搜索所有 pattern 出现的位置, ...

  10. mysql登录密码相关

    设置root登录密码 方法一:用root 进入mysql后 mysql>set password =password('你的密码'); mysql>flush privileges; 方法 ...