|
Hi,
I have just added a edit control to an existing tree control. But it should work with a combo box the same way.
LRESULT CZiOptionPPgAdvanced::OnNotify(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL& bHanddled)
{
USES_CONVERSION;
switch (((LPNMHDR) lParam)->code)
{
case TVN_SELCHANGED :
{
if (!m_hWndTreeView)
return 1;
if (m_hWndEditControl)
::DestroyWindow(m_hWndEditControl);
HTREEITEM hSelectedItem = TreeView_GetSelection(m_hWndTreeView);
if (hSelectedItem == NULL)
return 0;
RECT rText;
TreeView_GetItemRect(m_hWndTreeView,hSelectedItem,&rText,TRUE);
//create the control
m_hWndEditControl = CreateWindowEx(WS_EX_CLIENTEDGE,"Edit","",WS_CHILD,rText.right,
rText.top,100,rText.bottom - rText.top +5,
m_hWndTreeView,NULL,_Module.GetModuleInstance(),NULL);
::ShowWindow(m_hWndEditControl,SW_SHOW);
}
break;
default:
break;
}
}
|
|
|
|
|
Hi,
I guess this is basically the same question as someone else has already asked, but please bear with me -- I'm quite new to VC++.
I'm trying to implement an "Apply Settings" button to work with this control. But it seems as if it's not possible to add something that responds to a TVN_SELCHANGED message, or rather, that function seems not to be used.
So, how do I proceed?
As I am new to VC++, please answer in as much detail as you think I need
thanks
Daniel
|
|
|
|
|
Hi,
well as the question may be misunderstood: what I wanted to do was to have an Apply button that is disabled (with GetDlgItem(X)->EnableWindow(FALSE), and then--when the user changes something in the trectrl--do a EnableWindow(TRUE) to allow the user to press the apply button which hence updates the variables that holds the configuration data.
So, how do I do this from within this class?
/Daniel
|
|
|
|
|
|
Apply Settings buttons are bad UI design. You should apply the new settings immediately.
Yes, you can respond to TVN_SELCHANGED; just use the ClassWizard to add a handler.
|
|
|
|
|
Well, I would not know about whether or not it's bad UI design (though I'm a
HCI guy, so perhaps I have some idea after all...)
I quite like the idea of having both Ok, Apply and Cancel, and it seems to be
windows standard, right?
|
|
|
|
|
ok, this issue has now been sorted out. thanks for the class
Daniel
|
|
|
|
|
"Apply" buttons are not bad UI design. Some dialogs are appropriate for apply buttons (control panels, property dialogs), and some are not.
Apply buttons are typically made possible by tracking a "dirty bit" for the data you're manipulating. Most text editors, for example, display windows that have unsaved changes with an asterisk (*) in the window title. When text editors provide the "Save" command, it is the logical equivalent of the dialog "Apply" command- "save my changes, don't close what I'm working on."
Some benefits of having an Apply button:
-1- It makes it possible to save without closing the dialog. (ex: Changing desktop settings, see the changes, make more changes, without having to reopen a dialog.)
-2- It serves as a reminder to the user that something has changed. (ex: User opens dialog, changes one setting, gets a phone call, goes back to dialog and can't remember if they changed anything.)
-3- It forces the programmer to provide local object storage in the GUI code, rather than be tempted to manipulate the original object directly. (ex: Dialog has pointer to real object, changes it on the fly as the dialog is maniupulated. User hits "Cancel", program either backs out changes already made, or risks persisting changes not meant to be saved.)
So, if you just add a "dirty bit", it is easy to make the apply button enable/disable properly - you disable it when the dirty bit is off, and enable it vice versa. Clicking Apply then pushes the local dialog storage to the original, and sets the button back to disabled. Implementing your "OnOK" logic to save stuff in a subroutine makes this easier; you can call the same subroutine in both "OnOK" and "OnApply", where "OnOK" then exits the dialog, but "OnApply" does not.
|
|
|
|
|
Instead of an Edit Box, I'm trying to add a Rich Edit Ctrl. However, I haven't been able to do so successfully even though I duplicated the code for an Edit Box. Also, does anyone know how to extend the width to reach the end of the tree control?
Lost in Space
|
|
|
|
|
Instead of an Edit Box, I'm trying to add a Rich Edit Ctrl. However, I haven't been able to do so successfully even though I duplicated the code for an Edit Box. Also, does anyone know how to extend the width to reach the end of the tree control?
Lost in Space
|
|
|
|
|
I would like to know how the parent window can be notified to handle mouse clicks in the tree control. If I implement a handler for the NM_CLICK message for the control in the parent window, it seem like it is never called. It only calls the CTreeOptionsCtrl::OnClick() handler.
I have read something about message reflection, but I have not been able to get it right.
Regards,
Roar
|
|
|
|
|
I had the same problem and the solution I came up with is for the control to send a custom message to its parent inside the OnClick function. The parent then processes the custom message and acts as if it had received a NM_CLICK notification
|
|
|
|
|
I also registered a user message, and then post it from the control back to my parent window.
Is there not a better way? Doing this for each message is tedious at best.
Conrad - conradb@adroit.co.za
Always do badly to start off, that way when you get the hang of it suddenly, everyone is surprised.
|
|
|
|
|
For my purposes (selecting directories for processing), there is no real need for a "group". Instead, a parent node should just be a normal check box node that just happens to contain child items.
Is there any way to do this with this control
|
|
|
|
|
I am wanting the same thing I would like to be able to a normal check box for the parent "group" item and have it automatically select all the children.
I would also like to be able to use radio buttons for the parent "group" objects and check boxes for the children.
Did you ever get a response to your question?
I would sure like to know what you did.
|
|
|
|
|
i grabbed some code from www.codeguru.com and built my own control to do what i needed. unfortunately, it's very closely integrated to the project i used it for, so i can't really post it here. if i get some free time, maybe i'll try to clean it up...
-c
|
|
|
|
|
How would one get started modifying this to support multiple icons per tree item? I would like to alter it so that it could have a graphical icon as well as 2-3 check boxes per tree item. I know MFC, but I dont know low level windows very well. If somebody can add that feature i will package it up as an activex and post the code
|
|
|
|
|
When you attempt to directly create an instance of this control (at least in Windows 2000), the SetImageList in PreSubclassWindow fails. In order to correct this, simply add an OnCreate handler (use the class wizard to map WM_CREATE - if the class doesn't already show up in class wizard, delete your .clw file and try again)like this :
int CTreeOptionsCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
if (NULL == GetImageList(TVSIL_NORMAL))
{
//Hook it up to the tree control
SetImageList(&m_ilTree, TVSIL_NORMAL);
}
return 0;
|
|
|
|
|