如何做一个控件,可以接管它所在的窗体?

Python 2001-06-23 10:16:00
我想做一个控件,把它放在一个Form中,当运行是,它可以接管Form,可以改变窗体的外观等,并且可以相应消息,至少可以相应鼠标消息。
如何做呢?
说说思路也可以阿
谢谢啦
...全文
119 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolfired 2001-07-03
  • 打赏
  • 举报
回复
http://www.codeproject.com/atl/drawingdesignmode.asp这篇文章应该对你有点用处。
Python 2001-06-27
  • 打赏
  • 举报
回复
非常感谢,我会尝试一下
另外,我还有个问题
1、这种控件,是否应该使用运行时不可见的?我想应该采用Windowless的吧,对吗?
2、如果我的控件是WindowLess的,那么,就无法接受到WM_CREATE消息,那么,我的初始化工作该在什么地方完成呢?什么函数中完成呢?我的想法是,用ATL的向导生成一个FULL Control,采用windowless,然后,在一个自动运行的初始化函数中获得父窗口的句柄,调用SubClassWindow(hParent),这样,我的这个控件类中,可以截获一些父窗口的消息,比如WM_PAINT等等。这样可行吗?如果可行的话,我在什么地方可以得到父窗口的句柄呢?(Windowless型控件,没有OnCreate消息),在OnDraw中,我可以得到父窗口句柄,但是,又不应该在这里面做初始化的工作,比如SubClassWindow或SetWindowLong。
谢谢帮助
:)
flywhc 2001-06-27
  • 打赏
  • 举报
回复
给你个消息循环?

lRet=SetWindowLong (hWnd, GWL_WNDPROC, (LONG)(MainWndProc))

LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam )
{
PAINTSTRUCT ps;
HDC hDC;

switch( msg ) {

/*************************************************************** WM_PAINT: *
\**************************************************************/

case WM_PAINT:
hDC = BeginPaint( hWnd, &ps );

TextOut( hDC, 10, 10, "Hello, World!", 13 );

EndPaint( hWnd, &ps );
break;

/*************************************************************** WM_COMMAND: *
\**************************************************************/

case WM_COMMAND:
switch( wParam ) {
case IDM_ABOUT:
DialogBox( ghInstance, "AboutDlg", hWnd, (DLGPROC)
AboutDlgProc );
break;
}
break;

/*************************************************************** WM_DESTROY: PostQuitMessage() is called *
\**************************************************************/

case WM_DESTROY:
PostQuitMessage( 0 );
break;

/*************************************************************** Let the default window proc handle all other messages *
\**************************************************************/

default:
return( DefWindowProc( hWnd, msg, wParam, lParam ));
}

return 0;
}

你可以把DefWindowProc换成lRet的地址调用(强制转换成函数指针),这样就是以前的那个windowProc,完成更多一些默认的工作。

CWindow看MSDN里ATL的帮助
Python 2001-06-26
  • 打赏
  • 举报
回复
如果我的控件是WindowLess的,那么,通过WindowFromDC就可以得到其容器窗口的句柄了,但是,我觉得然后用SetWindowLong后,要自己写消息循环,麻烦,呵呵。
在ATL中,可以建立控件基于Button, Label什么的,但是,没有发现基于Wnd的,如果我自己改,能做到吗?
Python 2001-06-26
  • 打赏
  • 举报
回复
COM我刚学没多久,不知道具体怎么做,能否指点一二?
vcmfc 2001-06-26
  • 打赏
  • 举报
回复
我想不是SetWindowLong能解决问题,因为SetWindowLong需要窗口句柄,你该如何得到容器的窗口句柄呢???
flywhc 2001-06-26
  • 打赏
  • 举报
回复
用ATL的CWindow or CWindowImpl不就成了

其实消息循环有什么难写的?没几行。
你还可以用子类的办法,多数操作让原来的windowproc来做
xxxbird 2001-06-23
  • 打赏
  • 举报
回复
可以在控件得到Form的窗口句柄[应该很容易吧:-)],然后改变其窗口过程啊。

::SetWindowLong (hWnd, GWL_WNDPROC, (LONG)你自己定义的窗口过程).

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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