52_对话框与控件

作业讲解

  • Bitmap需要用LoadImage加载
  • TranslateMessage与DispatchMessage联用看需求
  • DrwaIcon大小通过GetSystemMetrics获取

发送消息

SendMessage:立即处理的消息

    • 用法
      • 定义一个消息宏,不能与系统消息一样
      • WM_USER宏:系统保留值大小

    • 时机
      • 直到窗口函数处理完消息才返回

创建窗口先进来一次发送了WM_CREATE消息

当断下来立即执行用户的自定义消息

阻塞消息,点了确定之后才进去用户操作消息循环中

PostMessage:排队处理的消息

    • 时机
      • 直接把消息投递到消息队列中,如果前面不处理,它没有机会处理
    • 用法
      • 与SendMessage相同

投递到消息队列,并不会立刻执行

    • 通过PostMessage可以回溯找到消息

对话框

  • 概念:控件的组合
  • 创建
    • CreateWindow的窗口类名使用系统内部的
    • 窗口类型为WS_CHILD
    • 父窗口给的对应的父窗口

  • 缺点:调整坐标麻烦
  • IDE提供了所见即所得,可以在资源中编辑

模态对话框(modal dialog)

    • 编辑对话框资源模板
        • 资源添加Dialog

    • 实现对话框过程函数
      • DialogBox:dialog框宏从对话框模板资源创建一个模态对话框。直到指定的回调函数通过调用EndDialog函数终止模态对话框,对话框才返回控件。
      • INT_PTR CALLBACK DialogProc
      • 如果处理了消息返回true,如果没处理返回false

    • 创建对话框
      • 模态对话框会阻塞父窗口的原因:
        • 因为DialogBox内部自己建立了消息循环

      • 调用了EnableWindow禁用父窗口处理鼠标和键盘
          • WM_INITDIALOG创建对话框的消息
          • GetParent拿到父窗口的窗口句柄

      • 关闭对话框
        • WM_CLOSE消息,DestroyWindow。问题:父窗口没有恢复鼠标和键盘
        • 使用EndDialog

非模态对话框

    • 意义:不阻塞父窗口
    • 创建,CreatDialog,返回值为HWND,需要ShowWindow

    • 销毁:DestroyWindow

控件

文本框: EDIT

  • EM_GETLINE:从文本框获取行数拷贝到缓冲区

  • WM_GETTEXT:获取窗口标题

  • GetDlgItemText:获取对话框的控件id文本

  • GetDlgItemInt:获取对话框控件id的文本数值,适合一个人的出生日期

  • SendDlgItemMessage:向对话框里面的控件发送消息

  • GetWindowText:获取窗口标题

按钮:BUTTON

  • BN_CLICKED:当按钮按下的消息
    • wParam:低字,控件的ID;高字,控件的通知消息
    • lParam:控件的窗口句柄

  • BM_CLICK:模拟按钮按下
    • GetDlgIter通过对话框获得窗口句柄

  • XN由控件发送给程序员,告知控制状态发生改变;XM改变控件信息
  • VSDialogCTRL+T可以预览创建的对话框

  • #pragma region xx和 #pragma endregionxx 手动使代码可以收缩

  • 处理按钮消息一般只比较按钮,不判断是否按下

作业

  1. 登陆窗口,输入账号和密码,显示登陆成功,有一个注册按钮,弹出一个注册对话框,把用户名和密码保存到文件密码,对比文件用户名和密码是否正确
  2. 俄罗斯方块
    1. 可以分等级,3个等级
    2. 菜单:可以暂停、继续、重新开始、结束
    3. 可以消除行数、显示分数
    4. 定时器API:SetTimer,回调函数NULL。关闭定时器:KillTimer,开启的时候会有WM_TIMER消息

文件链接https://github.com/xkkhh/DialogBoxesAndControls.git

0 条评论
发表一条评论