Dialog box problem
Joern Dahl-Stamnes -- Jorn.Dahl-Stamnes@fysel.unit.no Monday, August 05, 1996 Environment: NT3.51, VC++1.52 I have a problem with the OnKillfocus and the OnCancel functions in a dialog box. Assume the following fields in a dialog box: field tab-order functions IDC_COUNT 1 OnKillfocus IDC_VAL_1 2 IDC_VAL_2 3 IDOK 4 OnOK IDCANCEL 5 OnCancel When I enter the dialog box, IDC_COUNT has the focus. IDC_VAL_1 and IDC_VAL_2 is both disabled. Depending on the value I enter in IDC_COUNT, IDC_VAL_1 and/or IDC_VAL_2 will be enabled. When I use the TAB key to leave the IDC_COUNT field, the OnKillfocus function read the value in the IDC_COUNT field and then enable the IDC_VAL_1 and/or the IDC_VAL_2 fields and then set focus the the first of the two fields. The problem is that if I click on the Cancel button, the button is pressed down but the OnCancle function never get called because the OnKillfocus function do something that prevent OnCancel function to get called. I don't know how to solv this. Is there any way that I in the OnKillfocus function can find out WHY IDC_COUNT lost focus? Other ideas how to fix this? Thanks in advance. -- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Joern Yngve Dahl-Stamnes, Norwegian University of Science and Technology | | e-mail: Jorn.Dahl-Stamnes@fysel.unit.no | | phone : +73 59 44 12, fax: +73 59 14 41 | | Surfing the net? Try http://www.fysel.unit.no/dahls/dahls.html | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ppbillc@srv2.sj.ablecom.net Wednesday, August 07, 1996 [Mini-digest: 8 responses] > I don't know how to solv this. Is there any way that I in the OnKillfocus > function can find out WHY IDC_COUNT lost focus? Other ideas how to fix > this? Thanks in advance. Did you call CDialog::OnKillFocus in the OnKillFocus Function? B / \ * * \ _,-._/ -----From: Vincent Mascart <100425.1337@CompuServe.COM> >From: Joern Dahl-Stamnes >Sent: mercredi 7 aout 1996 20:00 >To: INTERNET:MFC-L@NETCOM.COM >Subject: Dialog box problem > >Environment: NT3.51, VC++1.52 > >I have a problem with the OnKillfocus and the OnCancel functions in >a dialog box. Assume the following fields in a dialog box: > >field tab-order functions >IDC_COUNT 1 OnKillfocus >IDC_VAL_1 2 >IDC_VAL_2 3 >IDOK 4 OnOK >IDCANCEL 5 OnCancel > >When I enter the dialog box, IDC_COUNT has the focus. IDC_VAL_1 and >IDC_VAL_2 is both disabled. Depending on the value I enter in >IDC_COUNT, IDC_VAL_1 and/or IDC_VAL_2 will be enabled. When I use the >TAB key to leave the IDC_COUNT field, the OnKillfocus function read >the value in the IDC_COUNT field and then enable the IDC_VAL_1 and/or >the IDC_VAL_2 fields and then set focus the the first of the two fields. > >The problem is that if I click on the Cancel button, the button is >pressed down but the OnCancle function never get called because the >OnKillfocus function do something that prevent OnCancel function to >get called. > >I don't know how to solv this. Is there any way that I in the OnKillfocus >function can find out WHY IDC_COUNT lost focus? Other ideas how to fix >this? Thanks in advance. On thing you did not say is what kind of control is IDC_COUNT. If possible, you should check EN_CHANGED message from an edit controls, CBN_CHANGE from a combobox, and so on instead of the kill focus message. Another solution is to check the window which receive the focus like this: if(GetFocus() != GetDlgItem(IDCANCEL)) { // normal behaviour of OnKillFocus } HTH Vincent Mascart 100425.1337@compuserve.com -----From: LeRoy BaxterThis kind of stuff can get really ugly. When you get a KillFocus, you need to determine where the focus has been shifted to. It can be done, but expect to put in a bunch of hours to get it right. You'd be better off to redesign so you don't have conditional navigation within the dialog. You can also get the value as it is typed in (and not process the KillFocus). -- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Joern Yngve Dahl-Stamnes, Norwegian University of Science and Technology | | e-mail: Jorn.Dahl-Stamnes@fysel.unit.no | | phone : +73 59 44 12, fax: +73 59 14 41 | | Surfing the net? Try http://www.fysel.unit.no/dahls/dahls.html | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -----From: David.Lowndes@bj.co.uk It's always a bad idea to use the set/kill focus events to affect the focus and enable/disable controls. In your situation it might be better to use the edit control's change event (I assume IDC_COUNT is an edit control). Alternatively, use the kill focus event to post yourself a user defined message, and do your enable/disable logic there instead (so you delay your action). Dave Lowndes -----From: "Anthony DiBlasio" Whenever I need to do something immediately based on a value entered into an edit control (like enable other controls), I create a handler for the EN_CHANGE notification message. You can enable your other controls immediately and allow the normal tabbing to occur. Tony_DiBlasio@msn.com -----From: Terry Trippany Hi, At first I thought the behavior you describe is exactly what should happen. When you click on the cancel button while the focus is in IDC_COUNT a WM_KILLFOCUS notification message is sent to the parent window through WM_COMMAND (ie- an edit box would send EN_KILLFOCUS ...). When this happens the BN_CLICKED message never gets sent because it never really occurs in the Cancel button. The button will just get focus and is in fact never pushed down. If you click it again the OnCancel function is called appropriately. This is fine on the outside, but there does seem to be a problem with the message handling after the WM_KILLFOCUS is sent. If you look at the call stack you can see that you are in a DispatchMessage loop via CWnd::RunModalLoop. It appears that the first time you lose focus certain notification messages get lost somewhere. I couldn't recreate this with tabs, they worked fine. The mouse messages were disappearing for me. If you lost focus via a left mouse down then the next mouse down event seemed to disappear. This appears to be an MFC bug. Terry ************************************* Terry Trippany Senior Consultant Strategic Technology Resources 343 West Erie Street, Suite 600 Chicago, IL 60610-4035 mailto:terryt@str.com ************************************** Joern Dahl-Stamnes wrote: > > Environment: NT3.51, VC++1.52 > > I have a problem with the OnKillfocus and the OnCancel functions in > a dialog box. Assume the following fields in a dialog box: > > field tab-order functions > IDC_COUNT 1 OnKillfocus > IDC_VAL_1 2 > IDC_VAL_2 3 > IDOK 4 OnOK > IDCANCEL 5 OnCancel > > When I enter the dialog box, IDC_COUNT has the focus. IDC_VAL_1 and > IDC_VAL_2 is both disabled. Depending on the value I enter in > IDC_COUNT, IDC_VAL_1 and/or IDC_VAL_2 will be enabled. When I use the > TAB key to leave the IDC_COUNT field, the OnKillfocus function read > the value in the IDC_COUNT field and then enable the IDC_VAL_1 and/or > the IDC_VAL_2 fields and then set focus the the first of the two fields. > > The problem is that if I click on the Cancel button, the button is > pressed down but the OnCancle function never get called because the > OnKillfocus function do something that prevent OnCancel function to > get called. > > I don't know how to solv this. Is there any way that I in the OnKillfocus > function can find out WHY IDC_COUNT lost focus? Other ideas how to fix > this? Thanks in advance. > > -- > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > | Joern Yngve Dahl-Stamnes, Norwegian University of Science and Technology | > | e-mail: Jorn.Dahl-Stamnes@fysel.unit.no | > | phone : +73 59 44 12, fax: +73 59 14 41 | > | Surfing the net? Try http://www.fysel.unit.no/dahls/dahls.html | > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -----From: Paramasivan Maddy The problem here is, focus is sent to the Cancel button before the IDCANCEL notification is sent to the dialog box, causing EN_KILLFOCUS to be generated by the control. So to go around the problem, you can maintain a flag m_bDoValidation. And When the user clicks the Cancel button, the dialog box is notified of the mouse-click by the child button through a WM_PARENTNOTIFY message. So in the OnParentNotify() method of the dialog box, if the user clicked the cancel button then m_bDoValidation can be set to FALSE. So this prevents the validation from taking place in the EN_KILLFOCUS handler and hence the focus is not set to IDC_VAL1 or IDC_VAL2. Note: To ensure that the dialog receives the WM_PARENTNOTIFY message we have to explicitly remove the WS_EX_NOPARENTNOTIFY style from the Cancel button. For example: Or Uncheck the ParentNotify style for Cancel button in the AppStudio. BOOL CFocusTest::OnInitDialog() { CDialog::OnInitDialog(); // Remove this style so we get the WM_PARENTNOTIFY when the // user clicks on the Cancel button GetDlgItem(IDCANCEL)->ModifyStyleEx(WS_EX_NOPARENTNOTIFY,0); // Rest of OnInitDialog ... ... } The OnParentNotify method will look something like this: void CFocusTest::OnParentNotify(UINT message, LPARAM lParam) { CDialog::OnParentNotify(message, lParam); CPoint ptButtonDown(LOWORD(lParam), HIWORD(lParam)); // Mouse clicked on dialog. // Check if the cancel button is clicked!! if ((message == WM_LBUTTONDOWN) && (ChildWindowFromPoint(ptButtonDown) == GetDlgItem(IDCANCEL))) m_bDoValidation = FALSE; // Trying to Cancel the dialog; don't validate. } //Ths kill focus function will look like this. void CFocusTest::OnKillfocusCount() { if (m_bDoValidation) { CString csTest; m_Count.GetWindowText(csTest); if (csTest == "1") { m_Val1.EnableWindow(TRUE); m_Val1.SetFocus(); } else { m_Val2.EnableWindow(TRUE); m_Val2.SetFocus(); } } } Hope this helps you, Maddy -----From: "Todd Anderson" Did you try EN_CHANGE instead of OnKillFocus? This gets sent if the operator changed the data and after windows updates the display. (I'm assuming it's an edit control, I know a ListBox/Combobox also have a similar message). This should solve the focus problem. I've never been able to get this type of dialog to work with OnKillFocus, I always end up using the change messages. Todd
| Вернуться в корень Архива |