接着上次的教程继续。上次介绍了ButtonEx控件的设计,这次介绍ButtonEx的具体实现。这里我不打算说C语言的语法和简单的MiniGUI API调用,我就只说一些需要注意的问题。因为我认为这些才是大家真正需要了解的。
注册类
不管你是自己完全重新开始写控件类,还是继承现有的控件类。自己的控件类被外部程序使用前就必需要注册(通常是应用程序初始化的时候)。我目前还没深入看MiniGUI内部创建控件的过程。但是只有注册了的控件类,才能被CreateWindow()创建(自己外部写的控件只能通过CreateWindow来创建,能使用对话框模板的控件数据来创建):
BOOL RegisterButtonExControl (void) { WNDCLASS BEXClass; … … // 填写控件类信息 BEXClass.spClassName = CTRL_BUTTONEX; BEXClass.dwStyle = WS_NONE; BEXClass.dwExStyle = WS_EX_NONE; BEXClass.iBkColor = PIXEL_lightwhite; BEXClass.hCursor = GetSystemCursor (IDC_HAND_POINT); BEXClass.WinProc = ButtonExProc; BEXClass.dwAddData = (DWORD)pCData; … … // 注册ButtonEx 类 return RegisterWindowClass (&BEXClass); }
还记得在教程2里提到的获取控件类信息的函数GetWindowClassInfo()吗。那里获取的信息正是你这里注册的信息。注意这里要把WNDCLASS的所有变量都填满,不然当应用程序程序使用你的控件时程序会出错的。填满好信息后,调用RegisterWindowClass()注册控件类。在控件使用前要进行注册,当控件使用完后(通常是应用程序退出前),就要注销之前注册的控件:
BOOL UnregisterButtonExControl (void) { … … // 卸载ButtonEx 类 return UnregisterWindowClass (CTRL_BUTTONEX); }
调用UnregisterWindowClass()来注销控件类,传入的参数是之类注册的控件类名字(字符串)。