当前位置:首页 >> 编程开发 >> Visual C++ >> 内容

Win32开发入门(18):使用对话框的两个技巧

时间:2015/5/19 21:32:21 作者:平凡之路 来源:xuhantao.com 浏览:

相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理 。今天,我向大家分享两个使用对话框的技巧,还是比较实用的。不用担心,先喝杯茶,很简单的,一 点也不复杂,总之,看俺写的博客,你不会有思想压力的。放心好了。

这两个技巧分别是:

1、在显示某个对话框时,向对话框传递数据。

这个我相信大家能够理解,就好比咱们 在做Web开发的时候,在打开一个页面时,可能会考虑向目标页面传一些参数,如这样http://www.牛 B.com/yyy.aspx?tid=19999,是吧,我们都很经常这样做,所以,在玩Win32的时候,我们也同样希望 这样。

我们知道,要显示一个模态对话框,可以调用DialogBox函数,这个不难,我有理由相信 大家只需稍稍研究一下,一定会玩的,就像遥控飞机那么简单。如果你认真阅读MSDN,你一定会发现有 这么一个函数:DialogBoxParam。怎么样,是不是和前面的那个DialogBox很像,只是脑袋后面多了几 根汗毛罢了,而且,从Param就可以猜到,应该与参数传递有关。对,猜得相当好,我们在显示某个对 话框时,要向对话框传参数,就是用它了。

顺便提一下,什么是模态对话框呢?模态对话框就 是说如果这个对话框弹出来(显示)了,你就不能操作父窗口或者其上面的控年了,程序也会在弹出对 话框后停下,直到操作完成了,你把对话框关了,程序才会继续,你才能操作其他控件,就好像你开车 上班,行驶到某个路口,前面有几辆车突然停了下来,车上下来一群不男不女的人,在马路上打起架来 了,导致交通严重受阻,你的车夹在车流中间,既不前进,也不能后退,就卡在那里,你估计只好呆在 车里,拿出MP5,看看恐怖片,等到交通恢复正常了,才能继续行车。

看看这个DialogBoxParam 函数的定义:

INT_PTR WINAPI DialogBoxParam(     
  _In_opt_  HINSTANCE hInstance,     
  _In_      LPCTSTR lpTemplateName,     
  _In_opt_  HWND hWndParent,     
  _In_opt_  DLGPROC lpDialogFunc,     
  _In_      LPARAM dwInitParam     
);

前面几个参数估计不用我介绍了,大家都认识,比周杰伦和刀郎还要出名。重点是最后一 个参数,它是一个LPARAM类型的,我记得Win32的许多类型的命名是有规律的,你看看,凡是P开头或者 LP开头都是指针类型,不信你可以总结一下。

所以这个参数肯定是指定某种未知生物的指针, 指针存的是地址,所以我们通过把我们要传给对话框的数据的地址传给这个参数,这样,对话框的消息 处理函数如果想取到你传给它的数据,就从这个地址去找。就好像你同学介绍了一位美女给你认识,他 告诉你这位MM的QQ号,然后你想泡她你就知道怎么做了,加QQ聊呗。

那么,这个参数会传到哪 里去呢,怎么取出来呢?这个参数传给了WM_INITDIALOG消息的lParam参数,所以,在对话框的消息处 理函数中,捕捉WM_INITDIALOG消息,从它的lParam参数就可以找到数据的首地址了。

显示对话 框并传递参数。

DialogBoxParam(glo_hInst,     
    MAKEINTRESOURCE(IDD_DLG1),     
    hwnd,     
    (DLGPROC)DialogProcWithPrm,     
    (LPARAM)L"Win32程序好玩不?");

我传递了一些文本给它,即“Win32程序好玩不?” ,接着在响应WM_INITDIALOG消息时就接收并显示这个参数。

switch (uMsg)     
{     
case WM_INITDIALOG:     
    {     
        LPCWSTR param = (LPCWSTR)lParam;     
        //取得显示文本控件的句柄     
        HWND stDisplay = GetDlgItem(hwndDlg, IDC_STINFO);     
        //设置文本     
        SendMessage(stDisplay, WM_SETTEXT, NULL, (WPARAM)param);     
    }     
    return 0;

哈哈,不难吧。

2、获取对话框返回的数据。

前面是传数据给 对话框,现在要反过来,是获得从对话框传回来的数据。刚才我们说了,模态对话框显示时,父窗口会 在等待,等啥,就是等DialogBox返回,它返回的类型是INT_PTR,所以,如果要返回比较复杂的数据, 可以用它来保存指针,因为指针本质上就是一个数值。

// 显示对话框并取得返回的数据     
LPCWSTR returnData = (LPCWSTR)DialogBox(glo_hInst,MAKEINTRESOURCE(IDD_DLG2),hwnd,

(DLGPROC)DialogProcWithRtVl);     
if(returnData != NULL)     
{     
    //先将字符拷贝一次     
    WCHAR str[100];     
    wcscpy(str, returnData);     
    //显示从对话框返回的内容     
    MessageBox(hwnd, str, L"从对话框返回的数据", MB_OK);     
}     
break;

我这个例子是在对话框中输入一些字符,然后把这些字符串返回。所以,返回的内容 是指向字符数组首地址的指针,故我直接把它转换为LPCWSTR类型的变量。

在对话框中,调用 EndDialog结束对话框,并在第二个参数中传回数据。

if(LOWORD(wParam)== IDOK)     
{     
    //获得Edit编辑框的句柄     
    HWND hEdit = GetDlgItem(hwndDlg, IDC_EDTIN);     
    //获得文本     
    WCHAR wText[100];     
    int len = Edit_GetText(hEdit, wText, 100);     
    EndDialog(hwndDlg, (INT_PTR)wText);//退出对话框并返回数据     
}

例子运行之后的结果可以看看下面的截图。

示例源代码随后我上传到资源区,有兴趣的朋友可以下载来玩一 下。

相关文章
  • 没有相关文章
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1