Prev: A serializable view for writing line delimited text?
Next: CWinThread Can't Receive Custom Message in some case
From: Eddards on 12 Sep 2009 10:30 In the code below in the RepeatButton.cpp of the test app I see it sends the BN_CLICKED message to the button function which is connected to CRepeatButton. Is it possible to call another function within the main dialog from here? void CRepeatButton::OnTimer(UINT nIDEvent) { if (nIDEvent == 100) { KillTimer(100); //start the button pressing timer SetTimer(200,200,NULL); // 200=ID 1000=msdelay } else if (nIDEvent = 200) { CWnd *Parent = GetParent(); if (Parent) { //send the BN_CLICK Message to the parent Parent->SendMessage(WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(),BN_CLICKED),(LPARAM)m_hWnd); } } CButton::OnTimer(nIDEvent); }
From: RainMan on 12 Sep 2009 11:15 I do not quite understand tour statement: I see it sends the BN_CLICKED message to the button function which is connected to CRepeatButton. BN_CLICKED is not a message. That is not what happens. What happens in the code snippet is as follows: After 100 ms delay timer is set to 200 ms delay and from a WM_TIMER message handler, button repeatedly sends WM_COMMAND message with button's ID and NOTYFICATION CODE BN_CLICKED. I do not see any function connected to a CRepeatButton. MFC way of handling messages is mapping a message handler in a class' object. I cannot say if Parent object has a handler for this particular command. To answer your question: In general, of course, you can. You would have to cast Parent pointer to a dialog class type. Another way of handling that would be to send a custom message. The question is why would you want to do that? Why would you use button to repeatedly invoke a function from a button, while you can do the same in the Parent class, calling member function from own WM_TIMER message handler? -- RainMan "Eddards" wrote: > In the code below in the RepeatButton.cpp of the test app I see it > sends the BN_CLICKED message to the button function which is connected > to CRepeatButton. > Is it possible to call another function within the main dialog from here? > > void CRepeatButton::OnTimer(UINT nIDEvent) > { > if (nIDEvent == 100) > { > KillTimer(100); > //start the button pressing timer > SetTimer(200,200,NULL); // 200=ID 1000=msdelay > } > else if (nIDEvent = 200) > { > CWnd *Parent = GetParent(); > if (Parent) > { > //send the BN_CLICK Message to the parent > Parent->SendMessage(WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(),BN_CLICKED),(LPARAM)m_hWnd); > } > } > CButton::OnTimer(nIDEvent); > } > > >
From: David Ching on 12 Sep 2009 13:58 "Eddards" <eddards(a)verizon.net> wrote in message news:A7qdnRvzH5ACLTbXnZ2dnUVZ_tadnZ2d(a)giganews.com... > else if (nIDEvent = 200) This should be '==' -- David
From: Eddards on 12 Sep 2009 15:48 Thanks, I missed that. The code still worked, go figgure. "David Ching" <dc(a)remove-this.dcsoft.com> wrote in message news:utcLYK9MKHA.1372(a)TK2MSFTNGP02.phx.gbl... > > "Eddards" <eddards(a)verizon.net> wrote in message > news:A7qdnRvzH5ACLTbXnZ2dnUVZ_tadnZ2d(a)giganews.com... >> else if (nIDEvent = 200) > > This should be '==' > > -- David
From: Joseph M. Newcomer on 13 Sep 2009 00:09
Several issues On Sat, 12 Sep 2009 10:30:56 -0400, "Eddards" <eddards(a)verizon.net> wrote: >In the code below in the RepeatButton.cpp of the test app I see it >sends the BN_CLICKED message to the button function which is connected >to CRepeatButton. >Is it possible to call another function within the main dialog from here? > >void CRepeatButton::OnTimer(UINT nIDEvent) >{ **** Have you ever heard of #define or const int? Who in their right mind would use an absolute integer in this context? **** > if (nIDEvent == 100) > { > KillTimer(100); > //start the button pressing timer **** You do not need to kill the timer to change its time, and you don't need a second timer; you can use the first timer. Again, have you ever heard of #define? There would be no need to have a comment that disagrees with the code if you used symbolic names such as SetTimer(IDT_REPEAT_TIMER, REPEAT_INTERVAL, NULL); **** > SetTimer(200,200,NULL); // 200=ID 1000=msdelay > } > else if (nIDEvent = 200) **** This code shows real beginner qualities. Also, I would think you would want to use == here, instead of an embedded assignment. And you would want to use a #define or const int to define the value. Turn on /W4 for your builds. In fact, you should never build with less than /W4. Any warnings you get will require repair, and that is how it should be. **** > { > CWnd *Parent = GetParent(); > if (Parent) **** It is clearer if you write if(Parent != NULL) but why are you wasting time with this test? This is a child control; it cannot exist without having a parent! Therefore, GetParent cannot return NULL. And since returning NULL would indicate a very deep and serious error, where is the ASSERT(Parent != NULL); that should be here? **** > { > //send the BN_CLICK Message to the parent > Parent->SendMessage(WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(),BN_CLICKED),(LPARAM)m_hWnd); > } > } > CButton::OnTimer(nIDEvent); >} > Joseph M. Newcomer [MVP] email: newcomer(a)flounder.com Web: http://www.flounder.com MVP Tips: http://www.flounder.com/mvp_tips.htm |