www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
  http://tikitak.narod.ru ---- Главная страница сайта

Шаг 16 - Класс буфера клавиатуры

Создание проекта

Дополняем Step1.

Создадим другим методом. Как отдельные файлы CPP и H. Для этого перейдите в окно Class View и нажмите правую клавишу мышки, затем New Class.

Появиться диалоговое окно. Заполняем его.

step16.gif (2516b)

Внизу можно указать класс отца, но он нам не нужен.

Создаем код

Удалите весь код из 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
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz