Timers and Animation

theForger's Win32 API教程第二版(简体中文)

主页

基础
  1. 开始学习
  2. 一个简单的窗口
  3. 处理消息
  4. 理解消息循环
  5. 使用资源
  6. 菜单和图标
  7. 对话框
  8. 非模态对话框
  9. 标准控件
  10. 对话框常见问题
创建一个简单应用
  1. 在运行时创建控件
  2. 文件与常用对话框
  3. 工具栏与状态栏
  4. 多文档界面
图形设备接口
  1. 位图,设备上下文
  2. 透明位图
  3. 定时器与动画
  4. 文本,字体与顏色
工具与文档
  1. 参考
  2. 免费的Visual C++(最新更新)
附表
  1. 常见错误的解決方法
  2. API vs. MFC
  3. 关于资源文件的说明

常见问题的解決方案

Error LNK2001: unresolved external symbol _main

  一个未解析外部符号错误发生于:一个地方调用了一个外部函数,但是链接器在你所有模块和你链入的所有库中都找不到这个函数.

  这种情況可能有两种原因或其中之一. 要么你想写一个Win32 GUI应用(或是一个非console的应用)但是卻将其以console应用来编译...或是你真正的想要编译一个console应用但沒有正确地写或是编译main()函数.

  一般来说第一种情況居多,如果你在VC++中创建工程时指定了Win32 Console工程类型你就会得到这个错误. 用BC++的命令行工具来编译的时候沒有指定正确的选项使其以一个Win32 GUI应用来编译,它就会以默认的console应用来编译,这样也会得到这个错误.

修复方法

  如果是用的VC++就重新创建你的工程并选择Win32 应用工程类型(不是Console).

  如果用的是BC++命令行编译器,加上-tW选项指明它是一个windows应用.

Error C2440: cannot convert from 'void*' to 'HICON__ *' (or similar)

  如果你在编译本教程中的代码,意味著你在以C++代码在编译它.这些代码是为bcc32 和VC++的C编译器写的,所以并不能精确地以C++编译,因为C++的类型转換的规则更严格些,C++需要你显示地转換.

  VC++(大多数编译器也是这样)会自动将一个.cpp文件以C++代码来编译,.c的文件就以C代码来编译.如果你把教程中的代码放入一个.cpp文件,这应该就是错误的产生原因.

  如果你不是在编译这个教程中的代码,那我就不能确定是否如上述,有可能的确存在一个要解決的错误.需要你自己来判断能不安全地做強制转換以消除这个错误,否则的话,你就有可能把一个变量转到不能转到的地方.

修复方法

  如果想用C,就把你的.cpp文件改为.c就是了.再就是加一个简单的強转,教程中的代码以C++编译的话只需要这个修改.

  例如,在C中这样可以:

	HBITMAP hbmOldBuffer = SelectObject(hdcBuffer, hbmBuffer);

但在C++中就需要一个強转:

	HBITMAP hbmOldBuffer = (HBITMAP)SelectObject(hdcBuffer, hbmBuffer);

Fatal error RC1015: cannot open include file 'afxres.h'.

  非常奇怪的是,VC++在资源文件中加入了afxres.h,就算你沒有用MFC的工程类型也是如此,而且这个文件只有你装了MFC才会有.这个郁闷的文件并不是必需的,所以要修正这个错误,可以用一个编辑器打开.rc文件并用』winres.h”替換掉两个”afxres.h”就行了.(注意应该有两个,两个都要換).

Error LNK2001: unresolved external symbol InitCommonControls

  你沒有链入这个API被定义的comctl32.lib.这个库不是默认加入的,所以要么在你的命令行中加进去,要么在VC++的工程设置中的Link属性项中加入.

Dialog does not display when certain controls are added

  ListView,TreeView,Hotkey,Progress Bar,等控件被规类为通用控件,因为它们随著comctl32加入windows,于Windows95之前并不存在.而Button,Edit,ListBox等等控件毫无疑问也很通用,但不是”通用控件”,一般称为”标準控件”.

  如果把一个通用控件加入到一个对话框后不能显示的话,很可能是在你运行对话框之前调用InitCommonControls()失败,或许肯定是这样的.调用它的最好的地方是WinMain()的开始.在WM_INITDIALOG就太晚了,因为对话框会在这之前就创建失败,从而使它永远沒有机会被调用.

  有些人和文档可能告诉你InitCommonControls()已经过时了,你应该调用InitCommonControlsEx().如果想那样做的话也是可以的.但InitCommonControls()就是简单点而已,并沒有一点错误.


Copyright © 1998-2008, Brook Miles (forgey). All rights reserved.