DialogBox不显示对话框的原因分析

  • 0. 确认主窗口正常显示
  • 1. 检查资源文件格式是否正确
    • 1.1 确认窗口布局定义正确
    • 1.2 确认有窗口大小边框坐标定义
  • 2.检查窗口ID是否正确定义
  • 3. 检查DialogBox的调用
  • 4. 删除编译文件,重新编译

本文介绍单纯使用 win API 进行界面开发时,遇到DialogBox失败或不弹出对话框的解决方式。

0. 确认主窗口正常显示

这一步都不对的话,可以不用往下看了。

1. 检查资源文件格式是否正确

.rc文件中需要有两部分定义:

1.1 确认窗口布局定义正确

#include "resource.h"
/
//
// Dialog
//
IDD_IMGINF DIALOGEX 0, 0, 287, 135      //IDD_IMGINF为窗口ID
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION  //风格一般包括这些
CAPTION "Fill image info"                 //窗口的名字
FONT 8, "MS Shell Dlg", 400, 0, 0x1           //窗口使用字体
BEGIN
LTEXT           "Width:", IDC_STATIC, 45, 10, 20, 8           //显示两个Text控件
LTEXT           "Height:", IDC_STATIC, 155, 10, 20, 8
EDITTEXT        IDC_WIDTH, 42, 22, 80, 14                   //显示两个Edit控件
EDITTEXT        IDC_HEIGHT, 151, 22, 80, 14
DEFPUSHBUTTON   "Ensure", IDOK, 85, 114, 50, 14               //显示连两个Button控件
PUSHBUTTON      "Cancel", IDCANCEL, 151, 114, 50, 14
END

此部分代码的关键点是为窗口 id 要与 resource.h 中定义的 id 对应。此外控件的 id (IDC_WIDTH,IDC_HEIGHT)也需要与头文件中的定义对应。

1.2 确认有窗口大小边框坐标定义

/
//
// DESIGNINFO
//#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGINIDD_IMGINF, DIALOG     //注意窗口id 为 IDD_IMGINFBEGINLEFTMARGIN, 7RIGHTMARGIN, 302TOPMARGIN, 7BOTTOMMARGIN, 169END
END
#endif    // APSTUDIO_INVOKED

此部分代码的关键也是 id 要与上面匹配

2.检查窗口ID是否正确定义

Resource.h 中我们需要定义一个窗口 id ,其值选择一个其他 id 未使用的值。

//创建WIN API 窗口应用程序时 VS 自己创建的定义
#define IDC_MYICON                      2
#define IDD_BZVIEWER_DIALOG             102
#define IDS_APP_TITLE                   103
#define IDD_ABOUTBOX                    103
#define IDM_ABOUT                       104
#define IDM_EXIT                        105
#define IDI_BZVIEWER                    107
#define IDI_SMALL                       108
#define IDC_BZVIEWER                    109
#define IDR_MAINFRAME                   128
#define IDCANCEL                        1000
#define IDC_STATIC                      -1//自己添加的id定义
#define IDD_ADDIMGINF                   200     //此作为窗口ID
#define IDC_WIDTH                       210     //此作为控件ID
#define IDC_HEIGHT                      211     //此作为控件// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC                     1
#define _APS_NEXT_RESOURCE_VALUE        134
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           110
#endif
#endif

这部分代码的关键点是, 将 .rc 资源文件中使用的自定义的对话框的 Id 定义好。若资源文件使用了没有定义的 id, 对话框将创建失败

3. 检查DialogBox的调用

在任意可以获取主窗口句柄或父窗口句柄的 .cpp 文件中调用就行

INT_PTR CALLBACK AddWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);void xxxxxFunc(HINSTANCE hInstance, HWND Hwnd){DialogBox(hInstance, (LPCWSTR)IDD_IMGINF, *pHwnd, AddWndProc); //AddWndProc为自定义的对话框响应函数
}INT_PTR CALLBACK AddWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}break;/*待添加控件的响应*/}return (INT_PTR)FALSE;
}

DialogBox的调用不必像网上很多人说的必须放在窗口响应回调函数中,它可以在任意地方调用,但需要获取父窗口句柄,否则不能实现模态对话框优先处理顶层对话框的特性,即主窗口线程将不会被锁住。

  1. 确定调用的地方可以获取父窗口句柄,若此句柄为空则为非模态对话框。
  2. 确认对话框响应的回调函数正确定义,此函数可以先拷贝一个创建程序时 vs 自己创建的,修改函数名,确认窗口正确显示后再详细添加响应功能。
  3. 确认对话框 id 再 resource.h 中正确定义,其控件的 id 也正确定义。

4. 删除编译文件,重新编译

若前3步都检查完毕,没有错误的情况下还是不能正确显示一个对话框,可以尝试第4步。
我的问题就是第4步的问题,查了两天前3步,最终尝试出此方法。

修改.rc文件后直接点击调试,Visual Studio 貌似并没有将我的修改重新编译。导致的结果就是无论我怎么改,是一直不能显示对话框。因此需要删掉链接文件,重新编译。

如果你使用的是Visual Studio创建的项目,请删除编译输出的链接文件的所在文件夹,这个文件夹会根据x64或是 x86编译器的不同而有不同的名字,但里面的文件类都一样。

  1. 删除包含.log,.obj,.res,.pdb,.idb的文件夹以及其子文件夹,一般此文件夹是在项目文件夹的下一层,叫Debug。
  2. 重新编译调试。

最终弹出对话框!

DialogBox不显示对话框的原因分析相关推荐

  1. VOS客户端上服务器和软交换状态显示红灯的原因分析

    VOS客户端上服务器和软交换状态灯显示红灯,实际后台服务都在运行的原因 登录VOS3000客户端 原因分析  VOS客户端连接到服务器是属于TCP连接,TCP连接一旦断开后,服务器和软交换的状态灯就会 ...

  2. 关于Gprmax正演模拟结果显示空白的原因分析

    Gprmax正演模拟结果显示空白 gprMax正演模拟结果显示空白,与发射天线极化方向有关,电场方向应垂直剖面方向,与参数设置关系不是很大.二维 gprMax 显示空白与天线收发距有关. 文章目录 G ...

  3. VC 操作Word, Excel 出现服务器正在运行中 Ole Server Busy对话框的原因分析和解决建议

    问题描述: 最近帮朋友弄个程序,处理Office Excel表.该Excel表加了密码,并且含有很多数据,当在VC中通过 Excel Ole对象打开该Excel文档时候,出现 "服务器正在运 ...

  4. 对于ANDROID 5.0及其以上版本WIFI图标上显示感叹号的原因分析及解决方法

    这里我指的是WIFI可正常连接网络使用的前提下,手机状态栏WIF图标上仍出现感叹号的情况. 原因: 从 Android 5.0 开始,当安卓系统连接网络时,系统会向Google的某个特定的网址(htt ...

  5. 网页在PC 上运行正常,在IPad上运行出错的故障原因分析及应对措施

    网页在PC 上运行正常,在IPad上运行出错的故障原因分析及应对措施 最近在测试一个管理系统网站时,发现该网站在PC上运行一切正常,但在Ipad 上运行时,提示网页出现问题,需要重新提交表格,复新提交 ...

  6. getparameter方法中文显示问号解决方法_电脑显示器花屏怎么办 电脑显示器花屏解决方法【原因分析】...

    本文告诉大家电脑显示器花屏怎么办呢,电脑显示器花屏解决方法和原因分析: 指电脑屏幕上有与常色不同的条纹,斑点或色块,或有位置颠倒.错乱,屏幕抖动.扭曲等情况. 显示器花屏是极其常见的故障,产生的原因有 ...

  7. html文本显示不完整,div css网页显示不完整的原因分析及解决方案

    如果你的网页布局还没有?弃ie6,就有可能会出现网页内容显示不完事的问题,现在我们来告诉你出现这个问题的原因及如何解决. 常常在低版本的浏览器如IE6查看一个网页显示完整,而在IE7及以上版本浏览器. ...

  8. aoc显示器开机显示计算机,附加aoc显示器开机黑屏的原因分析及解决方法!

    有时我们的aoc监视器打开并且黑屏为黑屏,我们该怎么办?让我们向编辑学习,简要介绍aoc显示器打开时黑屏的原因和解决方案!我希望你喜欢它! 启动时aoc显示屏黑屏的原因分析和解决方法: 1.显示器的V ...

  9. 计算机登陆用户显示黑屏,win7系统电脑开机输入登录账号密码后出现黑屏的原因分析及两种解决方法...

    一位用户说win7开机输入登录账号密码后出现黑屏,这是怎么回事呢?这种情况怎么解决呢?下面脚本之家的小编就带来win7系统电脑开机输入登录账号密码后出现黑屏的原因分析及解决方法,一起来看看吧. 故障原 ...

  10. word显示打印机服务器脱机,打印机显示脱机无法打印的原因分析和解决办法

    本文针对打印机显示脱机现象而导致的无法打印情况,进行了相关原因分析,并给出一些解决方法,可以供用户进行参考. 一.打印机脱机原因: 1 你打印机的数据线没有和电脑连着 2 打印机的数据线没有和打印机连 ...

最新文章

  1. IOS 获取缓存目录文件大小并清除
  2. oracle计费系统相关问题,用radius和oracle做认证计费系统
  3. 销售订单屏幕增强及功能增强
  4. MySQL分组查询—添加分组前筛选
  5. php上传图片类型代码,php 上传图片的代码
  6. 阿里云仓库使用小技巧
  7. php用vscode开发,VSCode PHP开发
  8. 如何计算页面打开获取流量_网站SEO优化如何获取更多的流量?
  9. 黑客攻防技术宝典浏览器实战篇
  10. pytorch 计算模型的GFlops和total params的方法
  11. docker以外的构建、运行、管理和分发容器候选项
  12. C#——初识Console
  13. apache 的配置文件hthp.conf里边都是什么意思?
  14. 1s内能执行多少次for循环
  15. 关于网络文学发展形势的三点判断
  16. 快手签名算法php,2019 快手API签名算法
  17. Unsupervised Domain Adaptation for Semantic Segmentation by Content Transfer
  18. 500G硬盘的实际容量
  19. java写飞控_无人机飞行控制源码(android)
  20. eNSP网络构建—企业部门ip地址划分规划

热门文章

  1. halcon手眼标定
  2. 什么是JavaWeb,主要框架有哪些
  3. simulink 状态空间加反馈报错
  4. oc语言的优缺点有哪些
  5. Zbrush学习笔记十——制作毛发、模型减面
  6. SCM供应链管理系统有源码可以共享一下吗?
  7. RRT算法及其部分改进算法介绍
  8. 标准为先、产业当道,这次大会“探云”深刻……
  9. OctaneRender渲染器的硬件要求是什么
  10. wget下载nessus