http://tikitak.narod.ru ---- Главная страница сайта
Шаг 16 - Класс буфера клавиатуры
Создание проекта
Дополняем Step1.
Создадим другим методом. Как отдельные файлы CPP и H. Для этого перейдите в окно Class View и нажмите правую клавишу мышки, затем New Class.
Появиться диалоговое окно. Заполняем его.
Внизу можно указать класс отца, но он нам не нужен.
Создаем код
Удалите весь код из MyClip.H и впишите следующее
class CMyClip
{
public:
CMyClip();
virtual ~CMyClip();
void CopyText(CString test);
CString GetText();
};
Тоже самое для MyClip.cpp
#include "afxwin.h"
#include "MyClip.h"
CMyClip::CMyClip()
{
}
CMyClip::~CMyClip()
{
}
CString CMyClip::GetText()
{
char * buffer;
if(AfxGetMainWnd()->OpenClipboard())
{
buffer = (char*)GetClipboardData(CF_TEXT);
CloseClipboard();
return buffer;
}
return "";
}
void CMyClip::CopyText(CString test)
{
if (AfxGetMainWnd()->OpenClipboard())
{
if (EmptyClipboard())
{
HGLOBAL clipbuffer;
char * buffer;
clipbuffer = GlobalAlloc(GMEM_DDESHARE, test.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(test));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
if (!CloseClipboard()) AfxMessageBox("Error Close");
} else AfxMessageBox("Error Empty");
} else AfxMessageBox("Error Open");
}
В Step1 необходимо создать реакцию на нажатие кнопки
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
..........
ON_BN_CLICKED(IDC_MYBUTTON,OnCopyBuffer)
..............
END_MESSAGE_MAP()
Обьявите класс буфера и процедуру реакции
class CMainWnd : public CFrameWnd
{
public:
...........
void OnCopyBuffer();
............
private:
............
CMyClip clip;
............
};
И реализацию реакции
void CMainWnd::OnCopyBuffer()
{
clip.CopyText("Hello My Text");
}
Реакцию на двойное нажатие правой кнопки мыши изменяем.
void CMainWnd::OnRButtonDblClk( UINT, CPoint )
{
AfxMessageBox(clip.GetText());
}
Описание
Начнем того как собрать проект. Откройте файл MyClip.cpp и откомпилируйте его.
А теперь Step1.cpp С ним нужно поступить также. Потом проект нужно собрать - Build - Build. И только после этого запустить.
В обьявлении класса ничего нового. А вот в реализации CPP мы подключили стандартную библиотеку MFC для доступа к функциям и подключили файл с описаним класса. Ведь данный файл будет отдельным обьектным файлом obj и ему необходим доступ к библиотекам.
Смотрим функцию CopyText нам для работы необходимо открыть буфер. Но для этого необходим указатель на наше окно. Вот мы его и получаем OpenClipboard(), буфер открыть можно не всегда поэтому эта функция BOOL.
Дальше мы очишаем буфер и заводим две переменные. Буфер как видите очистить тоже можно не всегда.
HGLOBAL - это указатель на переменную , но не простую, а на глобальную. К ней доступ будет из любого места памяти (из любой программы), ведь это же буфер обмена , правда?
Дальше для этого буфера выделяем память, по размеру как переданная строка+1 и с атрибутом GMEM_DDESHARE, что говорит про то, что мы не жадные и разрешаем к ней доступ.
После этого мы блокируем память для копирования. Ведь у нас многозадачная среда, и если в момент копирования кто-то потянет руки к памяти будет нехорошо. Одновременно приравнивая указатель с локальным buffer.
Теперь будет копировать.
После копирования необходимо память разблокировать. И только потом установить в буфер текст, еще и указав тип. Ведь в буфере могут быть данные любого типа TEXT,RTF,BMP,WMF,OLE и т.д.
После всех операций буфер нужно закрыть.
Функция GetText получает данные, методика похожа за исключением функции GetClipboardData с указанием типа получаемой информации.
Реакция на нажатие кнопки производится через макрос ON_BN_CLICKED, где указывается идентификатор и необходимая функция. Почему идентификатор, а если кнопка не одна ?
В функции реакции просто отправка текста в буфер.
По двойному шелчку просто вывести содержимое буфера.
Теперь пробуем. Запустите блокнот NotePad. Запустите вашу программу. Введите в блокноте слово и скопируйте его в буфер. Перейдите в программу и шелкните правой кнопкой мыши. Вы увидите содержимое буфера. Нажмите нашу кнопку и опять шелкните правой кнопкой мыши. Вы увидете наш текст Hello My Text. Можете его вставить в окно редактирования или блокнот. Всё работает !!!
Шпаргалка
Откройте буфер.
if (AfxGetMainWnd()->OpenClipboard())
{
........
Очистите
EmptyClipboard();
Выделите глобальную память и скопируте туда строку.
HGLOBAL clipbuffer;
char * buffer;
clipbuffer = GlobalAlloc(GMEM_DDESHARE, test.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(test));
GlobalUnlock(clipbuffer);
Установите данные
SetClipboardData(CF_TEXT,clipbuffer);
Закройте буфер.
CloseClipboard();
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|