Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ClipBoard через MFC 
V
    Опции темы
ShurikA
Дата 13.8.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Пытаюсь записать картинку в ClipBoard ц помощью классов MFC, вот таким образом:
Код

void CChildView::OnEditCopy()
{
    COleDataSource* pData = new COleDataSource;

    LPSTGMEDIUM pIData;

    pIData->tymed = TYMED_HGLOBAL;
    pIData->hBitmap = this->imgOriginal.Detach();

    pData->CacheData(CF_BITMAP, pIData);
    pData->SetClipboard();

    this->imgOriginal.Attach(pIData->hBitmap);
}


во первых дебагер на меня ругается что пользую pIData  без инициализации  smile 

а во вторых: на правильном ли я пути?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
0x07L
Дата 13.8.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 1
Всего: 5



Извини, конечно, но память под pIData все-таки надо выделить  smile 
PM MAIL   Вверх
ShurikA
Дата 13.8.2006, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



А разве обьявлением переменной я не выделяю память?

Добавлено @ 10:18 
Ладно, эту проблемму я решил.
Теперь он вроде как копирует дату, но при попытке вставить её на пример в  MS Paint вылетает ошибка вот в етой функцие:
AFX_STATIC HGLOBAL AFXAPI _AfxCopyGlobalMemory(HGLOBAL hDest, HGLOBAL hSource)



--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 13.8.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Так, есть продолжение:
поменял TYMED_HGLOBAL на TYMED_GDI, стало копировать картинку правилных размеров, но на кастинке неопределённый бардак.  smile

Добавлено @ 10:38 
и при этом, если я хочу скопировать ещё раз уже вылетает ошибка в COleDataSource::Empty() ???


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
0x07L
Дата 13.8.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 1
Всего: 5



К сожалению, я не успел еще поработать с буфером обмена в MFC. Использовал его только через API. Могу предположить, что здесь тоже необходима возня с хендлами, как в WinAPI. Для того чтобы копировать текст, мне приходилось:

1) выделить нужное количество памяти через GlobalAlloc (обязательно!) и получить HGLOBAL
2) вызвать GlobalLock и получить "нормальный" хендл
3) записать по хендлу текст
4) вызвать GlobalUnlock
5) вызвать SetClipboardData()

Скорее всего, у тебя проблема не из-за этого. Тем более, у тебя вроде HBITMAP, а не HGLOBAL. Возможно, проблема из-за того, что ты не открываешь буфер обмена перед записью в него. Хотя, может быть, pData->SetClipboard() делает это, но не уверен. Может быть, тебе нужно

1) вызвать OpenClipboard() и проверить возвращенное значение
2) вызвать EmptyClipboard()
3) здесь сделать то, что написано в твоем посте
4) вызвать CloseClipboard()

Еще проблемка может быть в том, что (MSDN) After the call to CacheData the ptd member of lpFormatEtc and the contents of lpStgMedium are owned by the data object, not by the caller. Возможно, тебе нельзя использовать хендл картинки после вызова CacheData(). Копировать ее, что ли?

Повторяю, в данном вопросе я абсолютно некомпетентен. В первую очередь, попробуй добавить OpenClipboard() ... CloseClipboard(). Во вторую - копируй картинку. В третью - добавь GlobalAlloc. В четвертую - жди, пока тебе не ответит кто-нибудь поопытнее.

Это сообщение отредактировал(а) 0x07L - 13.8.2006, 11:06
PM MAIL   Вверх
ShurikA
Дата 13.8.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Сделал вот так:
Код

void CChildView::OnEditCopy()
{
    COleDataSource* pData = new COleDataSource;

    STGMEDIUM pIData;

    pIData.tymed = TYMED_GDI;
    pIData.hBitmap = this->imgOriginal.Detach();

    HANDLE hDst;
    hDst = ::OleDuplicateData(pIData.hBitmap, CF_BITMAP, NULL);

    this->imgOriginal.Attach(pIData.hBitmap);
    pIData.hBitmap = (HBITMAP)hDst;

    pData->CacheData(CF_BITMAP, &pIData);
    pData->SetClipboard();    
}

и ничего не поменялось...


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 14.8.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



неужели никто не знает?  smile 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.