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. 关于资源文件的说明

对话框常见问题(FAQ)

[images/dlg_three.gif]

范例:dlg_three

  要知道我这只是个教材,不是一个参考,但有些问题被问得太多了,所以我想我还是把它们也放在这里.

攺顏色

  一般来说,你这样做的唯一理由是你想在对话框上仿真一个连接或要达到类似的什么目的,否则你给对话框加上一大堆的顏色的后果只是让你的程序变得难看并且得刺眼睛,但是还是有得多人要这样做,不过的确有些合理的理由,所以就这样干吧:)

  Windows 系统向你的对话框过程发送很多与顏色相关的消息,你通过处理它们你就可以某些地方的显示顏色.比如,要攺变对话框自己的顏色,你就要处理WM_CTLCOLORDLG消息,要攺变一个靜态控件的顏色你就要处理WM_CTLCOLORSTATC消息,诸如此类.

  首先你创建一个画刷来画背景并将其存起来备用.WM_CTLCOLORDLG消息和相关的消息在你程序的这个过程中来得很频繁,所以你要是每次都创建一个新的画刷的话,你可能过一会就会用完很多的RAM并留下得多个死刷子. 这样做的话,我们就可以在对话框被销毀的时候就知道我们不再需要它,并刪掉它,

    HBRUSH g_hbrBackground = CreateSolidBrush(RGB(0, 0, 0));
    case WM_CTLCOLORDLG:
        return (LONG)g_hbrBackground;
    case WM_CTLCOLORSTATIC:
    {
        HDC hdcStatic = (HDC)wParam;
        SetTextColor(hdcStatic, RGB(255, 255, 255));
        SetBkMode(hdcStatic, TRANSPARENT);
        return (LONG)g_hbrBackground;
    }
    break;

  注意我们把背景模式设为透明的那行...如果不要这行,背景就会被你指定的刷子填充,但当你的控件写文字的时候就会被默认的背景所覆盖!把文字绘制模式设为透明就可以解決这个问题.还有一种解決方法是用SetBkColor()设为我们的背景刷子一样的顏色,但是我更喜欢这种解決方案.

  在其它的种种的控件上攺变顏色的操作步骤都是这样,在你的Win32参考中查一下WM_CTLCOLOR*消息就是了.注意编辑框控件为只读的话发的是WM_CTLCOLORSTATIC,不是只读的话就发送WM_CTLCOLOREDIT.

  如果你有多个靜态控件(或別的控件)想要设置顏色的话,那你就要在接到消息的时候检查控件的标识并依此操作.你在lParam中得到传递的控件的HWND,并用GetDlgCtlrID()得到控件的标识..注意所有的靜态控件都被资源编辑器给了一个默认的标识IDC_STATIC(-1),所以如果要把它们区分的话你就要给它们定义新的标识.

给对话框一个图标

  相当简单的一个操作,只要给对话框发一个WM_SETICON消息就行了.因为Windows系统用两套图标,所以你要调用两次,一次为窗口角落的那个小图标,一个为当你按下Alt-tab组合时候的那个大图标.除非你有两个不同大小的图标,你可只用将相同的句柄发两次就是了.

  要用默认的图标的话,你可以下面的代码:

    SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)));
    SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)));

  你要替換默认的资源为你自己的资源的时候要记得要把LoadIcon()的HINSTANCE也攺成你自己的应用实例(要是你沒法从WinMain()得到的话,可以调用GetModuleHandle(NULL)来获得它).

为什么我的组合框不工作

  一个很常见的问题是当他向对话框加了一个组合框后发现他运行程序并点击那个小箭头的时候看不到列表显示出来.这是可以理解的, 因为解決方案不是很直观.

  当你创建一个组合框并指定它的高度时,你实际上指定了整个高度,包括下拉列表在內,不是此控件展开的时候由系统根据所用的字体決定的高度.

  比如,一个高度为100像素的控件,系统将控件本身设为默认的(比如为30),当你点击小箭头的时候,下拉列表将会是70像素高,加在一起一共100像素.

  如果你用VC++的资源编辑器来把组合框放到你的对话框上,你就会注意到你不能把它的纵向地拉伸.除非你在编辑器中点击那个箭头,它才可以拉伸,并把焦点框攺到那上面指示你正在攺变下拉框的大小,这样你就可以任意地设立高度了.

其它的控件怎么办

  当然我可以把所有的控件都写个例子,但那是MSDN和Petzold(译者注:Windows Programming一书的作者)做的事情啊:)如果你实在不知道怎么用它们,你可能要把本教程的某些部分重读一下,或者去找一本更详细的书来看.

  我本来想在这里给出一些MSDN上的一些有用链接的,但是微软好像跟我作对似的把指向MSDN上的页面一会換个位置或者弄得时不时不能访问.所以你就可能要自己去找它们了,看一下用戶接口服务,Windows控件,还有要翻下Platform SDK之类的东西.

MSDN - Windows 控件

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