作者:朱金灿

来源:http://blog.csdn.net/clever101

一般而言,在 Windows编程中创建对话框需要先定义一个对话框资源。我想能不能不用资源文件单纯通过代码创建对话框呢?晚上搜索了一些资料,研究了一下,基本实现了。

我写了一个KDialog,代码如下(代码中有一些注释,相信大家能基本看懂):

头文件的代码:

// kdialog.h
#ifndef KDIALOG_H_INCLUDED
#define KDIALOG_H_INCLUDED#define ID_HELP   150
#define ID_EDIT   180
#define ID_TEXT   200class KDialog
{
public:KDialog(HINSTANCE hinst, HWND hwndOwner);~KDialog();virtual INT_PTR DoModal();protected:// API中注册的消息处理函数,不能是成员函数,因为成员函数有this指针static BOOL CALLBACK DialogProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam);private:HWND  m_hOwnerWnd;HINSTANCE m_hInst;};#endif // KDIALOG_H_INCLUDED

Cpp文件的代码:

#include "kdialog.h"#include "resource.h"BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM) ;LPWORD lpwAlign ( LPWORD lpIn)
{ULONG ul;ul = (ULONG) lpIn;ul +=3;ul >>=2;ul <<=2;return (LPWORD) ul;
}KDialog::KDialog(HINSTANCE hinst, HWND hwndOwner)
{m_hInst = hinst;m_hOwnerWnd = hwndOwner;
}KDialog::~KDialog()
{}char nEditTwo[128]= "从这儿输入字符串." ;BOOL CALLBACK KDialog::DialogProc(HWND hDlg,UINT uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){case WM_INITDIALOG :SetDlgItemText ( hDlg, ID_EDIT, nEditTwo );return TRUE ;case WM_COMMAND :switch (LOWORD (wParam)){case ID_EDIT :GetDlgItemText (hDlg, ID_EDIT, nEditTwo, 127);return TRUE;case ID_HELP :MessageBox( NULL, nEditTwo, "输入数据", MB_OK | MB_SYSTEMMODAL | MB_NOFOCUS);return TRUE;case IDOK :EndDialog (hDlg, 0) ;return TRUE ;}break ;case WM_CLOSE:EndDialog (hDlg, 0) ;return TRUE ;default:break;}return FALSE ;
}INT_PTR KDialog::DoModal()
{HGLOBAL hgbl;LPDLGTEMPLATE lpdt;LPDLGITEMTEMPLATE lpdit;LPWORD lpw;LPWSTR lpwsz;LRESULT ret;int nchar;hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);if (!hgbl)return -1;lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);// Define a dialog box.lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU| DS_MODALFRAME | WS_CAPTION;lpdt->cdit = 3;  // number of controlslpdt->x  = 10;lpdt->y  = 10;lpdt->cx = 100;lpdt->cy = 70;lpw = (LPWORD) (lpdt + 1);*lpw++ = 0;   // no menu*lpw++ = 0;   // predefined dialog box class (by default)lpwsz = (LPWSTR) lpw;nchar = 1+ MultiByteToWideChar (CP_ACP, 0, "内存对话框", -1,lpwsz, 50);lpw   += nchar;//-----------------------// Define an OK button.//-----------------------lpw = lpwAlign (lpw);lpdit = (LPDLGITEMTEMPLATE) lpw;lpdit->x  = 10;lpdit->y  = 50;lpdit->cx = 80;lpdit->cy = 15;lpdit->id = IDOK;  // OK button identifierlpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;lpw = (LPWORD) (lpdit + 1);*lpw++ = 0xFFFF;*lpw++ = 0x0080;    // button classlpwsz = (LPWSTR) lpw;nchar = 1+MultiByteToWideChar (CP_ACP, 0, "退出", -1, lpwsz, 50);lpw   += nchar;*lpw++ = 0;              // no creation data//-----------------------// Define a Help button.//-----------------------lpw = lpwAlign (lpw);lpdit = (LPDLGITEMTEMPLATE) lpw;lpdit->x  = 10;lpdit->y  = 30;lpdit->cx = 80;lpdit->cy = 15;lpdit->id = ID_HELP;    // Help button identifierlpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;lpw = (LPWORD) (lpdit + 1);*lpw++ = 0xFFFF;*lpw++ = 0x0080;                 // button class atomlpwsz = (LPWSTR) lpw;nchar = 1+MultiByteToWideChar (CP_ACP, 0, "显示输入", -1, lpwsz, 50);lpw   += nchar;*lpw++ = 0;                      // no creation data//-----------------------// Define a EDIT.//-----------------------lpw = lpwAlign (lpw);lpdit = (LPDLGITEMTEMPLATE) lpw;lpdit->x  = 10;lpdit->y  = 10;lpdit->cx = 80;lpdit->cy = 12;lpdit->id = ID_EDIT;    // Help button identifierlpdit->style = ES_LEFT | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;lpw = (LPWORD) (lpdit + 1);*lpw++ = 0xFFFF;*lpw++ = 0x0081;                 // edit class atom*lpw++ = 0;                      // no creation dataGlobalUnlock(hgbl);ret = DialogBoxIndirect(m_hInst,(LPDLGTEMPLATE) hgbl,m_hOwnerWnd,(DLGPROC) DialogProc);GlobalFree(hgbl);return ret;
}

外部调用的方法也很简单(把应用程序句柄和对话框的所有者窗口句柄传进来即可):

             KDialog dlg(m_hInst,m_hWnd);dlg.DoModal();

上面创建的是模式对话框,下面是创建非模式对话框的代码:

BOOL KDialog::DoModeless()
{HGLOBAL hgbl;LPDLGTEMPLATE lpdt;LPDLGITEMTEMPLATE lpdit;LPWORD lpw;LPWSTR lpwsz;LRESULT ret;int nchar;hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);if (!hgbl)return FALSE;lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);// Define a dialog box.lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU| DS_MODALFRAME | WS_CAPTION;lpdt->cdit = 3;  // number of controlslpdt->x  = 10;lpdt->y  = 10;lpdt->cx = 100;lpdt->cy = 70;lpw = (LPWORD) (lpdt + 1);*lpw++ = 0;   // no menu*lpw++ = 0;   // predefined dialog box class (by default)lpwsz = (LPWSTR) lpw;nchar = 1+ MultiByteToWideChar (CP_ACP, 0, "内存对话框", -1,lpwsz, 50);lpw   += nchar;//-----------------------// Define an OK button.//-----------------------lpw = lpwAlign (lpw);lpdit = (LPDLGITEMTEMPLATE) lpw;lpdit->x  = 10;lpdit->y  = 50;lpdit->cx = 80;lpdit->cy = 15;lpdit->id = IDOK;  // OK button identifierlpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;lpw = (LPWORD) (lpdit + 1);*lpw++ = 0xFFFF;*lpw++ = 0x0080;    // button classlpwsz = (LPWSTR) lpw;nchar = 1+MultiByteToWideChar (CP_ACP, 0, "退出", -1, lpwsz, 50);lpw   += nchar;*lpw++ = 0;              // no creation data//-----------------------// Define a Help button.//-----------------------lpw = lpwAlign (lpw);lpdit = (LPDLGITEMTEMPLATE) lpw;lpdit->x  = 10;lpdit->y  = 30;lpdit->cx = 80;lpdit->cy = 15;lpdit->id = ID_HELP;    // Help button identifierlpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;lpw = (LPWORD) (lpdit + 1);*lpw++ = 0xFFFF;*lpw++ = 0x0080;                 // button class atomlpwsz = (LPWSTR) lpw;nchar = 1+MultiByteToWideChar (CP_ACP, 0, "显示输入", -1, lpwsz, 50);lpw   += nchar;*lpw++ = 0;                      // no creation data//-----------------------// Define a EDIT.//-----------------------lpw = lpwAlign (lpw);lpdit = (LPDLGITEMTEMPLATE) lpw;lpdit->x  = 10;lpdit->y  = 10;lpdit->cx = 80;lpdit->cy = 12;lpdit->id = ID_EDIT;    // Help button identifierlpdit->style = ES_LEFT | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;lpw = (LPWORD) (lpdit + 1);*lpw++ = 0xFFFF;*lpw++ = 0x0081;                 // edit class atom*lpw++ = 0;                      // no creation dataGlobalUnlock(hgbl);HWND hDlg = CreateDialogIndirect(m_hInst,(LPDLGTEMPLATE) hgbl,m_hOwnerWnd,(DLGPROC) DialogProc);if(NULL==hDlg)return FALSE;::ShowWindow(hDlg,SW_SHOW);GlobalFree(hgbl);return TRUE;
}

效果图如下:

具体的实现原理,大家请参考这篇文章:对话框模板,RegexTest,微软官网上也有相关的文章:UsingDialog Boxes。此外CodeProject上的一个例子:UsingDialog Templates to create an InputBox() in C++

转载于:https://www.cnblogs.com/lanzhi/archive/2012/02/23/6470859.html

不使用资源文件动态创建对话框的做法相关推荐

  1. 天翼宽带:资源文件无法创建

    硬件: 1.联想笔记本 2.中兴3G无线上网卡,中国电信网络 软件: 1.XP系统 2.有小红伞杀毒软件和360安全卫士 3.天翼宽带软件,含上网卡驱动 客户将上网程序弄坏,无法上网,于是卸载天翼宽带 ...

  2. 使用资源文件绘制Win32对话框

    以前一直以为Win32不能拖控件,现在才知道原来是可以的. 本文演示使用VC6创建一个基于对话框的Win32程序,界面使用资源文件绘制. 创建一个Win32应用程序 创建对话框资源文件 点击 File ...

  3. Visual C# 资源文件编程--创建资源文件

    资源文件顾名思义就是存放资源的文件.资源文件在程序设计中有着自身独特的优势,他独立于源程序,这样资源文件就可以被多个程序使用.同时在程序设计的时候,有时出于安全或者其他方面因素的考虑,把重要东西存放在 ...

  4. Android复习15【动画:创建资源文件夹、创建动画资源文件、组合动画、属性动画、材料设计新特性】

    2020-05-09-[12周-周四] Android动画 https://blog.csdn.net/zhangbijun1230/article/details/80262359 https:// ...

  5. k8命令,pod的启动流程与资源文件书写,k8s集群调度

    目录 一.常用命令及kubect介绍 1.kubect介绍 1)语法格式: 2)命名空间的概述 3)查看命名空间 4)查看命名空间中的资源对象 2.查用排错命令 1)查询资源文件 2)查看资源详细信息 ...

  6. 教程-Delphi资源文件(全面分析于使用)

    Delphi资源文件(全面分析之位图.光标.图标.AVI.JPEG.Wave)   几乎每个Windows应用程序都使用图标.图片.光标等资源.资源是程序的一部分,但是它是不可执行代码.下面我们就详细 ...

  7. 本周技术主题-----.net中的资源文件

    摘要: 讨论.net的资源文件 资源文件的创建: 1创建资源文件 ResourceWriter rw = new ResourceWriter ( "My.resources" ) ...

  8. 代码阅读总结之Fitch and Mather 7.0(资源文件Resource随笔)

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  9. iOS 优化资源文件

    资源文件是放置在应用程序本地与应用程序一起变异.打包和发布的非程序代码文件,如应用中的声音.视频.图片和文本文件等. 1.图片文件优化 图片文件优化包括文件格式和文件大小的优化.移动设备中,支持的图片 ...

最新文章

  1. DL之DNN:自定义MultiLayerNet(5*100+ReLU+SGD/Momentum/AdaGrad/Adam四种最优化)对MNIST数据集训练进而比较不同方法的性能
  2. vi-vim常用命令
  3. aix系统升级失败提示java_AIX系统补丁升级失败处理
  4. 读梁宁《一次失控引发的信任评估---我看胡紫薇事件》
  5. 微信公众号JSSDK中的wx.ready()和wx.error()问题
  6. linux下u盘的使用
  7. 修改MAC地址的方法(未测试)
  8. ORA-04031错误分析和解决
  9. 在ArcScene中导入显示自己在SketchUp创建并经过修饰的模型
  10. 淘宝开放接口api分享
  11. dht11传感器c语言程序,树莓派 DHT11 温湿度传感器读取 C 语言版
  12. 个性的留言.html,个性留言经典语录集锦
  13. android entries 变量选择,Spinner的使用(android:entries指定列表项)
  14. Zeepelin系列(一)Zeepelin安装和配置以及对Hive的基本使用
  15. MySQL索引相关知识整理学习
  16. 非计算机专业全国壹级,非计算机专业专科学生全国计算机一级等级考试应试策略...
  17. 用SETFOS模拟Tadf OLED和超荧光OLED
  18. Capacitor Plugin创建
  19. vue.js毕业设计,基于vue.js前后端分离在线教育视频点播系统(H5移动项目) 开题报告
  20. css中英文自动换行问题

热门文章

  1. 【转】frame与bounds的区别比较
  2. 二叉树的实现(Java语言描述)
  3. php两个编辑框一个提交按钮,一个表单中的两个提交按钮
  4. 路由器截获微信消息_小白智慧微信小程序无法打印的解决方案
  5. html横向导入word
  6. 三款JSON类库Jackson,Gson与JSON-lib的性能对比
  7. HDU 4651 Partition(整数拆分)
  8. IntelliJ IDEA 14 license key gen
  9. enter 默认搜索
  10. 编程题:字符串的指针引用。用指针法实现。功能:将字符串str2复制连接到str1...