Добрый день!
В чем проблема: не работают сочетания Ctrl+C, Ctrl+INS — при проверке они не доходят до OnKey/OnChar в CEditBox, хотя Spy++ показывает, что сообщения посылаются! Вопрос — что подкрутить, чтобы заработало?
Как сделано. Есть вот такой фрейм:
class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>,
public CMessageFilter, public CIdleHandler
{
public:
DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)
CMainFrame() : m_view(this) {}
CMyView m_view;
В CMyView cоздается дочерний контрол:
LRESULT CMyView::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
pClose1 = new CSelection(false);
pClose1->Create(*this,CRect(10,10,10+CELLSIZE*13+1,10+CELLSIZE*14+1),NULL,WS_VISIBLE|WS_CHILD);
pClose1->ShowWindow(SW_SHOW);
Дочерний контрол создает, в свою очередь, CEditBox:
class CSelection :
public CWindowImpl<CSelection>
{
public:
DECLARE_WND_CLASS(NULL)
BEGIN_MSG_MAP(CSelection)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLClick)
MESSAGE_HANDLER(WM_RBUTTONDOWN, OnRClick)
CHAIN_COMMANDS_ALT_MEMBER(cEdit,1);
END_MSG_MAP()
......
private:
CEditBox cEdit;
};
LRESULT CSelection::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CRect rcClient;
GetClientRect(&rcClient);
const int step=(rcClient.Width()-1)/13;
cEdit.Create(*this,CRect(rcClient.Width()-(rcClient.Width()*3)/4,13*step,rcClient.Width(),14*step),NULL,ES_READONLY | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER);
cEdit.ShowWindow(SW_SHOW);
return 0;
}
Дочерний CEditBox описан так:
class CEditBox :
public CWindowImpl<CEditBox, CEdit>, public CEditCommands<CEditBox>
{
public:
DECLARE_WND_SUPERCLASS(NULL, CEdit::GetWndClassName())
BEGIN_MSG_MAP(CEditBox)
MESSAGE_HANDLER(WM_KEYDOWN,OnKey)
MESSAGE_HANDLER(WM_CHAR,OnChar)
ALT_MSG_MAP(1)
CHAIN_MSG_MAP_ALT(CEditCommands<CEditBox>, 1)
END_MSG_MAP()
LRESULT OnKey(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled);
LRESULT OnChar(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled);
};
Здравствуйте, dalen, Вы писали:
D>Добрый день!
D>В чем проблема: не работают сочетания Ctrl+C, Ctrl+INS — при проверке они не доходят до OnKey/OnChar в CEditBox, хотя Spy++ показывает, что сообщения посылаются! Вопрос — что подкрутить, чтобы заработало?
main.rc
// Accelerator
IDR_EDIT_ACCEL ACCELERATORS
BEGIN
"C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT, NOINVERT
"X", ID_EDIT_CUT, VIRTKEY, CONTROL, NOINVERT
"V", ID_EDIT_PASTE, VIRTKEY, CONTROL, NOINVERT
VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT, NOINVERT
VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT, NOINVERT
"Z", ID_EDIT_UNDO, VIRTKEY, CONTROL, NOINVERT
END
resource.h
#define IDR_EDIT_ACCEL 204
class CInEdit : public CWindowImpl<CInEdit, CEditT<CWindow> >
BOOL
PreTranslateMessage(MSG* pMsg)
{
if (!m_hAccel)
m_hAccel = ::LoadAccelerators(_Module.GetModuleInstance(),
MAKEINTRESOURCE(IDR_EDIT_ACCEL));
if (m_hAccel && ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
return TRUE;
return FALSE;
}