如何用MFC做复合控件

浩子 2007-12-19 03:06:42
我对ATL没研究过,请问MFC可以制作复合控件吗?又如何操作才行呢?谢谢!
...全文
149 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
LOVESKY_REN 2007-12-26
  • 打赏
  • 举报
回复
1、利用ATL COM Wizard新建一个ATL DLL工程,工程名定为TrueShutDown,其余所有设置保持为默认。

  2、利用插入菜单中"ATL Object Wizard"插入对象,选择复合控件(Composite Control),如图1所示。然后单击"下一步",输入短名称:ShutDownCtrl,然后单击"确定"。

  

  3、我们选择是复合控件,所以程序中生成了一个对话框模板,在这里我们可以将多个控件组合起来形成一个复合控件。

  

  4、在ClassView中右击CShutDownCtrl,然后选择Add Window Message Handle,在接一下来对话框中选择IDC_OK,并为它选择消息BN_CLICKED。点击"Add and Edit"退出。

  5、OnClickedOk函数实现如下:

  LRESULT OnClickedOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
// TODO : Add Code for control notification handler.

if(IsOK==0)
{
HWND h=::GetDlgItem(m_hWnd,IDC_HOUR);
::EnableWindow(h,false);
h=::GetDlgItem(m_hWnd,IDC_MINUTE);
::EnableWindow(h,false);
SetDlgItemText(IDC_OK,"重设");
IsOK=1;
}
else
{
HWND h=::GetDlgItem(m_hWnd,IDC_HOUR);
::EnableWindow(h,true);
h=::GetDlgItem(m_hWnd,IDC_MINUTE);
::EnableWindow(h,true);
SetDlgItemText(IDC_OK,"确定");
SetDlgItemText(IDC_STIME,"");
IsOK=0;
}
return 0;
} 




  其中IsOK用来判断是否点击了确定按钮。定义如下:

  protected:

  int IsOK;

  初始值在构造函数CShutDownCtrl()中

  IsOK=0;

  6。在ClassView中右击CShutDownCtrl,然后选择Add Window Message Handle,在接一下来对话框中选择WM_TIMER,为它增加句柄(点击"Add Handle"),并为WM_INITDIALOG也增加一个句柄。点击"Add and Edit"退出。

  7、往新增加函数中添加代码:

  LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
::SetTimer(m_hWnd,0,5000,NULL);//用来定时检查关机时间是否已到
::SetTimer(m_hWnd,1,1000,NULL);//用来显示当前时间
return 0;
}
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SYSTEMTIME str;
CHAR stall DefWindowProc if necessary.
::SetTimer(m_hWnd,0,5000,NULL);//用来定时检查关机时间是否已到
::SetTimer(m_hWnd,1,1000,NULL);//用来显示当前时间
return 0;
}
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SYSTEMTIME str;
CHAR str1[20];
CHAR str_h[10],str_m[10];
::GetLocalTime(&str);//得到当前时间
sprintf(str1,"-时-分-秒",str.wHour,str.wMinute,str.wSecond);
SetDlgItemText(IDC_TIME,str1);
GetDlgItemText(IDC_HOUR,str_h,sizeof(str_h));//得到关机小时
GetDlgItemText(IDC_MINUTE,str_m,sizeof(str_m));//得到关机分钟
if(IsOK==1)GetSTime(str.wHour,str.wMinute,atoi(str_h),atoi(str_m),str.wSecond);
if(wParam==0&&IsOK==1&&str.wHour==atoi(str_h)&&str.wMinute==atoi(str_m))
{
  switch(m_nType)
  {
  case 1:
  ExitWindowsEx(EWX_SHUTDOWN,0);
  break;
  case 2:
  ExitWindowsEx(EWX_REBOOT,0);
  break;
  case 3:
  ExitWindowsEx(EWX_FORCE,0);
  break;
  }
}
return 0;
}




  上面代码中函数GetSTime(str.wHour,str.wMinute,atoi(str_h),atoi(str_m),str.wSecond)是我自定义,目是用来计算剩余时间,具体方法见后。

  8、为程序添加一个变量,此变量用来反映用户选择是哪一个单选按钮。

  protected:

  int m_nType;

  并初使变量,在构造函数CShutDownCtrl()中加入代码m_nType=0;

  9、为三个单选按钮添加函数,方法和上面为IDC_OK添加单击函数相同

  LRESULT OnClickedRadio1(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
// TODO : Add Code for control notification handler.
 
m_nType=1;
return 0;
}
LRESULT OnClickedRadio2(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
// TODO : Add Code for control notification handler.
 
m_nType=2;
return 0;
}
LRESULT OnClickedRadio3(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
// TODO : Add Code for control notification handler.

m_nType=3;
return 0;
}

  10、在ClassView中右击CShutDownCtrl,然后选择Add Member Function,在接一下来对话框中输入函数类型为void,函数声明为GetSTime(int H,int M,int h,int m,int s)

  然后在ShutDownCtrl.cpp中加入代码:

  void CShutDownCtrl::GetSTime(int H, int M, int h, int m, int s)
{
CHAR str[20];
m-=1;
if(h if(m sprintf(str,"-时-分-秒",h-H,m-M,60-s);
SetDlgItemText(IDC_STIME,str);
}

  11、测试很简单,首先按F7键编译,之后打开源文件所在目录,双击ShutDownCtrl.Htm文件就可以测试了。

iyranly 2007-12-25
  • 打赏
  • 举报
回复
MFC功能相当强大,只要你想得到的,就能做得到。没研究过就去研究吧
com自学视频教程,绝对可以下载,共8集。主要讲解com组件相关的知识点以及com如何开发。COM接口与QueryInterface 内容提要: 1、现实中的组件与接口 2、把现实中的思想融入到软件中 3、C++程序中的组件与接口 4、COM组件与COM接口 5、QueryInterface函数,HRESULT类型,IID类型,数据类型转换 计数引用AddRef与Release 内容提要: 1、内存资源何时释放 2、引用计数的原理 3、AddRef与Release的实现与使用 4、引用计数的优化 IDispatch接口与Variant类型 内容提要: 1、IDispatch的简介与作用 2、常用的COM数据类型 3、COM数据类型的转换 4、VARIANT类型的派生类 五:《COM实用入门教程》第四讲:SimpleObject的创建与调用 内容提要: 1、用ATL制作简单对象(Simple Object) 2、在网页中测试简单对象 3、在MFC中测试简单对象 4、在C#中测试简单对象 COM组件注册与智能指针 内容提要: 1、COM组件的注册 2、智能指针的简介 3、智能指针的使用 4、智能指针与COM接口指针的比较 5、智能指针的注意点 七:《COM实用入门教程》第六讲:复合控件与CComBSTR 内容提要: 1、复合控件的创建 2、复合控件的属性 3、BSTR的包装类 4、复合控件的方法 5、复合控件的事件 6、在网页中测试复合控件的属性、方法、事件 7、在MFC中测试复合控件的属性、方法、事件 8、在C#中测试复合控件的属性、方法、事件 简单对象的方法与事件 内容提要: 1、为简单对象添加方法与事件 2、在MFC中实现事件接收器 3、在MFC中测试简单对象的方法与事件 4、测试例子的改进
因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的组件模型——COM 1.2 COM的发展历程 1.2.1 COM以前的对象技术:DDE、OLE 1、VBX控件 1.2.2 COM首次亮相:OLE2 1.2.3 Microsoft拥抱Internet:ActiveX 1.2.4 更多的新名词:Windows DNA和COM+ 1.2.5 远程对象:ORBs和DCOM 1.2.6 COM的最新版本:COM+ 1.3 COM技术现状 1.3.1 COM与CORBA 1.3.2 COM与Enterprise Java Beans 1.3.3 Windows之外的COM 小结 第2章 从C++到COM 2.1 C++客户重用C++对象——例程DB 2.1.1 C++对象 2.1.2 客户程序 2.2 将C++对象移进DLL中——例程DB_cppdll 2.2.1 成员函数的引出 2.2.2 内存分配 2.2.3 Unicode/ASCII兼容 2.2.4 例程实现 2.2.4.1 修改接口文件 2.2.4.2 修改对象程序 2.2.4.3 修改客户程序 2.3 C++对象使用抽象基类——例程DB_vtbl 2.3.1 问题:私有数据成员被暴露 2.3.2 解决方案:抽象基类 2.3.2.1 什么是抽象基类(Abstract Base Class) 2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM库装载C++对象——例程dbalmostcom 2.4.1 COM库 2.4.2 对象创建的标准入口点 2.4.3 标准对象创建API 2.4.4 标准对象注册 2.4.5 例程实现 2.4.5.1 修改接口文件 2.4.5.2 修改对象程序 2.4.5.3 修改客户程序 2.5 将C++对象变成COM对象 2.5.1 引用计数 2.5.2 多接口 2.5.3 IUnknown接口 2.5.4 标准类厂接口:IClassFactory 2.5.5 对象代码的动态卸载 2.5.6 自动注册 2.5.7 例程实现 2.5.7.1 修改接口文件 2.5.7.2 修改对象程序 2.5.7.3 修改客户程序 2.6 为COM对象添加多接口支持 2.6.1 多接口 2.6.2 DEFINE_GUID 2.6.3 例程实现 2.6.3.1 修改接口文件 2.6.3.2 修改对象程序 2.6.3.3 修改客户程序 小结 第3章 COM基础知识 3.1 对象与接口 3.1.1 COM对象 3.1.2 COM接口 3.1.3 IUnknown接口 3.1.3.1 生存期控制:AddRef和Release 3.1.3.2 接口查询:QueryInterface 3.1.4 全球唯一标识符GUID 3.1.5 COM接口定义 3.1.6 接口描述语言IDL 3.2 COM应用模型 3.2.1 客户/服务器模型 3.2.2 进程内组件 3.2.3 进程外组件 3.2.4 COM库 3.2.5 HRESULT返回值 3.2.6 COM与注册表 3.3 COM组件 3.3.1 实现类厂对象 3.3.2 类厂对象的创建 3.3.3 实现自动注册 3.3.4 实现自动卸载 3.4 COM客户 3.4.1 COM对象创建函数 3.4.1.1 CoGetClassObject 3.4.1.2 CoCreateInstance 3.4.1.3 CoCreateInstanceEx 3.4.2 如何调用进程内组件 3.4.3 COM客户调用进程外组件 3.5 进一步认识COM 3.5.1 可重用机制:包容和聚合 3.5.2 进程透明性 3.5.3 安全性机制 小结 第4章 COM扩展技术 4.1 可连接对象机制 4.1.1 客户、接收器与可连接对象 4.1.1.1 接收器 4.1.1.2 可连接对象 4.1.1.3 客户 4.1.2 实现可连接对象 4.1.3 实现接收器 4.1.4 建立接收器与连接点的连接 4.1.5 获得出接口的类型信息 4.2 结构化存储 4.2.1 什么叫结构化存储和复合文件 4.2.2 存储对象和IStorage接口 4.2.2.1 IStorage接口 4.2.2.2 获得IStorage指针 4.2.2.3 释放STATSTG内存 4.2.2.4 枚举存储对象中的元

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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