I have a button and text control in MFC dialog window, when I click on button, in edit control must be replaced for example "hello world".
but if I write
edit="hello wordl"
it doesn't change, how can I change?
First you should add a variable to edit.To do that right click on the edit and choose Add Variable... in Add Member variable Wizard change Category from Control to Value after that in the Variable name field type a name like m_EditValue then click finish.from now you can change the Edit Control simply by following code.
void CAboutDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
m_EditValue = L"Hello World";
UpdateData(FALSE);
}
Use the SetWindowText method:
edit.SetWindowText( _T("Hello, World!") );
First you need a CEdit member variable of the dialog. Use 'Add Variable' in the dialog editor. If you name this variable m_helloedit then in your button click function
m_helloedit.SetWindowText(_T("hello world!"));
Related
When I have a SDI Document-View MFC application which uses CBCGPTabView as the main view, one of the tabs is a CEditView. If I send a custom message to the CBCGPTabView derived class and use GetTabControl().SetTabLabel() it not only changes the tab label but contents of the CEditView. Is there a way to prevent that?
This is the workaround I have for now:
// hack to work around ceditview getting its window contents changed
CView* pview=GetView(tabi);
if (pview->IsKindOf(RUNTIME_CLASS(CEditView))) {
CString strexistingtext;
pview->GetWindowText(strexistingtext);
// change label
tabctrl.SetTabLabel(tabi, strlabel);
// put back text
pview->SetWindowText(strexistingtext);
}
else {
// change label
tabctrl.SetTabLabel(tabi, strlabel);
}
}
Another method is to override
virtual CString CBCGPMDIChildWnd::GetFrameText() const
And put / set there what you need.
I am making a Visual Studio MFC C++ App, and I am having a (hopefully) small problem.
I have an Edit Control text box with ID txtInputBox, and it has a value C-String variable m_inputText assigned to it. After I do a SetDlgItemText(txtInputBox, L"Hello World"); the cursor moves to the front of the text, before the 'H'. How would I get the cursor to be at the end (after the 'd') right after doing a SetDlgItemText?
I read of a SetSel method, but don't know how to implement it if that's the right one.
CEdit control MFC, placing cursor to end of string after SetWindowText
What I have is:
someDlg::someFunction() //this is used in an EN_CHANGE event
{
//some logic stuff to get a result string
SetDlgItemText(txtInputBox, L"Hello World");
//need it to set the cursor to the end
//I tried these, but it didn't recognize (expression must have class type?)
//txtInputBox.SetSel(0, -1);
//txtInputBox.SetSel(-1);
}
void someDlg::EnChangetxtinputbox()
{
someFunction();
}
you said txtInputBox is the ID to your edit control (which should be written like so: IDC_NAME), you can pass IDs to SetDlgItemText.
what they are refering to in the link you posted is a member variable, you can't pass a member variable to SetDlgItemText. you can add a variable to a control by right clicking it in editor and clicking "Add variable".
I am using VS2008.
I have MFC dialog based application with split button control.
I want to display a list box on the BCN_DROPDOWN event of split button control. I dont know how to achieve it?
Reference to the documentation of the CSplitButton class: https://msdn.microsoft.com/en-us/library/bb514109.aspx
If you want to change default behaviour then use the override:
BEGIN_MESSAGE_MAP(CMySplitButton,
CSplitButton)
ON_NOTIFY_REFLECT(BCN_DROPDOWN, &CMySplitButton::OnDropDown)
END_MESSAGE_MAP()
(...)
afx_msg void OnDropDown(NMHDR* pNMHDR, LRESULT* pResult);
You can in this function show your listbox or whatever you like.
If the listbox you refer to the actual submenu (3) as shown in the documentation, then add a menu: https://msdn.microsoft.com/en-us/library/4b6tafew.aspx and set the resource ID for that menu into SetDropDownMenu() function
void SetDropDownMenu(
UINT nMenuId,
UINT nSubMenuId);
Good luck :)
You must add your menu into a resource.
Ex:IDR_MENU_BUTTON_ANY
Declare some Resource symbols for submenu. It will change *.rc and resource.h.
Your resource will look like:
IDR_MENU_BUTTON_ANY
BEGIN
POPUP "SampleMenu"
BEGIN
MENUITEM "Sub1", ID_SUB_MENU_1
MENUITEM "Sub2", ID_SUB_MENU_2
END
END
When you initialize your dialog. You should insert some code as below:
//Your split button
CMFCSplitButton m_btnAny;
//Set dropdown menu
m_btnAny.SetDropDownMenu(IDR_MENU_BUTTON_ANY, 0);
More, I found the following link. The author provided an example. It may help you.
http://codexpert.ro/blog/2013/02/01/split-button-control/#comment-22983
I made another window pop up using:
SecondDialog object;
object.setModal(true);
object.exec();
I added a label on the second dialog using the design form editor. However I would like to use a QString variable from the original dialog to use for that label. Is that possible? And if so how would I do it? Any input would be greatly appreciated.
You should provide a name for the label in your second dialog. You can do it in the designer's Object inspector (upper right corner by default), left column. Then, create a method
void SecondDialog::SetLabelText (QString &text)
{
ui.myLabel->setText (text);
}
Then call it from the first dialog before exec'ing.
I've created a read-only edit box in an MFC dialog box. I'm trying to have it so a user clicks in the edit box, which is read-only, it opens a file dialog, and then puts this value into the text box using UpdateData. I'm catching the ON_EN_SETFOCUS message but pressing OK on the file dialog respawns it, so I get caught in an infinite loop.
UpdateData(TRUE);
CFileDialog fileDialog(TRUE,NULL, NULL,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST, _T("Text Files(*.txt)|*.txt||"));
if( fileDialog.DoModal() == IDOK )
{
configFile=fileDialog.GetPathName(); //Note to self, this includes filename, getPathName includes filename and path.
}
else
{
return;
}
UpdateData(FALSE);
If you've got any ideas on how this should be done, I would be very grateful.
Alright Mr. Lister I guess I'll add an answer.
First off I would preface this with I would probably simply add a button name "..." to launch the file dialog to the right of the edit box for opening the file dialog as that's the simplest solution and what most windows users will expect.
Another option however is to extend an MFC control. When deciding to extend a control you want to pick one that mostly has the desired behavior and that has a virtual destructor which lends itself to being a subclass. Since you want button like behavior CButton may be a good choice.
Your class interface might look something like this:
class CPathButton : public CButton
{
public:
enum { ID /*= IDC_BUTTON1*/ };
const CString GetPath() const;
const CString GetFileName() const;
const CString GetDirectory() const;
const CString GetExtension() const;
// other useful methods for setting file filters etc
protected:
// add ON_CONTROL(BN_CLICKED, ID, &OnClick) or ON_BN_CLICKED(ID, &OnClick)
DECLARE_MESSAGE_MAP()
// CFileDialog fdlg.DoModal(), m_path = fdlg.GetPathName(), SetWindowText(fdlg.GetFileTitle()), etc
afx_msg void OnClick();
// additional message handlers etc
private:
CString m_path; // save full path for after dialog is closed
};
You can add as much or as little customization as you want depending on if the control will be created dynamically, via the resource file, or whatever. The basic idea being that you display the currently selected file name on the button while storing the full path for other uses as a member so the user doesn't need to see the clutter of a long path with nested directories.
If you don't like the way it looks by default you can override OnPaint and handle WM_PAINT messages and use a custom font, size, or add ellipsis for a long file title. You could also handle re-sizing the button to fit the file title by using text metrics and GetTextExtent to ensure the name fits or simply display a CToolTipCtrl when they hover the mouse over the button so they can see the full name. The CMFCButton from the MFC feature pack in VS2008+ has tool tip functionality built in so if you inherit from that instead of CButton displaying a tool tip would be as simple as calling SetTooltip(m_path)
If you want to get really fancy you could use some of the uxtheme API or new windows animation API.
You can override PreTranslateMessage() in your dialog class, and determine if the edit control was clicked that way:
CEdit m_CEditCtrl;
// ...
BOOL YourDialogClass::PreTranslateMessage(MSG *pMsg)
{
if((pMsg->wParam == VK_LBUTTON) && (m_CEditCtrl.m_hWnd == pMsg->hwnd))
{
// open your file dialog
return TRUE; // Return that the message was translated and doesn't need to be dispatched
}
return CDialog::PreTranslateMessage(pMsg);
}
Update: You can also (and it may be a better idea) to override your CEdit control's CWnd::PreTranslateMessage() function. This would require deriving a class from CEdit.
If you are using VS2008 SP1 or above, the easiest way to ask for a path is with CMFCEditBrowseCtrl. It displays an edit control with a button. The steps to use it are:
Change your edit control's class to CMFCEditBrowseCtrl
Call EnableFileBrowseButton to tell it that you want to browse for files, not folders (you can set a filter and default extension)
When the user clicks the button, a file dialog appears, and when you click OK in it, the selected path is written in the edit control.