描述
向窗口添加控件.
FreeBASIC 语法
FUNCTION AddControl ( _ BYREF wszClassName AS WSTRING, _ BYVAL hParent AS HWND = NULL, _ BYVAL cID AS INTEGER = 0, _ BYREF wszTitle AS WSTRING = "", _ BYVAL x AS LONG = 0, _ BYVAL y AS LONG = 0, _ BYVAL nWidth AS LONG = 0, _ BYVAL nHeight AS LONG = 0, _ BYVAL dwStyle AS LONG = -1, _ BYVAL dwExStyle AS LONG = -1, _ BYVAL lpParam AS LONG_PTR = 0, _ BYVAL pWndProc AS WNDPROC = NULL, _ BYVAL uIdSubclass AS UINT_PTR = &HFFFFFFFF, _ BYVAL dwRefData AS DWORD_PTR = NULL_ ) AS HWND |
参数
wszClassName |
[in]窗口类名.类的名称可以是任何RegisterClass或RegisterClassEx注册域名,提供注册类的模块也是创建窗口的模块.类名称也可以是任何预定义的系统类名. |
hParent |
[in]句柄被创建的控件的父窗口或主窗口.如果省略该参数,句柄的主窗口隶属于的CWindow类的使用. |
cID |
[in]控件的标识符,一个整数值,用于通知它的父事件.应用程序确定控件标识符,它必须是所有具有相同父窗口的控件的唯一标识符. |
wszTitle |
[in]窗口名称.如果窗口样式指定标题栏,窗口标题将显示在标题栏中.创建控件,如按钮、复选框、静态控件,使用strTitle来指定控件的文本.当创建一个静态控件与SS_ICON风格,使用strTitle指定图标的名称或标识.指定一个标识符,使用语法'#num'. |
x |
[in] X窗口的左上角相对于父窗口客户区的左上角. |
y |
[in]初始坐标的窗口的左上角相对于父窗口客户区的左上角. |
nWidth |
[in]窗口的宽度. |
nHeight |
[in]窗口的高度. |
dwStyle |
[in]的窗口被创建的风格. |
dwExStyle |
[in]产生的控件扩展窗口样式. |
lpParam |
[in, opt]指向函数的指针被传递到窗口,通过CREATESTRUCT结构值(lpCreateParams成员)所指出的WM_CREATE消息的lParam参数.此消息在返回之前由该函数发送到已创建的窗口. |
pWndProc |
窗口的回调过程[in, opt]地址. |
uIdSubclass |
[in, opt]类ID. |
dwRefData |
[in, opt]指针参考数据 |
返回值
如果方法成功,则返回值是新控件的句柄.
如果这个方法失败,返回值是NULL.获得扩展的错误信息,调用GetLastError.
此方法通常因以下原因之一失败:
· | An invalid parameter value |
· | The system class was registered by a different module |
· | The WH_CBT hook is installed and returns a failure code |
· | If one of the controls in the dialog template is not registered, or its window window procedure fails WM_CREATE or WM_NCCREATE. |
预定义的类名和样式
"BUTTON" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或BS_PUSHBUTTON或BS_CENTER或BS_VCENTER BS_FLAT: WS_CHILD, WS_VISIBLE OR WS_TABSTOP OR BS_PUSHBUTTON OR BS_CENTER OR BS_VCENTER OR BS_FLAT BS_DEFPUSHBUTTON: WS_CHILD, WS_VISIBLE OR WS_TABSTOP OR BS_CENTER OR BS_VCENTER OR BS_DEFPUSHBUTTON BS_OWNERDRAW: WS_CHILD, WS_VISIBLE OR WS_TABSTOP OR BS_OWNERDRAW BS_SPLITBUTTON: WS_CHILD, WS_VISIBLE OR WS_TABSTOP OR BS_CENTER OR BS_VCENTER OR BS_SPLITBUTTON BS_DEFSPLITBUTTON: WS_CHILD, WS_VISIBLE OR WS_TABSTOP OR BS_CENTER OR BS_VCENTER OR BS_DEFSPLITBUTTON |
"CUSTOMBUTTON","OWNERDRAWBUTTON" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或BS_OWNERDRAW |
"RADIOBUTTON", "OPTION" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或BS_AUTORADIOBUTTON或BS_LEFT或BS_VCENTER WS_GROUP: WS_VISIBLE OR WS_TABSTOP OR BS_AUTORADIOBUTTON OR BS_LEFT OR BS_VCENTER OR WS_GROUP |
"CHECKBOX" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或BS_AUTOCHECKBOX或BS_LEFT或BS_VCENTER |
"CHECK3STATE" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或BS_AUTO3STATE或BS_LEFT或BS_VCENTER |
"LABEL" |
Default:WS_CHILD, WS_VISIBLE或SS_LEFT或WS_GROUP或SS_NOTIFY |
"BITMAPLABEL" |
Default:WS_CHILD, WS_VISIBLE或WS_GROUP或SS_BITMAP Default extended style: WS_EX_TRANSPARENT |
"ICONLABEL" |
Default:WS_CHILD, WS_VISIBLE或WS_GROUP或SS_ICON Default extended style: WS_EX_TRANSPARENT |
"BITMAPBUTTON" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或BS_PUSHBUTTON或BS_BITMAP |
"ICONBUTTON" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或BS_PUSHBUTTON或BS_ICON |
"CUSTOMLABEL" |
Default:WS_VISIBLE或WS_GROUP或SS_OWNERDRAW |
"FRAME", "FRAMEWINDOW" |
Default:WS_CHILD, WS_VISIBLE或WS_CLIPSIBLINGS或WS_GROUP或SS_BLACKFRAME Default extended style: WS_EX_TRANSPARENT |
"GROUPBOX" |
Default:WS_CHILD, WS_VISIBLE或WS_CLIPSIBLINGS或WS_GROUP或BS_GROUPBOX Default extended style: WS_EX_TRANSPARENT |
"LINE" |
Default:WS_CHILD, WS_VISIBLE或SS_ETCHEDFRAME Default extended style: WS_EX_TRANSPARENT |
"EDIT", "TEXTBOX" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或ES_LEFT或ES_AUTOHSCROLL Default extended style: WS_EX_CLIENTEDGE |
"EDITMULTILINE", "MULTILINETEXTBOX" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或ES_LEFT或ES_AUTOHSCROLL或ES_MULTILINE或ES_NOHIDESEL或ES_WANTRETURN Default extended style: WS_EX_CLIENTEDGE |
"COMBOBOX" |
Default:WS_CHILD或WS_VISIBLE或WS_VSCROLL或WS_BORDER或WS_TABSTOP或CBS_DROPDOWN或CBS_HASSTRINGS或CBS_SORT Default extended style: WS_EX_CLIENTEDGE |
"COMBOBOXEX", "COMBOBOXEX32" |
Default:WS_CHILD, WS_VISIBLE或WS_BORDER或WS_TABSTOP或CBS_DROPDOWNLIST |
"LISTBOX" |
Default:WS_VISIBLE或WS_HSCROLL或WS_VSCROLL或WS_BORDER或WS_TABSTOP或LBS_STANDARD或LBS_HASSTRINGS或LBS_SORT或LBS_NOTIFY Default extended style: WS_EX_CLIENTEDGE |
"PROGRESSBAR", "MSCTLS_PROGRESS32" |
Default:WS_CHILD, WS_VISIBLE |
"HEADER", "SYSHEADER32" |
Default:WS_CHILD, WS_VISIBLE或CCS_TOP或HDS_HORZ或HDS_BUTTONS |
"TREEVIEW", "SYSTREEVIEW32" |
Default:WS_CHILD, WS_VISIBLE或WS_BORDER或WS_TABSTOP或TVS_HASBUTTONS或TVS_HASLINES或TVS_LINESATROOT或TVS_SHOWSELALWAYS Default extended style: WS_EX_CLIENTEDGE |
"LISTVIEW", "SYSLISTVIEW32" |
Default:WS_CHILD, WS_VISIBLE或WS_CLIPCHILDREN或WS_TABSTOP或LVS_REPORT或LVS_SHOWSELALWAYS或LVS_SHAREIMAGELISTS或LVS_AUTOARRANGE或LVS_EDITLABELS或LVS_ALIGNTOP Default extended style: WS_EX_CLIENTEDGE |
"TOOLBAR", "TOOLBARWINDOW32" |
Default:WS_CHILD, WS_VISIBLE或WS_CLIPCHILDREN或WS_CLIPSIBLINGS或CCS_TOP或WS_BORDER或TBSTYLE_FLAT或TBSTYLE_TOOLTIPS |
"REBAR", "REBARWINDOW32" |
Default:WS_CHILD, WS_VISIBLE或WS_BORDER或WS_CLIPCHILDREN或WS_CLIPSIBLINGS或CCS_NODIVIDER或RBS_VARHEIGHT或RBS_BANDBORDERS |
"DATETIMEPICKER", "SYSDATETIMEPICK32" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或DTS_SHORTDATEFORMAT |
"MONTHCALENDAR", "MONTHCAL", "SYSMONTHCAL32" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP Default extended style: WS_EX_CLIENTEDGE |
"IPADDRESS", "SYSIPADDRESS32" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP Default extended style: WS_EX_CLIENTEDGE |
"HOTKEY", "MSCTLS_HOTKEY32" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP Default extended style: WS_EX_CLIENTEDGE |
"ANIMATE", "ANIMATION", "SYSANIMATE32" |
Default:WS_CHILD, WS_VISIBLE或ACS_TRANSPARENT |
"SYSLINK" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP |
"PAGER", "SYSPAGER" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或PGS_HORZ |
"TAB", "TABCONTROL", "SYSTABCONTROL32" |
Default:WS_CHILD, WS_VISIBLE或WS_GROUP或WS_TABSTOP或WS_CLIPCHILDREN或WS_CLIPSIBLINGS或TCS_TABS或TCS_SINGLELINE或TCS_RAGGEDRIGHT Default extended style: WS_EX_CONTROLPARENT |
"STATUSBAR", "MSCTLS_STATUSBAR32" |
Default:WS_CHILD, WS_VISIBLE或WS_CLIPCHILDREN或WS_CLIPSIBLINGS或CCS_BOTTOM或SBARS_SIZEGRIP |
"SIZEBAR", "SIZEBOX", "SIZEGRIP" |
Default:WS_CHILD, WS_VISIBLE或SBS_SIZEGRIP或SBS_SIZEBOXBOTTOMRIGHTALIGN |
"HSCROLLBAR" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或SBS_HORZ |
"VSCROLLBAR" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或SBS_VERT |
"TRACKBAR", "MSCTLS_TRACKBAR32", "SLIDER" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或TBS_AUTOTICKS或TBS_HORZ或TBS_BOTTOM |
"UPDOWN", "MSCTLS_UPDOWN32" |
Default:WS_VISIBLE或UDS_WRAP或UDS_ARROWKEYS或UDS_ALIGNRIGHT或UDS_SETBUDDYINT |
"RICHEDIT", "RichEdit50W" |
Default:WS_CHILD, WS_VISIBLE或WS_TABSTOP或ES_LEFT或WS_HSCROLL或WS_VSCROLL或ES_AUTOHSCROLL或ES_AUTOVSCROLL或ES_MULTILINE或ES_WANTRETURN或ES_NOHIDESEL或ES_SAVESEL Default extended style: WS_EX_CLIENTEDGE |
备注
为"BITMAPBUTTON", "BITMAPLABEL", "ICONBUTTON"和"ICONLABEL"控件必须在wszTitle参数在资源文件中(.RES).位图名称如果图像资源使用积分标识符通过,名称应以数字开头的符号(#)遵循标识符在ASCII格式,例如,"#998".否则为图像使用文本标识符名称.
子类化
该方法支持子类化的两种方式:
1)通过在pWndProc参数的子类程序的地址.
子类程序示例:
' =======================================================
' Processes messages for the subclassed control.
' =======================================================
FUNCTION SubclassProc ( _
BYVAL hwnd AS HWND, _ ' // Control window handle
BYVAL uMsg AS UINT, _ ' // Type of message
BYVAL wParam AS WPARAM, _ ' // First message parameter
BYVAL lParam AS LPARAM _ ' // Second message parameter
) AS LRESULT
SELECT CASE uMsg
CASE WM_GETDLGCODE
' // All keyboard input
FUNCTION = DLGC_WANTALLKEYS
EXIT FUNCTION
CASE WM_KEYDOWN ' etc.
...
EXIT FUNCTION
CASE WM_DESTROY
' // REQUIRED: Remove control subclassing
SetWindowLongPtrW hwnd, GWLP_WNDPROC, CAST(LONG_PTR, RemovePropW(hwnd, "OLDWNDPROC"))
END SELECT
FUNCTION = CallWindowProcW(GetPropW(hwnd, "OLDWNDPROC"), hwnd, uMsg, wParam, lParam)
END FUNCTION
' =======================================================
2) Subclassing passing the address of the subclass procedure in pWndProc, the subclass ID in uIdSubclass and an optional pointer to reference data in dwRefData.
Example of subclass procedure:
' =======================================================
' Processes messages for the subclassed Button window.
' =======================================================
FUNCTION SubclassProc ( _
BYVAL hwnd AS HWND, _ ' // Control window handle
BYVAL uMsg AS UINT, _ ' // Type of message
BYVAL wParam AS WPARAM, _ ' // First message parameter
BYVAL lParam AS LPARAM, _ ' // Second message parameter
BYVAL uIdSubclass AS UINT_PTR, _ ' // The subclass ID
BYVAL dwRefData AS DWORD_PTR _ ' // Pointer to reference data
) AS LRESULT
SELECT CASE uMsg
CASE WM_GETDLGCODE
' // All keyboard input
FUNCTION = DLGC_WANTALLKEYS
EXIT FUNCTION
CASE WM_KEYDOWN ' etc.
EXIT FUNCTION
CASE WM_DESTROY
' // REQUIRED: Remove control subclassing
RemoveWindowSubclass hwnd, @Button_SubclassProc, uIdSubclass
END SELECT
FUNCTION = DefSubclassProc(hwnd, uMsg, wParam, lParam)
END FUNCTION
' =======================================================
For the uIdSubclass parameter you can use any positive value except &hFFFFFFFF. CWindow uses the reserved default value of &hFFFFFFF to know if it has to use the old way of subclassing or the new way with SetWindowSubclass.
Two of the added benefits are that you can use the same subclass procedure for several controls and identify them thanks to the uIdSubclass (for example passing the ID of the control), and that you can pass a pointer to reference data.
SetWindowSubclass was made available for the first time in ComCtl32.dll version 6 and, therefore, can only be used with Windows XP or superior. ComCtl32.dll version 6 is Unicode only. The common controls supported by ComCtl32.dll version 6 should not be subclassed (or superclassed) with ANSI window procedures.
引用文件
CWindow.inc