Проблема с CEdit - не получаю Ctrl+C
От: dalen  
Дата: 29.11.11 09:53
Оценка:
Добрый день!

В чем проблема: не работают сочетания 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);
};
Re: Проблема с CEdit - не получаю Ctrl+C
От: trop Россия  
Дата: 04.01.12 18:22
Оценка:
Здравствуйте, 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;
  }
-
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.