弹出(子)对话框以及对其控件进行操作

【弹出对话框】

1,添加对话框。

要想弹出对话框,首先肯定要先新建一个对话框。这里默认你已经建立了主MFC的情况,这样才会在解决方案资源管理器那边有【资源视图】这一选项卡。

【资源视图】——【Dialog】——右键【insert dialog】

一个dialog新建完毕。

2,为dialog添加对应的类

右击【dialog】——【添加类】——输入类名(假设为 A)点击确定

完成这两步,一个对话框就能被调用了。

3,弹出对话框

例如需要点击主对话框的确定按钮弹出上述dialog,那么双击【确定】按钮,或右击【确定】添加单击的消息响应函数。

在其中添加:

A a;

a.DoModal();

这里DoModal是以【模态对话框】形式展现,即这个对话框弹出后别的对话框不能使用直到当前对话框关闭。

需要注意的是,新建对话框时,默认有确定和取消两个按钮的,它们的ID默认为IDOK和IDCancel,DoModal函数返回值为可以为这两个ID,表示点击了某个按钮。例如:

INT_PTR  flag = a.DoModal();

if (flag == IDOK)

{...}

====================================================================

【对其控件进行操作】

最头疼的是如何对子对话框的控件进行操作。这里用【如何在主程序中获得子窗口编辑框中键盘键入的数据】为例。

1,首先肯定要给这个eidtBox关联一个变量。

右击dialog中的编辑框控件,添加变量,假设为g_getName。

做完这一步,在A.cpp中的DoDataExchange函数中已经自动将变量和编辑框的ID关联起来了。

但是,这并不代表输入编辑框的值会自动赋给getName变量,也就是说,DoDataExchange函数不会自动执行

2.编辑框变量值g_getName能够响应用户用键盘输入的值

之前我还费尽心思添加一个OnInitDialog虚函数,并在虚函数里采用

bool get_peopleid::oninitdialog()
{
    cdialogex::oninitdialog();

    // todo:  在此添加额外的初始化
    char id_num[20] = { 0 };
    cstring str;
    str= _t("");
    str.format(_t("gfdgh"));
    g_getname.setwindowtext(str);

    updatedata(true);

    g_getname.getwindowtext(str);
        return TRUE;
}

类似这种方法,希望能够利用updatedata函数来更新编辑框的变量值。然并卵,除了能初始化显示gfdfh在对话框中之外,其他都行不通。

后来看了这篇文章http://wenku.baidu.com/view/04a27d6a561252d380eb6e49.html。想起,此处只要相应一个消息函数即可。

//sample代码,下面还会说到
void get_PeopleID::OnBnClickedOk()
{
    // TODO:  在此添加控件通知处理程序代码
    CString str;
    g_getName.GetWindowText(str);
    std::cout << str << std::endl;   //a
    AfxMessageBox(str);                 //b
    CDialogEx::OnOK();

}

这样str就是你输入的值啦。

3,获取编辑框的值

a,句柄说(获取子对话框空间值,反正我是行不通)

char id_num[10]="";
SendMessageA(h, WM_GETTEXT, sizeof(id_num), LPARAM(id_num));

据说这样可以将h句柄的值读入id_num中,所以我们只要找到编辑框的句柄值就好了嘛。

网上有好几种方法获取句柄,代表性的为:

a.1 GetDlgItem函数, h= GetDlgItem(getName)->GetSafeHwnd();

然而,这样得出的id_num是主MFC中编辑框的值。是的,虽然我填的是子对话框editBox的ID,但是得出的仍然是主对话框的值。 GetDlgItem()函数是不能获取子对话框的句柄的。

a.2 spy++

据说,【工具】中有个spy的东东可以查看控件的句柄,而且可视化,点哪显示哪,试一下(自行百度spy的用法),果然名不虚传。But,
HWND h = (HWND)0x000003ed;//手工spy查到的editBox的句柄值
SendMessageA(h, WM_GETTEXT, sizeof(id_num), LPARAM(id_num));

显示的结果是 id_num的空,多试几次后发现每次的h值都不一样,原来每次程序都会分配新的句柄值嘛!所以怎么能用上一次的值来查找这次的句柄呢~

a.3 FindWindowEx函数

HWND hWnd = ::GetForegroundWindow();
HWND handle1 = ::FindWindowEx(hWnd, 0, NULL, "getName"); //handle1=00000

先找到当前窗口的句柄值,各种窗口的句柄值获取请参照:http://my.oschina.net/u/2314763/blog/422622?fromerr=SobXFhyw

然而事实证明还是不能显示

a.4 既然在主函数中总是获取不到子对话框控件的句柄值,那我在A.cpp中设置好返回总可以吧。

// A.cpp
char* get_PeopleID::get_handle()
{

    char id_num[10] = "";
    SendMessageA(g_getName.m_hWnd, WM_GETTEXT, sizeof(id_num), LPARAM(id_num)); //g_getName.m_hWnd直接获取控件句柄
    std::cout << id_num << std::endl;
    return id_num;
}

调用get_handle之前我有在单击确定按钮中加入g_getName.GetWindowText(str);将对话框的值与变量连接。在main.cpp中先点击确定执行此处,在调用get_handle,想返回id_num,无果。依然为空。

b,GetWindowText及CString to char* 的转换

上述sample代码中已经已经获取到了输入的值,并保存在str(可以设置为A的全局变量,方便在其他类中获取)中,但是如果不采用AfxMessageBox,在std中看到的类似于地址的输出,这是怎回事呢?原来CString用cout输出的是str地址

如果你单纯的要显示在控制台中,只需要printf(“%S”,str)即可,注意S大写。

但是如果你之后还要用,需要进行转换,例如转换成char*,可以参照博文http://blog.163.com/ming__nan/blog/static/6783288200991111281852/

此处将最有效代码直接贴出,网上其他的什么强制转换经实验大部分都是扯淡。

// CString str to char* c
int len = WideCharToMultiByte(CP_ACP, 0,str, -1, NULL, 0, NULL, NULL);//Cstring To char * in Unicode character set
char* c = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, str, -1, c, len, NULL, NULL);
时间: 2024-12-28 22:52:18

弹出(子)对话框以及对其控件进行操作的相关文章

从仿QQ消息提示框来谈弹出式对话框

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45896477 [导航] - 自定义弹出式对话框的简单用法 列举各种常见的对话框实现方案 1.概述 android原生控件向来以丑著称(新推出的Material Design当另说),因此几乎所有的应用都会特殊定制自己的UI样式.而其中弹出式提示框的定制尤为常见,本篇我们将从模仿QQ退出提示框来看一

ASP.NET点击按钮弹出确认对话框方法

开发asp.net网页应用程序的时候,有些页面的按钮需要增加一个确认对话框,比如: 实现这个功能比较简单,代码这样写: Button.Attributes["onclick"] = "javascript:return confirm('您确定删除吗?一旦删除将无法恢复!');"; 或 Button.Attributes.Add("OnClick", "javascript:return confirm('您确定删除吗?一旦删除将无法恢

WPF:设置弹出子菜单的是否可用状态及效果

需求: 设置弹出子菜单(二级)项仅首项可用,其他项均不可用:不可用是呈灰色效果. 注: 菜单项都是依据层级数据模板.具体格式如下: StackBlock{TextBlock{Image}.TextBlock}} 问题: 1.窗体加载后,获取不到二级子菜单控件(二级菜单项弹出后,可获取所有二级子菜单). 注:仅能获取一级菜单控件,但能获取二级子菜单绑定的数据源. 2.层级数据模板内StackBlock设置为不可用时(绑定数据源实现),弹出子菜单不可用,但恢复程序中恢复StackBlock设置为可用

Webdriver实现下载功能,屏蔽掉windows弹出的对话框,FireFox下设置浏览器的属性,两种实现方式:

一.使用一个全新的FireFox浏览器打开Web应用,浏览器不带任何插件,也未对浏览器做任何默认配置,但需要对浏览器属性进行配置 // 获取浏览器的所有配置文件 ProfilesIni allProfiles = new ProfilesIni(); // "Selenium" 是之前创建的profile,不带任何插件,也未对浏览器做任何默认配置 FirefoxProfile profile = allProfiles.getProfile("selenium");

ASP.net后台弹出消息对话框的方法!【转】

在winform后台,我们通过MessageBox.show(“消息")的方式来返回后台信息,在webform后台,我们通过Response.write(”消息")来返回后台消息,但这样需要将消息值以字符串形式显示到前台页面,是否有类似于MessageBox.show("消息")的方式弹出信息呢.我们会很快想到javascript的alert方法.通过在后台调用js来实现alert的调用.用法为:Response.write("<script>

Android编程:底部弹出的对话框

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:Android Studio 2.2 Preview 3 说明: 两种方法实现底部弹出的对话框: Dialog DialogFragment 推荐用DialogFragment 效果图: 布局文件dialog_select_call.xml: <?xml version="1.0" encoding="utf-8"?> &l

WPF FileFolderDialog 和弹出子窗口的一些问题

摘要:本文主要是WPF中 FileFolderDialog的相关问题,补充了关于在父窗口弹出子窗口,以及子窗口的相关属性(Data Binding)和命令绑定(Delegate Command)问题,里面还有关于如何使用读写xml文件内容的方法. 需要注意的地方: (1)对于每一个窗口(父窗口和子窗口),如果涉及到Data Binding相关问题的时候,均需要设置其对应的DataContext(一般为其ViewModel); (2)对于未在构造函数中初始化的属性,需要在定义的时候进行实例化(如下

MFC 弹出模态对话框

在一个稍微大一点的程序中往往需要多个窗体来进行交换.有些窗体的出现是为了提醒用户注意或是为了实现一项指定功能,不希望用户在关闭这个窗口前对相应程序的其他窗体进行操作,这个时候会用到模式对话框,本文所讲的就是如何在 MFC 中创建一个最为简单的对话框,并在一定条件下以模态弹出该对话框. 第一步:创建对话框,在程序的资源视图中Dialog文件夹处右键->插入对话框 第二步:为对话框添加对应的对话框类,双击相应对话框视图->在弹出的"MFC添加类向导"中填入对话框类名->点

解决每次启动都弹出UAC对话框

1.下载并安装微软官方工具 Microsoft Application Compatibility Toolkit 2.右击“Microsoft Application Compatibility Toolkit 5.5”程序组中的“Compatibility Administrator”,选择“以管理员身份运行”,单击“是”打开该工具. 3.单击工具栏上的“New”按钮,然后右击“Custom Databases”下的“New Database(1)”出现菜单,选择“Create New”下的