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

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


Использование Esc для отмены drag'n'drop

Все просто, как 123*34: перехват сообщения WM_KEYDOWN в виртуальном методе PreTranslateMessage(). Надо только сделать еще одну вещь, чтобы это работало на 100%: вызвать SetFocus() в Вашем обработчике WM_LBUTTONDOWN. Если дерево не имеет фокуса когда начинается операция drag'n'drop, оно вообще не получает фокуса и сообщение WM_KEYDOWN не приходит:


BOOL CTreeCtrlX::PreTranslateMessage(MSG* pMsg)
{
	if( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE 
					&& m_bLDragging)
	{
		m_bLDragging = 0;
		CImageList::DragLeave(NULL);
		CImageList::EndDrag();
		ReleaseCapture();
		SelectDropTarget(NULL);
		delete m_pDragImage;
		return TRUE;	
	}

	return CTreeCtrl::PreTranslateMessage(pMsg);
}

 

Источник: ProtoSphere