2012年7月16日星期一

学习笔记:windows下qt4程序实现Aero效果及动态切换


(这篇文章原发表于CSDN,CSDN密码泄露事件后就删除了,现重发于这里,略有修改。)

    一直很喜欢windows 7的Aero效果,很想在自己的程序中用上。但Aero效果是由windows的DWM (Desktop Window Manager)提供的,qt并没有提供调用的方式,自己也不懂windows的编程。好在CuteQt上提供了用qt封装好的版本,可以供我尝试。原帖见<<qt如何在vista和windows7下实现Aero效果>>

    下载了它的源码编译,运行后发现有几个问题:

    1、win7下将目标程序设置为xp兼容模式,运行时依然开启了aero。即没有检测系统版本。

    2、win7未开启aero效果,运行目标程序,再开启aero效果。此时程序不能动态切换显示效果。

    3、窗体若启用了aero效果,WindowNotifier会记录它的指针。将窗体delete后,WindowNotifier依然保留其指针。此时若发生系统aero效果切换事件(如由一个支持aero效果的主题换到一个不支持aero效果的主题),程序将会崩溃。这是因为使用了野指针。

     因此我修改了qtwin.h和qtwin.cpp,修正了上面的几个问题。由于QtWin::enableAeroWindow(QWidget*widget,bool enable =true)这个函数一调用就程序崩溃,自己不懂windows编程也无法修改,于是将其注释掉,并添加了两个新的函数staticboolQtWin::enableAeroEffect(QWidget*widget)和staticvoidQtWin::disableAeroEffect(QWidget*widget)。使用时只需包含qtwin.h头文件,无须判断是否windows系统了。

    具体代码请看Ez拼图源码中的qtwin.h和qtwin.cpp:点击下载



文档信息



2012年7月15日星期日

Qt4小游戏:Ez拼图

      Ez拼图是一个简单的小游戏,使用Qt4编写,开源跨平台。功能很简单:选择图片,然后就可以开始移动图块,直至所有图块都放到正确位置上。
      为了增加趣味性,Ez拼图允许指定图片分割块数,最大支持1200块;为了降低难度,游戏过程中可以随时点击查看原图;允许自定义图片,只要把图片拖到窗体中就行了。游戏虽然简单,常用的功能并没有少。
   


项目托管在Google Code上:    项目页面
由于校园网无法使用git上传源码,只能打包了。源码包下载:点击下载
软件下载(适用于Windows系统):点击下载
Linux下需要下载源码编译。首先安装qt4编译环境(这部分各个系统都不一样,google一下)。然后命令行下进入源码目录,运行下面两条命令即可:
    qmake
    make



TODO:
1、保存设置功能
2、增加关卡,难度随关卡数上升
3、设置分割线颜色



文档信息

2012年7月7日星期六

学习笔记:Windows文件关联及有关注册表项


      不得不说Windows的注册表是世界上最混乱的地方之一,各个软件各自为政,没有统一的接口保证,不同版本的Windows具体实现也不一样。为了实现文件关联功能,花了几天时间,找了不少资料,在这里做个总结。
       Windows文件关联是以文件类型为分组,以后缀名为标志的。每种文件类型可以有一个类型描述,Windows中一般称为ProgId(Programmatic Identifiers)。ProgId指示了该类型文件在资源管理器中显示的图标,以及对应打开的程序路径。相同ProId的文件类型可以视为同一组,具有相关的显示图标和相同的打开方式。后缀名与软件的对应是通过ProgId(Programmatic Identifiers)进行的,一个后缀名只能对应一个ProgId,而对应同一个ProgId的后缀名可视为一组。或者说,一个后缀名只能对应一个软件,一个软件可以对应多个后缀。
        在Windows中,这些关联信息保存在注册表中以下两个位置:
        HKEY_CURRENT_USER\Software\Classes
        HKEY_LOCAL_MACHINE\Software\Classes
        其中HKEY_LOCAL_MACHINE\Software\Classes保存的是本机上所有用户的设置,HKEY_CURRENT_USER\Software\Classes保存的是当前用户的设置,而当前用户的设置优先级比较高。对于开启UAC的Windows7来讲,还有一个区别是更改本机设置需要管理员权限,而更改当前用户的设置只需要普通权限。为了方便读取,Windows下还有个HKEY_CLASS_ROOT根键,里面的内容是上面两个位置下的键值合并后的视图。由于是视图,因此最好只用于读取,若要更改则可以更改HKEY_CURRENT_USER\Software\Classes下的内容。
        以HKEY_CURRENT_USER\Software\Classes为例,要关联一个后缀名例如.ext,则需要在上面所说几个位置下有 .ext 这个项,该项的默认值即为对应的ProgId,假设是 YourProgID。在 .ext的相同层级下还应该有一个名为 YourProgID 的项,里面包含了DefaultIconshell\open\command这两个子项。DefaultIcon子项的值为显示的图标,shell\open\command的值为关联的程序。如下:

       HKEY_LOCAL_MACHINE\Software\Classes
       .ext
             (Default) = YourProgID//可以是任何字符串
       YourProgID //与上面的值对应
             DefaultIcon
                    (Default) = iconToShow, 0
             shell
                   open
                          command
                                  (Default) = yourAppPath.exe %1



       这样,当在资源管理器里点击具有.ext后缀名的文件时,Windows会先在HKCR\Software\Classes和HKLM\Software\Classes下寻找 .ext这一项,找到后读取其默认ProgId,再同样寻找此ProgId,找到其shell\open\command的值后就调用该程序。这个过程是一个映射
       在Windows资源管理器中,用户可以通过右键选择“打开方式”改变默认的关联程序,这个设置的优先级在默认的后缀与ProgId关联的方式之上,保存位置则在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\下。此位置下同样有许多后缀名,如.ext。在XP下,.ext项下面有ProgidApplication子项,Win7下则是UserChoiceApplication子项,子项的值就是关联的ProgId或者应用程序名称(不包括目录,如yourAppPath.exe)。
       至此Windows文件关联机制就很清楚了。首先根据后缀名查找HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\,找不到时查找HKEY_CURRENT_USER\Software\Classes,最后才是HKEY_LOCAL_MACHINE\Software\Classes。因此检查一个文件是否与某个程序关联可以按照这个顺序检查。
       设置一个后缀名与某个程序的关联则有些不一样,主要的原则是先清除原有的关联,再设置新的关联方式。清除关联包括清除用户自己设置的“打开方式”。设置新的关联方式时,最好只在HKEY_CURRENT_USER\Software\Classes下设置。首先设置后缀名的默认ProgId为自己程序的ProgId,再建立一个ProgId指定显示图标和程序路径。
        Win7下清除后缀名与某个程序的关联时要注意,程序只能删除自己拥有的HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext\UserChoice,因此要清除用户设置的默认打开方式,需要设置一下权限。这可以通过regini.exe这个自带程序来实现。
        还有一点需要注意的是,在更改了文件关联以后,最好通知一下Windows设置已经改变,否则要下次登录才能看到变化。方法是使用SHChangeNotify函数并指定SHCNE_ASSOCCHANGED事件。
       此外在查找资料的过程中,发现很多人更改文件关联时都是将原先对应的ProgId保存起来,要取消关联时则恢复原先的ProgId对应。但根据MSDN上的文章,最好不要取消后.ext对应的值,由系统自己处理更好。
       具体的编程实现可以参考Editor源码中的fileassoc.h和fileassoc.cpp,使用Qt4完成。

      
参考资料:

2012年7月2日星期一

软件发布:Editor - 一个快速的纯文本编辑器

    一直以来,Windows下的记事本就像鸡肋一样,用之无益,弃之可惜。之所以这样,是因为它功能较少,有时候仅仅想知道一个文本的字数,不得不打开庞大的Word。然而在小巧快速方面它又是出色的,占用资源也不多。于是总想着自己做一个类似的软件,同样小巧快速,但要加上一些常用的功能。
    正好之前做某个软件,里面用到了文本编辑功能。于是有天兴起将文本编辑功能独立出来,又提高了性能,Editor就诞生了。

特点: Editor是一个记事本的增强版本,主要特点就一个字: 快! 在我的电脑上,完全载入一本约一千万字的小说(GBK编码,18.4M),记事本要 12秒 左右,而Editor只要 3秒 !!极致的快就是Editor的目标,这是一款专为纯文本而生的软件。除了基本的记事本功能,Editor还能实时统计总字符数和光标选择范围字符数,简单的字数统计再也不用专门打开庞大的Word了。
Editor目前功能如下:
  1. 纯文本编辑
  2. 支持DOS与UNIX换行风格
  3. 支持多种编码格式,自动探测Utf-8编码(根据文本内容前1K字节),对于非Utf-8编码格式的则以本地编码打开(对于中文Windows系统来说是GBK)
  4. 实时统计总字符数和光标选择范围字符数,并在状态栏上显示
  5. 将文件拖入窗体即可打开
  6. 最近文件列表显示最近打开的5个文件。为保护隐私,关闭程序后列表自动清空
  7. 随意设置字体,自动记住窗体大小和位置,随时设置或取消关联txt文件格式(仅支持Windows系统)

change log:
  • 2011/3:v1.0,基本功能和界面。
  • 2012/5:v1.2,主程序重写,使用QPlainTextEdit代替QTextEdit,提升了性能;自动探测Utf-8编码;文件拖入窗体即可打开;增加搜索功能和字体设置;记住窗体大小和位置;最近文件列表。
  • 2012/6/28-2012/7/2: v1.4,增加Windows下文件关联功能。
TODO:
  • 搜索功能增强;
  • 实现替换功能;
  • 编码探测功能增强

软件是用Qt4编写的,采用GPLv2方式开源,项目托管在Google Code上:    项目页面
软件名是叫Editor,无奈这个项目名已经被人使用,只能使用ez-editor。另外由于校园网无法使用git上传源码,只能打包了。
源码包下载:点击下载
软件下载(适用于Windows系统):点击下载
由于Qt是跨平台的,所以Linux下应该也能用,只要下载源码编译就行了。


文档信息


开博展望

       一直很有冲动,想把学习与生活中遇到的问题与反思都写下来,作为一个总结和记录。2011年在CSDN开了一个博客,写了几篇文章,后来遇到CSDN密码泄露,就将文章都删了,不再使用。如今这股冲动又回来了,于是开了这个博客在Google上。我想Google的优点是可以充分掌控自己的数据,导出导入都比较方便,不怕数据丢失。
       这几天会将之前在CSDN上发的文章重新发在这里。希望有了这个博客,能激励我坚持总结、不断进取,学会更多东西!