...
m_menu.LoadMenu(IDR_MENU1);
...
Контекстное меню.
Как в диалоговое окно добавить контекстное меню, как в notepade?
Цитата: nuhop
Как в диалоговое окно добавить контекстное меню, как в notepade?
1.Создаешь в Resource View меню,какое тебе надо.
2.Добавляешь в класс диалога 2 переменные CPoint point и CMenu m_menu.Делаешь их private.
3.В ф-ии OnInitDialog дописываешь
Код:
Это загрузка меню из ресурсов.
3.В Messages класса диалога добаляешь ф-ию
Код:
OnContextMenu
Код:
void CcontextDlg::OnContextMenu(CWnd* /*pWnd*/, CPoint cp)
{
point.x=cp.x;
point.y=cp.y;
m_menu.GetSubMenu(0)->TrackPopupMenu(IDR_MENU1 ,point.x,point.y,this);
}
{
point.x=cp.x;
point.y=cp.y;
m_menu.GetSubMenu(0)->TrackPopupMenu(IDR_MENU1 ,point.x,point.y,this);
}
Теперь щелкая правую кнопку мыши на диалоге вызывашь твое контекстное меню.
Попробую разобраться.
Когда делаю, как ниже, то не работает.
В карте сообщений:
Код:
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
Cама функция:
Код:
void MyDlg::OnEditCopy()
{
ob_copy.Copy(); // Объект создан ранее - CEdit ob_copy;
}
{
ob_copy.Copy(); // Объект создан ранее - CEdit ob_copy;
}
Как правильно пользоваться этими CEdit Clipboard Operations?
void Clear( );
// Удаляет выделенный текст, если он существует.
void Copy( );
// Копируем выделенный текст, если он существует, в буфер обмена.
void Cut( );
// Вырезает выделенный текст в текстовом поле и копирует его в
// буфер обмена.
void Paste( );
// Вставляет данные из буфера обмена в текстовое поле в текущую позицию курсора.
BOOL Undo( );
// Отменяет последнюю операцию, произведенную в текстовом поле.
BOOL CanUndo( );
// Позволяет определить возможно ли отменить последнюю операцию в
// текстовом поле (в этом случае возвращает истину).
void EmpryUndoBuffer( );
// Производит сброс флага отмены последней операции
Мне бы пример с Copy или Paste. :)
Код:
void MyDlg::OnEditCopy()
{
CString str;
CEdit m_edit; // Это к примеру
m_edit.GetSel();
m_edit.GetWindowText(str);
if (OpenClipboard())
{
HGLOBAL cpbuf;
char *buf;
EmptyClipboard();
cpbuf = GlobalAlloc(GMEM_DDESHARE, str.GetLength()+1);
buf = (char*) GlobalLock(cpbuf);
strcpy(buf, LPCSTR(str));
GlobalUnlock(cpbuf);
SetClipboardData(CF_TEXT, cpbuf);
CloseClipboard();
}
}
{
CString str;
CEdit m_edit; // Это к примеру
m_edit.GetSel();
m_edit.GetWindowText(str);
if (OpenClipboard())
{
HGLOBAL cpbuf;
char *buf;
EmptyClipboard();
cpbuf = GlobalAlloc(GMEM_DDESHARE, str.GetLength()+1);
buf = (char*) GlobalLock(cpbuf);
strcpy(buf, LPCSTR(str));
GlobalUnlock(cpbuf);
SetClipboardData(CF_TEXT, cpbuf);
CloseClipboard();
}
}
Здесь падаю:
Код:
// AFXWIN2.INL
_AFXWIN_INLINE DWORD CEdit::GetSel() const
{ ASSERT(::IsWindow(m_hWnd)); return ::SendMessage(m_hWnd, EM_GETSEL, 0, 0); }
_AFXWIN_INLINE DWORD CEdit::GetSel() const
{ ASSERT(::IsWindow(m_hWnd)); return ::SendMessage(m_hWnd, EM_GETSEL, 0, 0); }
Почему падаю?
Цитата: nuhop
Код:
...
Код:
void MyDlg::OnEditCopy()
{
CString str;
CEdit m_edit; // Это к примеру
m_edit.GetSel();
m_edit.GetWindowText(str);
if (OpenClipboard())
{
HGLOBAL cpbuf;
char *buf;
EmptyClipboard();
cpbuf = GlobalAlloc(GMEM_DDESHARE, str.GetLength()+1);
buf = (char*) GlobalLock(cpbuf);
strcpy(buf, LPCSTR(str));
GlobalUnlock(cpbuf);
SetClipboardData(CF_TEXT, cpbuf);
CloseClipboard();
}
}
{
CString str;
CEdit m_edit; // Это к примеру
m_edit.GetSel();
m_edit.GetWindowText(str);
if (OpenClipboard())
{
HGLOBAL cpbuf;
char *buf;
EmptyClipboard();
cpbuf = GlobalAlloc(GMEM_DDESHARE, str.GetLength()+1);
buf = (char*) GlobalLock(cpbuf);
strcpy(buf, LPCSTR(str));
GlobalUnlock(cpbuf);
SetClipboardData(CF_TEXT, cpbuf);
CloseClipboard();
}
}
...
Что делает эта функция ? Что за переменная CEdit m_edit ? m_edit - должна быть контрол-переменная,а у тебя она локальная переменная
типа Edit и все,как она выделяет и считывает текст из определенного
текстового поля,как она с текст.полем связана ? Никак.
Что вообще надо делать ? Копировать содержимое текстового поля в буфер ?
Допустим есть текстовое поле и контрол-переменная CEdit edit.
Набираю в текстовом поле текст,выделяю какую то его часть.
Код:
...
edit.Copy();
...
edit.Copy();
...
запишет в буфер выделенный текст.Если его надо перенести в какое то
другое поле,то контрол переменная второго поля вставит выделенный
текст.
Код:
...
edit2.Paste();
...
edit2.Paste();
...
m_Valery, спасибо. Полностью согласен с замечаниями. Мне надо было в ::DoDataExchange определить переменную типа control. Тогда действительно все работает.