15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Getting Accelerator table from View

Colin Angus Mackay -- colin.angus.mackay@dial.pipex.com
Saturday, November 16, 1996

Environment: Win95, NT3.51, NT4.0, VC++ 4.1

I have a (possibly) very lengthy draw process in the app that I am
developing and I wish to be able to stop it by letting the user press
the space bar. I have set up in the accelerator table an ID_STOP_DRAWING
for the spacebar. I am however having trouble catching this message.

>From what I can see I need to get a handle to the Accelerator table from
the view. The following is the code I have (but I don't know how to get
hAccel), it is in a function that is called periodically from the
drawing functions to check whether it should continue or not.


	if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
	{
		if (!::TranslateAccelerator(pWnd->hWnd, hAccel, &msg))
		{
			::TranslateMessage(&msg);
			::DispatchMessage(&msg);
		}
	}


How do I get the handle to the Accelerator table that my view uses
(IDR_MAINFRAME)? Or I am going about this the wrong way?

If any one can help, I'd be mose grateful,

Colin Mackay.



GoroKhM1 -- gorokhm1@SMTP.ATG-NET.COM
Monday, November 18, 1996

[Mini-digest: 3 responses]

The articles below work with accelerator table. It may help you.

  // Q117500 Using Accelerators with an MFC Modeless Dialog Box
  // Q100770 Accelerator Keys When Modal Dialog Box Main Window

-mg

MarkG@usa.net

-----From: kevin@earth.pln.com.tw (Kevin Tarn)

Why didn't you try to capture the space bar pressed by overrding PreTranslateMessage ?

BOOL CMyView::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	switch (pMsg->message)
   {
	    case WM_KEYDOWN:
		 {
			if (pMsg->wParam == VK_SPACE)
			{
				OnKeyDown(pMsg->wParam, LOWORD(pMsg 
					->lParam), HIWORD(pMsg->lParam));
				return TRUE;
			}
			else return CView:: PreTranslateMessage(pMsg);
			break;
		}
		default:
			return CView:: PreTranslateMessage(pMsg);
    }
}


Kevin Tarn
kevin@pln.com.tw
----------

>Environment: Win95, NT3.51, NT4.0, VC++ 4.1

>I have a (possibly) very lengthy draw process in the app that I am
>developing and I wish to be able to stop it by letting the user press
>the space bar. I have set up in the accelerator table an ID_STOP_DRAWING
>for the spacebar. I am however having trouble catching this message.

>>From what I can see I need to get a handle to the Accelerator table from
>the view. The following is the code I have (but I don't know how to get
>hAccel), it is in a function that is called periodically from the
>drawing functions to check whether it should continue or not.


>	if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
>	{
>		if (!::TranslateAccelerator(pWnd->hWnd, hAccel, &msg))
>		{
>			::TranslateMessage(&msg);
>			::DispatchMessage(&msg);
>		}
>	}


>ow do I get the handle to the Accelerator table that my view uses
>IDR_MAINFRAME)? Or I am going about this the wrong way?

>f any one can help, I'd be mose grateful,

>Colin Mackay.

-----From: Dave_Rabbers@Quinton-Eng.CCMAIL.CompuServe.COM

Can your draw process run at Idle processing time?  If you stick in an 
OnIdle routine (in your CWinApp), and do a little drawing work within 
each call, your stop drawing command can make its way through the 
normal MFC command routing mechanism.  The only trick is to design a 
mechanism to get CWinApp OnIdle calls passed to the CView objects that 
need them, but this is not very difficult to do.





| Вернуться в корень Архива |