一般用CButton都是从工具栏中拖到Dialog上,我想动态生成CButton,用数组或者其他方式,请教如何用代码生成CButton到Dialog上,而且可以拖动,谢谢
解决方案 »
- 请教:用HOOK API 来做文件监视系统
- 摄像头进行网络通讯
- 男人没有事业,什么都别谈... 包括女人
- WaitForSingleObject用法???谢谢!!!!!
- 大放血,怎样搞状态栏?(菜鸟问)
- 为什么我的“HELLO WORLD ”程序能通过编译,但不能形成EXE文件??
- 如何编写udp广播的winsock程序
- 关于DevStudio Add-in 的问题
- 一个关于"树型控件"的问题,挑战您的技术!
- 如何删除CListCtrl中选定的项
- 用什么方法把unsigned short userID[128]转换成LPCTSTR/char *类型?
- VF的DBF表怎么输入时间内容?(ado)
CRect rect(0,0,120,120);
pbtn->Create(_T("hehe"),BS_PUSHBUTTON,rect,this,5555);
pbtn->ShowWindow(SW_SHOW);
记住以后要释放它
CRect rect(0,0,120,120);
pbtn->Create(_T("hehe"),BS_PUSHBUTTON,rect,this,5555);
pbtn->ShowWindow(SW_SHOW);
记住用完后再delete pbtn;
这个函数一完成,它就被析构了
你应该把它设置成成员变量
同意wzhing的观点
发大缩小,可以用SetWindowPos
因为CButton继承了windows类
另外,如果我从文件读入Button属性信息,在界面显示CButton,那如果鼠标点中一个Button,我怎么知道是哪个,这如何设计?
因为MButton,MList等都是在工具栏上的(是以个com),当用户点击工具栏中的某一项时开一个MButton的链表结点,当用户在绘图区中操作时生成一个对应的CButton链表结点,我就是不知道其中的消息如何传递。我设计的数据结构是一个多层链表,在最外层的Linklist中存放MButton对象结点和CButton对象结点的指针,该指针分别指向MButton,CButton对象,以这样的形式来管理,谢谢。应该说如果是一般的MFC程序应该是比较容易的,但是现在要用COM做(我刚开始接触,有点不明白),还请各位指点,谢谢
{
CString str;
str.Format("你按下的按钮ID是%d", nID);
AfxMessageBox(str);
}
如果是这样,则每一个MButton(或MList)的实例都对应着一个控件窗口(CButton或CListCtrl)?如果是上面的意思,且MButton(或MList)的实现又基于COM技术,则应如下:
你肯定有一个类似IDrawingObject的接口,实现MButton(或MList)实例的COM组件都支持IDrawingObject接口(专用于显示对象)、IDrawingXXX(专用于编辑对象,由IDrawingObjectView接口调用,XXX表示具体的对象,如IDrawingObjectButton、IDrawingObjectList等)和IPersistStreamInit接口(用于序列化),实现MButton(或MList)编辑的COM组件都支持一个类似IDrawingObjectView的接口,以提供对此类数据对象的编辑。IDrawingObjectView接口应有如下类似功能函数的定义:
HRESULT CreateControlWindow( [out] HWND *pHWnd ); // 创建提供对其相对应的数据对象的编辑窗口控件的窗口句柄,如CButton::m_hWnd、CListCtrl::m_hWnd
HRESULT HandleNotifyMessage( [in, out] IDrawingObject, [in] WPARAM wParam, [in] LPARAM lParam ); // 因为你首先可以确定一定使用控件来编辑数据对象,而你希望能处理控件生成的通知消息,所有控件生成的通知消息(如BN_CLICKED、LVN_SELCHANGED等)都是向父窗口发送WM_NOTIFY窗口消息(其参数格式请参阅MSDN)。因此在你的框架程序中,既拥有CFrameWnd派生类的工程中,响应WM_NOTIFY消息,通过获取发送消息的控件的ID,在一个事先定义好的列表(建议使用映射,即CMap)中查找,得到其对应的IDrawingObject接口指针,调用在框架程序初始化时就以生成的IDrawingObjectView的HandleNotifyMessage函数以编辑相对应的数据对象。在HandleNotifyMessage的实现中,应该通过调用QueryInterface来获得IDrawingXXX接口指针以编辑数据对象。在此,上面的两个函数可认为是IDrawingObject类(实现IDrawingObject的COM组件的类型信息)的静态成员函数,起功能辅助作用。如果嫌麻烦,还可以如下,不过建议不要使用,因为如果如此则只能使用MFC来创建实现IDrawingObject等接口的COM组件了,且不可发生跨边界调用现象,不过程序员感觉舒畅。仍象上面一样提供接口支持,不过IDrawingObjectView不需要那两个函数了,替换为如下函数
HRESULT GetClassRuntimeInfo( CRuntimeClass *pClass ); // 原来对CreateControlWindow的调用就可替换为对pClass的CreateObject的调用,而对原来的HandleNotifyMessage的调用则可通过在你的COM组件的工程中派生一个控件类(如从CButton、CListCtrl派生),在其中响应消息反射,在反射消息的响应中编辑与其绑定的数据对象,不过则又需要提供另一个基类,如CBase,每个派生的控件类亦从CBase派生,以支持绑定数据对象的功能(void SetDataObject( IDrawingObject *pObj ); ),而基本框架在通过pClass的CreateObject的调用或的CObject*的时候,就static_cast将CObject*转成CBase*并进行绑定,不过建议在static_cast之前应先断言一下。使用此法,上面的GetClassRuntimeInfo的声明将不能写成IDL语言,因为CRuntimeClass只是MFC定义的一个类,因此不能通过MIDL编译生成代理占位程序,因此不能跨边界调用(即只能以InProc的形式加载COM组件,当然,如果你自己编写代理占位程序则不存在这个问题)。所以原本MIDL生成的.h文件现在得自己生成,可简单的如下:
struct IDrawingObjectView : public IUnknown
{
HRESULT GetClassRuntimeInfo( CRuntimeClass *pClass ) = 0;
};