---
description: "Learn more about: Add a property"
title: "Add a property"
ms.date: "11/09/2018"
f1_keywords: ["vc.codewiz.prop.overview", "vc.codewiz.prop.idlattributes"]
helpviewer_keywords: ["interfaces, adding properties", "properties [C++], adding to interfaces", "names, add property wizard", "IDL attributes, add property wizard", "stock properties, about stock properties", "stock properties"]
ms.assetid: 37bd4db7-efd3-4faa-87ad-64902ed16a36
---
# Add a property
You can use the [add property wizard](#names-add-property-wizard) to add a method to an interface in your project.
**To add a property to your object:**
1. In [Class View](/visualstudio/ide/viewing-the-structure-of-code), right-click the name of the interface to which you want to add the property.
> [!NOTE]
> You can also add properties to dispinterfaces, which, unless the project is attributed, are nested within the library node.
1. From the shortcut menu, choose **Add**, and then choose **Add Property**.
1. In the [add property wizard](#names-add-property-wizard), provide the information to create the property.
1. Specify any interface definition language (IDL) settings for the property in the [IDL attributes](#idl-attributes-add-property-wizard) page of the wizard.
1. Select **Finish** to add the property.
The `Get` and `Put` methods of the property are displayed as two icons in Class View, under the interface where it's defined. You can double-click either icon to view the property declaration in the .idl file.
- For ATL interfaces, the `Get` and `Put` functions are added to the .cpp file, and references to these functions are added to the .h file.
- For MFC dispinterfaces, if you select **Member variable** as the implementation type, a method and a variable are added to the class that implements it. If you select **Get/Set methods** as the implementation type, two methods are added to the class that implements it.
## In this section
- [Names, add property wizard](#names-add-property-wizard)
- [IDL attributes, add property wizard](#idl-attributes-add-property-wizard)
- [Stock properties](#stock-properties)
## Names, add property wizard
Use this wizard to add a property to an interface.
- **Property type**
Sets the type of property you're adding. For MFC dispinterfaces, provide your own type or select from the predefined list. If you provide a stock implementation of a property, **Property type** is set to the stock type and is unavailable for change.
- **Property name**
Sets the name of the property. For MFC dispinterfaces associated with ActiveX controls, you can supply your own name or you can select a stock property name from the predefined list. If you provide your own property name, the **Stock** implementation type is unavailable. See [stock properties](#stock-properties) for a description of the properties in the list.
|Interface type|Description|
|--------------------|-----------------|
|ATL dual interface, custom interface, and local custom interface|Provide a property name.|
|MFC dispinterface, MFC ActiveX control dispinterface|Provide a property name or select a stock property from the list. If you select a property from the list, the appropriate value appears in the **Property type** box. You can change this type, depending on your selection under **Implementation type**.|
- **Return type**
ATL interfaces only. Sets the return type for the property. For dual interfaces, `HRESULT` is always the return type, and this box is unavailable. For custom interfaces, you can select a return type from the list. `HRESULT` is still recommended, because it provides a standard way to return errors.
- **Variable name**
MFC dispinterfaces only. Available only if you specify **Member variable** under **Implementation type**. Sets the name of the member variable with which the property is associated. By default, the variable name is set to `m_`*PropertyName*. You can edit this name.
- **Notification function**
MFC dispinterfaces only. Available only if you specify **Member variable** under **Implementation type**. Sets the name of the notification function called if the property changes. By default, the name of the notification function is set to `On`*PropertyName*`Changed`. You can edit this name.
- **Get function**
For MFC dispinterfaces. Available only if you specify **Get/Set methods** under **Implementation type**. Sets the name of the function to get the property. By default, the name of the `Get` function is set to `Get`*PropertyName*. You can edit this name. If you delete the name, the function [GetNotSupported](../mfc/reference/colecontrol-class.md#getnotsupported) is inserted into the interface dispatch map. The `Get`*PropertyName* function specifies that the property as readable.
- **Set function**
MFC dispinterfaces only. Available only if you specify **Get/Set methods** under **Implementation type**. Sets the name of the function to set the property. By default, the name of the `Set` function is set to `Set`*PropertyName*. You can edit this name. If you delete the name, the function [SetNotSupported](../mfc/reference/colecontrol-class.md#setnotsupported) is inserted into the interface dispatch map. The `Set`*PropertyName* function specifies that the property is writable.
- **Implementation type**
MFC dispinterfaces only. Specifies how to implement the property you're adding.
|Implementation type|Description|
|-------------------------|-----------------|
|**Stock**|Specifies a stock implementation for the property selected in **Property name**. The default. For more information, see [stock properties](#stock-properties).
If you specify **Stock**, then **Property type**, **Parameter type**, and **Parameter name** are dimmed.|
|**Member variable**|Specifies the property is added as a member variable. You can add custom properties or most stock properties as member variables. You can't specify **Member variable** for the `Caption`, `hWnd`, and `Text` properties.
Provides default names under **Variable name** and **Notification function**. You can edit this name.|
|**Get/Set methods**|Specifies the property is added as `Get`*PropertyName* and `Set`*PropertyName* functions, by default. These names appear under **Get function** and **Set function**.
You can change the default **Property type**, which passes a value for the Get function. You can specify parameters for the `Get` and `Set` functions.|
- **Get function**
For ATL interfaces. Sets the property as readable; that is, it creates the `Get` method for retrieving this property from the object. Select **Get**, **Put**, or both.
- **Put function**
ATL interfaces only. Sets the property writable; that is, it creates the `Put` method for setting, or "putting," this property of the object. Select **Get**, **Put**, or both. If you select this option, you can choose from the following two ways to implement the method:
|Option|Description|
|------------|-----------------|
|**PropPut**|The [PropPut](../windows/attributes/propput.md) function returns a copy of the object. This is the default and the most common way to make the property writable.|
|**PropPutRef**|The [PropPutRef](../windows/attributes/propputref.md) function returns a reference to the object, rather than returning the copy of the object itself. Consider using this option for objects, such as large structs or arrays, that may have initialization overhead.|
- **Parameter attributes**
ATL interfaces only. Sets whether the parameter specified by **Parameter name** is `in`, `out`, both, or none.
|Option|Description|
|------------|-----------------|
|`in`|Indicates that the parameter is passed from the calling procedure to the called procedure.|
|`out`|Indicates that the pointer parameter is returned from the called procedure to the calling procedure (from the server to the client).|
- **Parameter type**
Sets the data type of the parameter. Select the type from the list.
- **Parameter name**
Sets the name of a parameter you're adding for the property, if the property has parameters. Once you select **Add**, the parameter name appears in **Parameter list**.
- **Parameter list**
Displays the list of attributes to be added to the property. Each item in the list consists of the parameter name, parameter type, and attributes. Use **Add** and **Remove** to update the list.
- **Add**
Adds the parameter you specify in **Parameter name** and **Parameter type** to the **Parameter list**. Select **Add** to add a parameter to the list.
- **Remove**
Removes the parameter you select in **Parameter list**.
- **Default property**
MFC dispinterface only. Sets this property as the default for the interface. An interface can have only one default property; once you specify the default property, for any other properties you add to the interface, this box is unavailable.
## IDL attributes, add property wizard
Use this page of the Add Property Wizard to specify any interface definition language (IDL) settings for the property.
- `id`
Sets the numerical ID that identifies the property. This option isn't available for properties of custom interfaces. See [id](/windows/win32/Midl/id) in the *MIDL Reference*.
- `helpcontext`
Specifies a context ID that lets the user view information about this property in the Help file. See [helpcontext](/windows/win32/Midl/helpcontext) in the *MIDL Reference*.
- `helpstring`
Specifies a character string that's used to describe the element to which it applies. By default, it's set to **`property`** *Property name*. See [helpstring](/windows/win32/Midl/helpstring) in the *MIDL Reference*.
### Other options
Not all options are available to all property types.
|Option|Description|
|------------|-----------------|
|`bindable`|Indicates that the property supports data binding. See [bindable](/windows/win32/Midl/bindable) in the *MIDL Reference*. For the stock implementation of the property, this option is set by default and is unchangeable.|
|`defaultbind`|Indicates that this single, bindable property best represents the object. See [defaultbind](/windows/win32/Midl/defaultbind) in the *MIDL Reference*.|
|`displaybind`|Indicates that this property should be displayed to the user as bindable. See [displaybind](/windows/win32/Midl/displaybind) in the *MIDL Reference*.|
|`immediatebind`|Indicates that the database will be notified immediately of all changes to this property of a data-bound object. See [immediatebind](/windows/win32/Midl/immediatebind) in the *MIDL Reference*.|
|`defaultcollelem`|Indicates that the property is an accessor function for an element of the default collection. See [defaultcollelem](/windows/win32/Midl/defaultcollelem) in the *MIDL Reference*.|
|`nonbrowsable`|Tags an interface or dispinterface member that shouldn't be displayed in a properties browser. See [nonbrowsable](/windows/win32/Midl/nonbrowsable) in the *MIDL Reference*.|
|`requestedit`|Indicates that the property supports the `OnRequestEdit` notification. See [requestedit](/windows/win32/Midl/requestedit) in the *MIDL Reference*. For the stock implementation of the property, this option is set by default and is unchangeable.|
|`source`|Indicates that a member of the property is a source of events. See [source](/windows/win32/Midl/source) in the *MIDL Reference*.|
|`hidden`|Indicates that the property exists but shouldn't be displayed in a user-oriented browser. See [hidden](/windows/win32/Midl/hidden) in the *MIDL Reference*.|
|`restricted`|Specifies that the property can't be called arbitrarily. See [restricted](/windows/win32/Midl/restricted) in the *MIDL Reference*.|
|`local`|Specifies to the MIDL compiler that the property isn't remote. See [local](/windows/win32/Midl/local) in the *MIDL Reference*.|
## Stock properties
If you're adding a property to an MFC dispinterface using the [add property wizard](#idl-attributes-add-property-wizard), you can choose a stock property from the **Property name** list in the [Names](#names-add-property-wizard) page of the wizard. These properties are as follows:
|Property name|Description|
|-------------------|-----------------|
|`Appearance`|Returns or sets a value that determines the appearance of the control. The control's `Appearance` property can include or omit three-dimensional display effects. This property is an ambient read/write property.|
|`BackColor`|Returns or sets the control's ambient `BackColor` property to either a palette (RGB) color or a predefined system color. By default, its value corresponds to the foreground color of the control's container. This property is an ambient read/write property.|
|`BorderStyle`|Returns or sets the border style for a control. This property is a read/write property.|
|`Caption`|Returns or sets the control's `Caption` property. The caption is the title of the window. `Caption` has no **Member variable** implementation type.|
|`Enabled`|Returns or sets the control's `Enabled` property. An enabled control can respond to user-generated events.|
|`Font`|Returns or sets the control's ambient font. Null if the control has no font.|
|`ForeColor`|Returns or sets the control's ambient `ForeColor` property.|
|`hWnd`|Returns or sets the control's `hWnd` property. `hWnd` has no **Member variable** implementation type.|
|`ReadyState`|Returns or sets the control's `ReadyState` property. A control can be uninitialized, initialized, loading, interactive, or complete. For more information, see [READYSTATE](/previous-versions/aa768362\(v=vs.85\)) in the *Internet SDK*.|
|`Text`|Returns or sets the text contained in a control. `Text` has no **Member variable** implementation type.|