如何动态修改对话框的style

headegg 2011-07-24 10:33:59
现在我有一个对话框,需要有两个环境下使用:

1)当作正常对话框独立打开使用(WS_POPUP)
2)当作另一个对话框里面的子窗口被调用(WS_CHILD)

这个对话框里的东西比较多,所以我不想动态再自己画一个,也不希望做成两个一样的对话框,一个是WS_POPUP,另一个是WS_CHILD,这两种方法以后同步维护都比较麻烦。

我希望有什么办法能切换对话框的STYLE。

我试了一下,如果不动态调用,而是画资源时就固定好,用WS_POPUP时的静态资源应该是这样:

IDD_MY_DD DIALOG DISCARDABLE 0, 0, 600, 200
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "My Caption"

而用WS_CHILD时的静态资源应该是这样

IDD_MY_DD DISCARDABLE 0, 0, 600, 200
STYLE DS_MODALFRAME | WS_CHILD

我现在两种情况都试过,如果是前一种,生成时这样修改:

m_dlgMyDD.Create(IDD_MY_DD,this);
m_dlgMyDD.ModifyStyle(WS_POPUP|WS_CAPTION|WS_SYSMENU,WS_CHILD);

没用,生成出来的还是POPUP的,只是没标题栏了。

如果后一种在 OnCreate中加了一句:

ModifyStyle(WS_CHILD,WS_POPUP|WS_CAPTION|WS_SYSMENU);

也没用,还是不是POPUP的。

请问有什么办法?

多谢!
...全文
357 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
headegg 2011-07-31
  • 打赏
  • 举报
回复
非常感谢schlafenhamster的说明和例。

可以工作,但和直接设还是些区别,需要作进一步修改。
schlafenhamster 2011-07-29
  • 打赏
  • 举报
回复
在我的资源,搜索“DlgStyle.zip”应该可以找到
headegg 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 schlafenhamster 的回复:]

给你上传了一个例子“DlgStyle.zip”
请参考。
[/Quote]

请问你说的这个zip在什么地方?
kyotrue 2011-07-28
  • 打赏
  • 举报
回复
POPUP必须在创建时指定,不能在后面再改
kyotrue 2011-07-28
  • 打赏
  • 举报
回复
ModifyStyle
ModifyStyleEx
schlafenhamster 2011-07-28
  • 打赏
  • 举报
回复
给你上传了一个例子“DlgStyle.zip”
请参考。
schlafenhamster 2011-07-25
  • 打赏
  • 举报
回复

#define TEMPLATE_SIZE 2048 // increate it if the dlg has many items
BOOL CMainFrame::ChangeDlgStyle(int resInt)
{
HINSTANCE hInst=AfxFindResourceHandle(MAKEINTRESOURCE(resInt),RT_DIALOG);
HRSRC hRes=::FindResource(hInst,MAKEINTRESOURCE(resInt),RT_DIALOG);
HGLOBAL hTemplate=::LoadResource(hInst,hRes);
DLGTEMPLATEEX *pTemplate=(DLGTEMPLATEEX *)LockResource(hTemplate);
HWND hDlg=0;
BYTE *pByte=new BYTE[TEMPLATE_SIZE];
//
if(pTemplate->signature==0xFFFF)
{//ex
DLGTEMPLATEEX *pNewTmp=(DLGTEMPLATEEX *)lpdwAlign((LPDWORD)pByte);
CopyMemory(pNewTmp,pTemplate,TEMPLATE_SIZE);
pNewTmp->style &= ~WS_CAPTION;
pNewTmp->style &= ~WS_BORDER;
pNewTmp->style &= ~DS_MODALFRAME;
pNewTmp->style &= ~WS_POPUP;
pNewTmp->style |= WS_CHILD;
hDlg= CreateDialogIndirect(hInst, // handle to application instance
(const DLGTEMPLATE *)pNewTmp, // pointer to dialog box template
this->m_hWnd, // handle to owner window
0); // pointer to dialog box procedure
}
else
{//
DLGTEMPLATE *pNewTmp=(DLGTEMPLATE *)lpdwAlign((LPDWORD)pByte);
CopyMemory(pNewTmp,pTemplate,TEMPLATE_SIZE);
pNewTmp->style &= ~WS_CAPTION;
pNewTmp->style &= ~WS_BORDER;
pNewTmp->style &= ~DS_MODALFRAME;
pNewTmp->style &= ~WS_POPUP;
pNewTmp->style |= WS_CHILD;
hDlg= CreateDialogIndirect(hInst, // handle to application instance
(const DLGTEMPLATE *)pNewTmp, // pointer to dialog box template
this->m_hWnd, // handle to owner window
0); // pointer to dialog box procedure
}
UnlockResource(hTemplate);
FreeResource(hTemplate);
delete [] pByte;
//
if(hDlg)
{
m_Dlg.SubclassWindow(hDlg);
CRect rc;
GetWindowRect(&rc);
m_Dlg.MoveWindow(0,24,rc.Width(),rc.Height()-92,TRUE);
m_Dlg.ShowWindow(SW_SHOW);
return TRUE;
}
return FALSE;
}


在:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
ChangeDlgStyle(IDD_DIALOG1);
return TRUE;
// return CFrameWnd::OnCreateClient(lpcs, pContext);
}
我才是心翼 2011-07-25
  • 打赏
  • 举报
回复
一开始建立MFC APPLICATION的时候不是有选择的么
headegg 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 schlafenhamster 的回复:]

还是从api入手:
int DialogBoxIndirect(
HINSTANCE hInstance, // handle to application instance
LPDLGTEMPLATE lpTemplate, // identifies dialog box template
HWND hWndParent, // handle to ow……
[/Quote]

有没有详细些可以直接用的代码?

看了下LPDLGTEMPLATE的说明,如果有一个画好的对话框资源,没看明白应该如何改它的STYLE。
Eleven 2011-07-24
  • 打赏
  • 举报
回复
没有标题栏?你定义对话框资源的时候就设置了border:None ?
schlafenhamster 2011-07-24
  • 打赏
  • 举报
回复
还是从api入手:
int DialogBoxIndirect(
HINSTANCE hInstance, // handle to application instance
LPDLGTEMPLATE lpTemplate, // identifies dialog box template
HWND hWndParent, // handle to owner window
DLGPROC lpDialogFunc // pointer to dialog box procedure
);
红的是要修改的

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧