请问VC++如何写一个控件?

MS_Frank 2009-04-22 09:06:47
如题:
在资源文件中有一个对话框资源(其内包含若干控件),对话框的Control属性已设为TRUE
请问,我如何编码才可以使这个对话框做为另一个对话框的子控件?

就像标准控件一样放到对话框里的,而不是弹出这个对话框!!
...全文
546 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦竹 2011-10-28
  • 打赏
  • 举报
回复
帮顶!帮顶!
MS_Frank 2009-05-08
  • 打赏
  • 举报
回复
owner windows & parent window?
什么意思?
doudouHuY 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 MS_Frank 的回复:]
引用 38 楼 hahaking119 的回复:
以关于对话框为例,在win32中可以通过CreateDialog创建一个资源对话框,然后修改父窗口,当然如果需要位置,可以用::MoveWindow,最后将其显示出来即可,你可以保存这个窗口句柄,或者通过链表方式写一个模块窗口的映射,不知道我这样写是否可以满足你的需要。win32好久没写过了,希望有帮助。
HWND hChildWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_ABOUT), hParent, AboutProc);
::Se…
[/Quote]
owner windows & parent window
hahaking119 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 MS_Frank 的回复:]
引用 38 楼 hahaking119 的回复:
以关于对话框为例,在win32中可以通过CreateDialog创建一个资源对话框,然后修改父窗口,当然如果需要位置,可以用::MoveWindow,最后将其显示出来即可,你可以保存这个窗口句柄,或者通过链表方式写一个模块窗口的映射,不知道我这样写是否可以满足你的需要。win32好久没写过了,希望有帮助。
HWND hChildWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_ABOUT), hParent, AboutProc);
::Se…
[/Quote]

不是让你去找子窗口的句柄,而是将创建的资源对话框作为你主窗口的子窗口而不是弹出式窗口,你自己可以保存创建好的句柄,将该句柄和模块作一个映射,没有必要非要用GetWindow方式吧。
MS_Frank 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 hahaking119 的回复:]
以关于对话框为例,在win32中可以通过CreateDialog创建一个资源对话框,然后修改父窗口,当然如果需要位置,可以用::MoveWindow,最后将其显示出来即可,你可以保存这个窗口句柄,或者通过链表方式写一个模块窗口的映射,不知道我这样写是否可以满足你的需要。win32好久没写过了,希望有帮助。
HWND hChildWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_ABOUT), hParent, AboutProc);
::SetParent(hChildWnd, hParent);
S…
[/Quote]

谢谢这位兄弟。

你的这种方法的确可行,可是创建后,
SetParent我用过了,但是似乎不是真正的做为父窗口的控件了,因为我用GetWindow(ParentHwnd,GW_CHILD); 得不到子窗品的句柄。
pomelowu 2009-05-06
  • 打赏
  • 举报
回复
我說的方法試過了麽?
MS_Frank 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 liuliucy 的回复:]
从资源中提取出对话框资源后(也就是一个窗口,得到其窗口句柄),用SetParent重新设置它的父窗口,MFC自己实现它的任意停放控件的功能都使用这种方法,我没有使用过,但想来窗口无非如此,MFC里面也都是用SDK实现的
[/Quote]

SetParent我用过了,但是似乎不是真正的做为父窗口的控件了,因为我用GetWindow(ParentHwnd,GW_CHILD); 得不到子窗品的句柄。
yayafu 2009-05-06
  • 打赏
  • 举报
回复
把那对话框的父窗体设成包含它的窗体不就行了吗
hahaking119 2009-05-06
  • 打赏
  • 举报
回复
以关于对话框为例,在win32中可以通过CreateDialog创建一个资源对话框,然后修改父窗口,当然如果需要位置,可以用::MoveWindow,最后将其显示出来即可,你可以保存这个窗口句柄,或者通过链表方式写一个模块窗口的映射,不知道我这样写是否可以满足你的需要。win32好久没写过了,希望有帮助。
HWND hChildWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_ABOUT), hParent, AboutProc);
::SetParent(hChildWnd, hParent);
ShowWindow(hChildWnd, SW_SHOWNORMAL);
ToCpp 2009-05-05
  • 打赏
  • 举报
回复
“对话框做为另一个对话框的子控件”将需要作为子控件的对话框以WS_CHILD样式Create就可以了啊
liuliucy 2009-05-05
  • 打赏
  • 举报
回复
从资源中提取出对话框资源后(也就是一个窗口,得到其窗口句柄),用SetParent重新设置它的父窗口,MFC自己实现它的任意停放控件的功能都使用这种方法,我没有使用过,但想来窗口无非如此,MFC里面也都是用SDK实现的
羽毛乱发 2009-05-05
  • 打赏
  • 举报
回复
关注
MS_Frank 2009-05-05
  • 打赏
  • 举报
回复
自己顶!
pomelowu 2009-05-04
  • 打赏
  • 举报
回复
另外,如果不願意使用PropertySheet,記得設置WS_CHILD風格以及父窗口再創建試試看。
pomelowu 2009-05-04
  • 打赏
  • 举报
回复
那個,沒太仔細看各位的回覆,見諒(太多了)……
lz就是簡單想把一個dialog放在另外一個Dialog上,不知道用PropertySheet符合lz要求不?CreatePropertySheetPage
MS_Frank 2009-05-04
  • 打赏
  • 举报
回复
汗,一个,楼上的几位似乎是没理解我的意思。
我是用SDK实现,不用MFC,

不用代码(如果有更好)只要求大家提供个思路就行!!

我再重一遍题题目(见1楼):
如题:
在资源文件中有一个对话框资源(其内包含若干控件),对话框的Control属性已设为TRUE
请问,我如何编码才可以使这个对话框做为另一个对话框的子控件?

就像标准控件一样放到对话框里的,而不是弹出这个对话框!!

biweilun 2009-05-01
  • 打赏
  • 举报
回复
第一步:在VC编程环境下建立一个基于对话框的工程,工程名为ExpandDlg,所有的选项都取默认值。

  第二步:建立我们都对话框,其中必须要有这样两个控件,一个是PICTURE控件,一个为按钮,其ID值分别为IDC_DIVIDER和IDC_MORE。其它的控件可以任意布局,最终结果就是对话框被IDC_DIVIDER控件分成了两部分,其中下半部分可以根据你的爱好动态显示或不显示:

  第三步:生成按钮IDC_MORE的消息映射函数OnMore,在ExpandDlgDlg.h中定义两个函数如下:

public:
void EnableVisibleChildren();
void ExpandDialog (int nResourceID, BOOL bExpand);

  第四步:在ExpandDlgDlg.cpp中定义函数的实现代码如下:

void CExpandDlgDlg::ExpandDialog (int nResourceID, BOOL bExpand)
{
// 对话框被nResourceID分成上下两部分,如果bExpand的值为TRUE
// 对话框被完整显示,否则对话框显示上半部分。
static CRect rcLarge;
static CRect rcSmall;
CString sExpand;
//开始时,对话框只显示上半部分
if (rcLarge.IsRectNull())
{
CRect rcLandmark;
CWnd* pWndLandmark = GetDlgItem (nResourceID);
ASSERT(pWndLandmark);
GetWindowRect (rcLarge);
pWndLandmark->GetWindowRect (rcLandmark);
rcSmall = rcLarge;
rcSmall.bottom = rcLandmark.top;
}
if (bExpand)
{
//扩展对话框到最大尺寸
SetWindowPos(NULL, 0, 0, rcLarge.Width(), rcLarge.Height(),
SWP_NOMOVE | SWP_NOZORDER);
sExpand = "<< &Less";
EnableVisibleChildren();
}
else
{
//只显示对话框的上半部分
SetWindowPos(NULL, 0, 0, rcSmall.Width(), rcSmall.Height(),
SWP_NOMOVE | SWP_NOZORDER);
sExpand = " &More >>";
EnableVisibleChildren();
}
SetDlgItemText (IDC_MORE, sExpand);
}

void CExpandDlgDlg::EnableVisibleChildren()
{
//去掉没有显示的对话框的控件的功能和快捷键。
//得到第一个窗口
CWnd *pWndCtl = GetWindow (GW_CHILD);
CRect rcTest;
CRect rcControl;
CRect rcShow;
//得到对话框的完整矩形框
GetWindowRect(rcShow);
while (pWndCtl != NULL)
{ //得到当前显示的对话框的矩形尺寸
pWndCtl->GetWindowRect (rcControl);

if (rcTest.IntersectRect (rcShow, rcControl))
pWndCtl->EnableWindow(TRUE);
else
pWndCtl->EnableWindow(FALSE);
//得到第二个矩形框
pWndCtl = pWndCtl->GetWindow (GW_HWNDNEXT);
}
}

void CExpandDlgDlg::OnMore()
{
static BOOL bExpand = TRUE;
ExpandDialog (IDC_DIVIDER, bExpand);
bExpand = !bExpand;
}

  按照上面的步骤生成我们的可执行文件后运行,点击对话框上的〔More〕我们可以发现对话框扩展,点击〔Less〕后,我们发现对话框收缩,希望可以给你带来方便。

biweilun 2009-05-01
  • 打赏
  • 举报
回复
我觉得完全不用这样啊,你的目的是什么?如果没有别的目的话,可以试试对话框扩展
biweilun 2009-05-01
  • 打赏
  • 举报
回复
楼主要把一个对话框粘在另外一个对话框上?
jilianfeng 2009-05-01
  • 打赏
  • 举报
回复
帮你顶顶!~~~~~~~~~~~~~·
加载更多回复(24)

15,979

社区成员

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

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