Link to home
Start Free TrialLog in
Avatar of santuon
santuon

asked on

I am losing context help when I use m_cEdit.ModifyStyleEx( NULL, WS_TABSTOP);

Hello.

I have an few edit box on the screen of an MFC dialog and property page. I have to sometimes dynamically make a few controls "readonly" due to business logic. Because of this read only state, it is also required that the control is dynamically remove from the tab sequence. But when I do this, I noticed that the context help is lose. ie when I press the dialog's help button then move the help cursor onto the control and click, no help message pops up.

the code for disable the control is as follows
m_cEdit.SetReadOnly(TRUE);
m_cEdit.ModifyStyleEx( NULL, WS_TABSTOP);

Note: I do not wish to make the control "disable", as the text goes grey, I only wish to make it "readonly"!!

So why is the help lost when I called
m_cEdit.ModifyStyleEx( NULL, WS_TABSTOP); ??

When I comment the above line out, and leave the m_cEdit.SetReadonly(TRUE) the context helps works fine! Also I have a few other controls on the page which I have non-dynamically set the TabStop to be false and SetReadonly to be true, but the context helps works fine on them. it is only when I do it dynamicall that the problem arise.

Another question while i am here, the documentation says ModifyStyle(DWord Remove, DWord Add) but I find that
m_cEdit.ModifyStyleEx( NULL, WS_TABSTOP); removes the tab stop and
m_cEdit.ModifyStyleEx( WS_TABSTOP, NULL); sets it. ??? shouldn't it be the other way around??

Any comments/explanation would be much appreciated.

ASKER CERTIFIED SOLUTION
Avatar of AndyAinscow
AndyAinscow
Flag of Switzerland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of lakshman_ce
lakshman_ce


BOOL ModifyStyleEx(
   DWORD dwRemove,
   DWORD dwAdd,
   UINT nFlags = 0
);

BOOL ModifyStyle(
   DWORD dwRemove,
   DWORD dwAdd,
   UINT nFlags = 0
);

Styles specified in the first parameter should be removed and styles specified in the second parameter should be set.

As Andy suggested, use
ModifyStyle(WS_TABSTOP,0) to remove the edit box from the tab order list.
ModifyStyle(0,WS_TABSTOP) to add the edit box to the tab order list.
To add some more to above said:

Using ModifyStyleEx with WS_TABSTOP is in fact the same as calling ModifyStyleEx(WS_EX_CONTROLPARENT,..) (WS_TABSTOP and WS_EX_CONTROLPARENT have the same value, 0x1000).
WS_EX_CONTROLPARENT   Allows the user to navigate among the child windows of the window by using the TAB key.
So it looks like WS_TABSTOP... :)

And, from MSDN:
"WS_TABSTOP
You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use *SetWindowLong*."
Avatar of santuon

ASKER

Great feedback. I appreciate everyone's comment but since AndyAinscow was first to reply,  I accepted his answer, thought everyone's answer would have achieved the same results.

It seems that using
ModifyStyle(WS_TABSTOP,0) removes the Tab order unlike ModifyStyleEx(WS_TABSTOP, 0) which adds it. Not only that, but the ModifyStyle method also does lose context help. So using this fixed my original problem!!!

Great!


Be careful (I get the feeling you don't appreciate the following).

ModifyStyle and ModifyStyleEx are TWO separate functions that perform different actions.  They are not interchangable.  The second is not an extension to the first.
And the funny thing that ModifyStyleEx(WS_TABSTOP, 0) means ModifyStyleEx(WS_EX_CONTROLPARENT, 0)  :o)