CustomControl是一个非常好的东东,既可以实现自定义控件,又不必从零开始做一个控件,也不必知道COM、COM+的知识,而且是与MFC无缝集成,编程灵活性也大大地提高了哦~

右图所示就是CustomControl控件。点击查看原图

更改它的属性如图。Class一定要填,这个是该控件的窗口类名,不区分大小写!Style是由classWizard自己维护的,不用手动更改了!
点击查看原图

这时,如果在debug模式下编译运行,会发现根本就无法运行!为什么呢?因为有窗口类,但是没有注册,所以程序会自动退出。这里,在CustomControl上右键用ClassWizard来增加一个基类为CWnd的类,类名为CCustomTest.

添加一个private
的函数RegisterWndClass, 在其中添加注册窗口类的代码。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
BOOL CCustomTest::RegisterWndClass()
{
	HINSTANCE hIns = AfxGetInstanceHandle();
	WNDCLASS wc;
	//确保没被注册,MYWNDCLASS是一个字符串常量,在类的头文件中定义的
	if(!GetClassInfo(hIns, MYWNDCLASS, &wc))
	{
	//把各项参数填齐全
		wc.style = CS_DBLCLKS;
		wc.lpszClassName = MYWNDCLASS;
		wc.lpfnWndProc = ::DefWindowProc;
		wc.hInstance = hIns;
		wc.lpszMenuName = NULL;
		wc.cbClsExtra = wc.cbWndExtra = 0;
		wc.hbrBackground = ::GetSysColorBrush(COLOR_3DFACE);
		wc.hCursor = NULL;
		wc.hIcon = NULL;
	}
 
	if(!AfxRegisterClass(&wc))
	{
		AfxThrowResourceException();
		return FALSE;
	}
 
	return TRUE;
}

不清楚怎样注册窗口类的也不要紧,就是填充一个WNDCLASS的结构体而已,查一个MSDN就懂了。需要指出来说的就是wc.style的CS_GLOBALCLASS标志位,允许应用程序忽略掉CreateWindow、CreateWindowEx的实例句柄(hInstance), 那个hInstance可以和wc.hInstance不一样。但是我们在自己的程序中用,不用这个标志位也行的。

然后在CCustomTest的构造函数中调用这个函数,最后在主窗口类中关联一个这个类的成员变量就OK了!如果能够运行成功,就请继续往下看。

以后的操作,就和平时做界面的代码差不多了,只是灵活性大大提高了。从底层做起,你就可以为所欲为,不用去研究那些控件类的奇怪的封装了!

C瓜哥做了一个简单的效果,不断变换位置、字体大小和颜色的文字,背景也是透明的哦~感兴趣的,下载文后的源码

单击“单击我以开始”,弹出对话框

点击查看原图

以后每500ms变换文字位置、大小和颜色

点击查看原图

变化

点击查看原图

当然,可以自定义自己的类,也可以用系统定义好的类,如图:

点击查看原图

点击查看原图



不过运行了一遍之后,在设计模式下面,就自动变成文本框、按钮了!

点击查看原图