Screenshots
In my projects I usually need something in C++ like the InputBox
function in
Visual Basic. Nish [BusterBoy] has a CInputBox
class derived from CFrameWnd
.
Although this class provides the basic functionalities, I created my own CInputBox
class derived from CDialog
. CInputBox
class provides all
the functionality of the InputBox
function in Visual Basic. In addition, it provides some additional nice features:
- It is possible to get integer values, instead of strings
- It is possible to show a Browse button to get filenames
- It is possible to use drag and drop to get the filenames
- And most importantly, it offers a nice interface :)
How to use the class?
#include "DialogHeaderCtrl.h"
#include "FocusEditCtrl.h"
enum InputBox_DataType
{
DataType_String,
DataType_Integer
};
enum InputBox_BrowseOption
{
Browse_None,
Browse_Open,
Browse_Save,
Browse_Folder
};
class CInputBox : public CDialog
{
public:
void SetLabel (const CString &sLabel);
void SetDefaultText (const CString &sDefault);
void SetDesc (const CString &sDesc);
void SetTitle (const CString &sTitle);
void SetAllowEmpty (bool bAllowEmpty);
void SetDataType (InputBox_DataType nDataType);
void SetBrowseOption (InputBox_BrowseOption nBrowse);
void SetIcon (UINT nIcon);
CInputBox (CWnd* pParent = NULL);
CInputBox ( const CString &sTitle, const CString &sDesc, const CString &sLabel,
const CString &sDefault, UINT nIcon = NULL,
InputBox_BrowseOption nBrowse = Browse_None,
InputBox_DataType nDataType = DataType_String,
bool bAllowEmpty = false,
CWnd* pParent = NULL);
enum { IDD = IDD_INPUTBOX_DIALOG };
CFocusEditCtrl m_Edit1;
CDialogHeaderCtrl m_HeaderCtrl;
CButton m_BrowseBtn;
CString m_sLabel1;
CString m_sValue;
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
CString m_sTitle, m_sDesc;
InputBox_BrowseOption m_nBrowse;
InputBox_DataType m_nDataType;
bool m_bAllowEmpty;
UINT m_nIcon;
bool m_bInitialized;
virtual BOOL OnInitDialog();
afx_msg void OnBrowse();
virtual void OnOK();
DECLARE_MESSAGE_MAP()
};
Here are some examples that show how to use
CInputBox
class:
CInputBox dlg;
dlg.SetTitle ("Enter yout title here");
dlg.SetDesc ("Enter your description here");
dlg.SetLabel ("Enter your label here");
dlg.SetDefaultText ("enter the default text to be shown here");
if (dlg.DoModal () == IDOK)
MessageBox (dlg.m_sValue, "InputBoxDemo", MB_OK | MB_ICONINFORMATION);
else
MessageBox ("Cancel selected", "InputBoxDemo", MB_OK | MB_ICONINFORMATION);
You can set the title using void SetTitle (const CString &sTitle)
method.
You can set the description using void SetDesc (const CString &sDesc)
method.
You can set the label using void SetLabel (const CString &sLabel)
method.
You can set the initial text to be shown in the Edit control using void
SetDefaultText (const CString &sDefault)
method.
You can set the icon to be show in the dialog using void SetIcon (UINT
nIcon)
method. Here is an example:
dlg.SetIcon (IDI_DOCUMENT);
You can set the data type to using void SetDataType (int nDataType)
method.
- If
nDataType
is DataType_String
then the input is a string
- If
nDataType
is DataType_Integer
then the input is numeric.
Only 0123456789 are accepted as inputs
If you want to be able to get empty inputs, use SetAllowEmpty (bool bAllowEmpty)
method.
- If
bAllowEmpty
is false, then the user is forced to enter a value.
- If
bAllowEmpty
is true, then the user can just leave the input
field empty.
To show Browse button, use SetBrowseOption (int nBrowseOption)
method. The parameter nBrowseOption
can take 4 values:
- If
nBrowseOption
is Browse_None
, Browse button is hidden
- If
nBrowseOption
is Browse_Open
, Browse button is visible
and it shows Open File Dialog when clicked
- If
nBrowseOption
is Browse_Save
, Browse button is visible
and it shows Save File Dialog when clicked
- If
nBrowseOption
is Browse_Folder
, Browse button is visible
and it shows Browse Folder Dialog when clicked
Here are additional examples:
CInputBox dlg;
dlg.SetTitle ("Find");
dlg.SetDesc ("Please enter the user name to be found");
dlg.SetLabel ("User name:");
dlg.SetIcon (IDI_DOCUMENT);
if (dlg.DoModal () == IDOK)
MessageBox (dlg.m_sValue, "InputBoxDemo", MB_OK | MB_ICONINFORMATION);
else
MessageBox ("Cancel selected", "InputBoxDemo", MB_OK | MB_ICONINFORMATION);
CInputBox dlg;
dlg.SetTitle ("Age");
dlg.SetDesc ("Please enter your age below.");
dlg.SetLabel ("Age:");
dlg.SetIcon (IDI_DOCUMENT);
dlg.SetDataType (DataType_Integer);
if (dlg.DoModal () == IDOK)
MessageBox (dlg.m_sValue, "InputBoxDemo", MB_OK | MB_ICONINFORMATION);
else
MessageBox ("Cancel selected", "InputBoxDemo", MB_OK | MB_ICONINFORMATION);
CInputBox dlg;
dlg.SetTitle ("Create Directory");
dlg.SetDesc ("Please enter the directory to be created.");
dlg.SetLabel ("Directory:");
dlg.SetDefaultText ("c:\\temp");
dlg.SetIcon (IDI_DIRECTORY);
dlg.SetBrowseOption (Browse_Folder);
if (dlg.DoModal () == IDOK)
MessageBox (dlg.m_sValue, "InputBoxDemo", MB_OK | MB_ICONINFORMATION);
else
MessageBox ("Cancel selected", "InputBoxDemo", MB_OK | MB_ICONINFORMATION);
Or you can initialize all the member variables just using the constructor:
CInputBox dlg ("Create Directory", "Please enter the directory to be created",
"Directory:", "c:\\temp", IDI_DIRECTORY, Browse_Folder);
if (dlg.DoModal () == IDOK)
MessageBox (dlg.m_sValue, "InputBoxDemo", MB_OK | MB_ICONINFORMATION);
else
MessageBox ("Cancel selected", "InputBoxDemo", MB_OK | MB_ICONINFORMATION);
Some points that you should keep in mind
- To use CInputBox class in your projects, you have to add files
InputBox.h,
InputBox.cpp, DialogHeaderCtrl.h, DialogHeaderCtrl.cpp, FocusEditCtrl.h and
FocusEditCtrl.cpp
to your project. Also you have to copy the dialog
resource IDD_INPUTBOX_DIALOG
to your project.
- Keep in mind that my implementation may not be the most efficient way of
doing such a class. I am neither a GUI guru, nor a genius :)