阅读:2827回复:11
续:如何使模板资源创建的对话框作为主窗口显示?我已经解决这个问题,现提供代码给象我一样的菜鸟
我刚学Win API编程,我想实现如题所示的功能.
我在VC++ 6.0的资源管理器中作好一个Dialog,请问怎样使它成为我的应用程序的主窗口,小弟看了msdn中的说明,感觉仍不清楚,请DX们不吝赐教!! 我目前是先创建一个主窗口,然后不显示,在WindowProc的WM_CREATE消息中再创建该Dialog.但是我感觉这种方法不好,应该有一种标准的做法吧? [编辑 - 3/6/05 by smallant] |
|
沙发#
发布于:2005-03-02 21:18
我刚学Win API编程,我想实现如题所示的功能. 据我所知,应该是在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; |
|
|
板凳#
发布于:2005-03-04 11:18
非常感谢你的回答,分已经给了。
可能你还没明白我的意思,其实我想实现的是MFC AppWizard生成的\"基于对话框的应用程序\"那种效果。这个问题我已经解决,但是如果你有好方法,不妨告诉我,我希望知道更多! |
|
地板#
发布于:2005-03-04 16:25
非常感谢你的回答,分已经给了。 小蚂蚁同志,你说的是什么效果呀?:) |
|
|
地下室#
发布于:2005-03-06 15:59
基于\"客户化对话框做主窗口\"的应用程序框架
|
|
|
5楼#
发布于:2005-03-06 16:03
基于\"模态对话框做主窗口\"的应用程序框架
|
|
|
6楼#
发布于:2005-03-06 16:07
基于\"无模态对话框做主窗口\"的应用程序框架
|
|
|
7楼#
发布于:2005-03-06 16:32
研究这三个例子,可以进一步理解windows程序的窗口创建机制和消息循环,放在这里,希望和象我一样刚开始学习的菜鸟分享战果.
在msdn中不知道哪里有显式具体的说明?我找了很久,都没有找到,我是在看了很多章节后总结出来的,如果有高手看到这个的话,请给小弟指点一下,不胜感谢! 如果谁还有什么好方法请告诉我. |
|
8楼#
发布于:2005-03-06 18:15
研究这三个例子,可以进一步理解windows程序的窗口创建机制和消息循环,放在这里,希望和象我一样刚开始学习的菜鸟分享战果. 小蚂蚁同志,如果你找的是微软的\"样板戏\",那么下面就是 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),我觉得这样不好,可能造成以后版本的问题。 呼吁: 向小蚂蚁兄学习,相互学习交流! |
|
|
9楼#
发布于:2005-03-07 18:12
对\"基于客户话对话框作主窗口\"的应用程序框架的更正.
由于先前有些概念没有弄清,所以写了上面的代码,虽然它说不上是 错误,但是我以为它是下面代码的一个特例,下面的代码可以更改地 帮助理解一些概念: |
|
|
10楼#
发布于:2005-03-08 08:52
对\"基于客户话对话框作主窗口\"的应用程序框架的更正. 佩服!佩服的是你咬定青山不放松,仔细琢磨的这种精神,尤其是在看你的注释的时候,更觉得你是一个能潜心做事的人;不浮躁,也许这就是对底层开发的要求和与那些rpd程序员的区别吧。 |
|
|
11楼#
发布于:2005-03-28 18:38
好人啊 :D :D :D :D :D :D
|
|
|