smallant
驱动牛犊
驱动牛犊
  • 注册日期2005-01-16
  • 最后登录2005-04-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2765回复:11

续:如何使模板资源创建的对话框作为主窗口显示?我已经解决这个问题,现提供代码给象我一样的菜鸟

楼主#
更多 发布于:2005-03-02 00:57
我刚学Win API编程,我想实现如题所示的功能.
我在VC++ 6.0的资源管理器中作好一个Dialog,请问怎样使它成为我的应用程序的主窗口,小弟看了msdn中的说明,感觉仍不清楚,请DX们不吝赐教!!
我目前是先创建一个主窗口,然后不显示,在WindowProc的WM_CREATE消息中再创建该Dialog.但是我感觉这种方法不好,应该有一种标准的做法吧?  

[编辑 -  3/6/05 by  smallant]
seahawk
驱动牛犊
驱动牛犊
  • 注册日期2005-02-13
  • 最后登录2006-03-08
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-02 21:18
我刚学Win API编程,我想实现如题所示的功能.
我在VC++ 6.0的资源管理器中作好一个Dialog,请问怎样使它成为我的应用程序的主窗口,小弟看了msdn中的说明,感觉仍不清楚,请DX们不吝赐教!!
我目前是先创建一个主窗口,然后不显示,在WindowProc的WM_CREATE消息中再创建该Dialog.但是我感觉这种方法不好,应该有一种标准的做法吧?


据我所知,应该是在WM_INITDIALOG中初始化。

HWND hwndOwner;
RECT rc, rcDlg, rcOwner;
 
    case WM_INITDIALOG:
        if ((hwndOwner = GetParent(hwndDlg)) == NULL)
        {
            hwndOwner = GetDesktopWindow();
        }
        GetWindowRect(hwndOwner, &rcOwner);
        GetWindowRect(hwndDlg, &rcDlg);
        CopyRect(&rc, &rcOwner);
        OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top);
        OffsetRect(&rc, -rc.left, -rc.top);
        OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom);
 
        SetWindowPos(hwndDlg,
            HWND_TOP,
            rcOwner.left + (rc.right / 2),
            rcOwner.top + (rc.bottom / 2),
            0, 0,
            SWP_NOSIZE);
 
        if (GetDlgCtrlID((HWND) wParam) != ID_ITEMNAME)
        {
            SetFocus(GetDlgItem(hwndDlg, ID_ITEMNAME));
            return FALSE;
        }
        return TRUE;
傍海渔村酣睡足 斜阳一脉洒千山 鲲鹏不待风潮起 万古江山多寂寥
smallant
驱动牛犊
驱动牛犊
  • 注册日期2005-01-16
  • 最后登录2005-04-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-04 11:18
非常感谢你的回答,分已经给了。
可能你还没明白我的意思,其实我想实现的是MFC AppWizard生成的\"基于对话框的应用程序\"那种效果。这个问题我已经解决,但是如果你有好方法,不妨告诉我,我希望知道更多!
seahawk
驱动牛犊
驱动牛犊
  • 注册日期2005-02-13
  • 最后登录2006-03-08
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-04 16:25
非常感谢你的回答,分已经给了。
可能你还没明白我的意思,其实我想实现的是MFC AppWizard生成的\"基于对话框的应用程序\"那种效果。这个问题我已经解决,但是如果你有好方法,不妨告诉我,我希望知道更多!


小蚂蚁同志,你说的是什么效果呀?:)
傍海渔村酣睡足 斜阳一脉洒千山 鲲鹏不待风潮起 万古江山多寂寥
smallant
驱动牛犊
驱动牛犊
  • 注册日期2005-01-16
  • 最后登录2005-04-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-06 15:59
基于\"客户化对话框做主窗口\"的应用程序框架
附件名称/大小 下载次数 最后更新
2005-03-06_CustomDlgBased.rar (1316KB)  5
smallant
驱动牛犊
驱动牛犊
  • 注册日期2005-01-16
  • 最后登录2005-04-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-03-06 16:03
基于\"模态对话框做主窗口\"的应用程序框架
附件名称/大小 下载次数 最后更新
2005-03-06_ModeDlgBased.rar (728KB)  6
smallant
驱动牛犊
驱动牛犊
  • 注册日期2005-01-16
  • 最后登录2005-04-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-03-06 16:07
基于\"无模态对话框做主窗口\"的应用程序框架
附件名称/大小 下载次数 最后更新
2005-03-06_ModelessDlgBased.rar (734KB)  5
smallant
驱动牛犊
驱动牛犊
  • 注册日期2005-01-16
  • 最后登录2005-04-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-03-06 16:32
    研究这三个例子,可以进一步理解windows程序的窗口创建机制和消息循环,放在这里,希望和象我一样刚开始学习的菜鸟分享战果.
    在msdn中不知道哪里有显式具体的说明?我找了很久,都没有找到,我是在看了很多章节后总结出来的,如果有高手看到这个的话,请给小弟指点一下,不胜感谢!
    如果谁还有什么好方法请告诉我.
seahawk
驱动牛犊
驱动牛犊
  • 注册日期2005-02-13
  • 最后登录2006-03-08
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-03-06 18:15
   研究这三个例子,可以进一步理解windows程序的窗口创建机制和消息循环,放在这里,希望和象我一样刚开始学习的菜鸟分享战果.
    在msdn中不知道哪里有显式具体的说明?我找了很久,都没有找到,我是在看了很多章节后总结出来的,如果有高手看到这个的话,请给小弟指点一下,不胜感谢!
    如果谁还有什么好方法请告诉我.


小蚂蚁同志,如果你找的是微软的\"样板戏\",那么下面就是
1。模式对话框
if (DialogBox(hinst,
MAKEINTRESOURCE(DLG_DELETEITEM),
hwnd,
(DLGPROC)DeleteItemProc)==IDOK){
// Complete the command; szItemName contains the
// name of the item to delete.
}
else{
// Cancel the command.
}
通过下面代码存取对话框内容
GetDlgItemText(hwndDlg,ID_ITEMNAME,szItemName, 80)

2。无模式对话框
hwndGoto = CreateDialog(hinst,
MAKEINTRESOURCE(DLG_GOTO),
hwnd, (DLGPROC) GoToProc);

ShowWindow(hwndGoto, SW_SHOW);
消息泵
BOOL bRet;

while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0 )
{
    if (bRet == -1 )
    {
        // handle the error and possibly exit
    }
    else if (!IsWindow(hwndGoto) || !IsDialogMessage(hwndGoto, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

和你的没有什么区别,主要的区别就是,因为createdialog和dialog box都是宏,都发送了WM_INITDIALOG,于是他们都通过一个WM_INITDIALOG来初始化了对话框。还有,他们都通过MAKEINTRESOURCE来传递对话框id,但是楼主直接使用(LPCTSTR),我觉得这样不好,可能造成以后版本的问题。

呼吁:
向小蚂蚁兄学习,相互学习交流!
傍海渔村酣睡足 斜阳一脉洒千山 鲲鹏不待风潮起 万古江山多寂寥
smallant
驱动牛犊
驱动牛犊
  • 注册日期2005-01-16
  • 最后登录2005-04-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-03-07 18:12
对\"基于客户话对话框作主窗口\"的应用程序框架的更正.
由于先前有些概念没有弄清,所以写了上面的代码,虽然它说不上是
错误,但是我以为它是下面代码的一个特例,下面的代码可以更改地
帮助理解一些概念:
附件名称/大小 下载次数 最后更新
2005-03-07_CustomDlgBased_Modified.rar (1327KB)  5
seahawk
驱动牛犊
驱动牛犊
  • 注册日期2005-02-13
  • 最后登录2006-03-08
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-03-08 08:52
对\"基于客户话对话框作主窗口\"的应用程序框架的更正.
由于先前有些概念没有弄清,所以写了上面的代码,虽然它说不上是
错误,但是我以为它是下面代码的一个特例,下面的代码可以更改地
帮助理解一些概念:


佩服!佩服的是你咬定青山不放松,仔细琢磨的这种精神,尤其是在看你的注释的时候,更觉得你是一个能潜心做事的人;不浮躁,也许这就是对底层开发的要求和与那些rpd程序员的区别吧。
傍海渔村酣睡足 斜阳一脉洒千山 鲲鹏不待风潮起 万古江山多寂寥
yjx2003
驱动牛犊
驱动牛犊
  • 注册日期2004-06-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-03-28 18:38
好人啊 :D :D :D :D :D :D
请向您的朋友推荐《名人传记》电子期刊 http://list.cn99.com/cgi-bin/getlsts?listname=zhuanji
游客

返回顶部