还是先上图:

SearchBox

做了一个简单的搜索框,并注册了窗口类u14SearchBox。有兴趣的可以拿去,拓展一下,做成一个漂亮的!下面先讲一下原理,稍后再讲怎样美化界面

其实这个搜索框,由是两个控件组成,一个文本框,一个按钮。但是它们不是孤立的,而是整合到一个窗口中了,外部是无法直接控制这两个控件的!

当然,我们只需要一个“容器”能装得下这两个控件,所以就从CWnd直接派生啦。

然后第一个事情就是写一个供外部调用动态创建的create函数,很简单,看了附件就知道了。唯一需要注意的就是,rcLayout参数的后两个right、bottom属性,right代表窗口的宽度,而bottom应设为NULL,因为高度是默认不可更改的(始终为24)

如果需要更改窗口类名的话,就在PreCreateWindow中修改(当然,我尝试过,也只有在这里改才能生效!)

把其中默认的代码替换成如下的:

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
28
29
WNDCLASS wndcls;
 
memset(&wndcls, 0, sizeof(WNDCLASS));   // start with NULL
// defaults
 
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE;
 
//you can specify your own window procedure
wndcls.lpfnWndProc = ::DefWindowProc; 
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon =  NULL; // or load a different icon
wndcls.hCursor =NULL;
wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wndcls.lpszMenuName = NULL;
 
// Specify your own class name for using FindWindow later
wndcls.lpszClassName = _T("u14SearchBox");
 
// Register the new class and exit if it fails
if(!AfxRegisterClass(&wndcls))
{
	TRACE("Class Registration Failed\n");
	return FALSE;
}
 
 
cs.lpszClass = wndcls.lpszClassName;
 
return TRUE;

改变类名就在这一行啦:wndcls.lpszClassName = _T(“u14SearchBox”)
当然不改变类名,系统也会给你分配一个,但是为了让你的产品都打上自己的标签,还是修改一下吧!

由于Create中创建的两控件的大小都为0。当然,此时也不可能获得窗口的大小,所以也只能设为0了!而需要显示,以至于调整大小时两控件都能跟着变,就应该在OnSize中处理了!

下面讲一下怎样在程序主窗口中响应开始搜索的事件(也就是按下搜索按钮)

其实很简单,只要在Cu14SearchBox中添加对按钮控件消息的响应(当然这时只能手工添加了),然后发送消息到主窗口,也就是Cu14SearchBox对象的父窗口,由它来处理就行了!

最后是界面如何美化的问题。

我在例子中,只实现了最简单的界面。只在OnNcPaint里面画了一个填充白色,黑色边框的矩形框而已。大家可以把这段代码修改成,直接绘制一个图片,而可以在OnFocus里面改变成另外一幅图片。

Edit控件就不需要修改了,它反正都是没有边框的,一般用户也看不出来,这里面还藏了一个文本框

搜索按钮的美化,要么可以靠自绘控件实现,要么就把按钮控件取消掉,由一个图片控件代替,或者干脆就直接在这个区域中绘图!

附件下载

SearchBoxTest.rar