| Автор | Сообщение |
|
|
| |
Пост N: 8206
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.11.25 14:58. Заголовок: Картинку в буфер
Есть у кого то примерчик как запихать картинку в буфер обмена на Harbour ? Картинка предварительно живет на диске.
|
 |

|
|
Ответов - 5
[только новые]
|
|
|
|
| постоянный участник
|
Пост N: 8120
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.11.25 16:18. Заголовок: Есть вот это - Copy..
Есть вот это - Copy2Clipboard(OEMTOANSI(cTemp0)) #pragma BEGINDUMP #define HB_OS_WIN_32_USED #define _WIN32_WINNT 0x0400 #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" HB_FUNC ( COPY2CLIPBOARD ) { HGLOBAL hglbCopy; char * lptstrCopy; char * cStr = hb_parc( 1 ); int nLen = strlen( cStr ); if ( !OpenClipboard( GetActiveWindow() ) ) return; EmptyClipboard(); hglbCopy = GlobalAlloc( GMEM_DDESHARE, (nLen+1) * sizeof(TCHAR) ); if (hglbCopy == NULL) { CloseClipboard(); return; } // Lock the handle and copy the text to the buffer. lptstrCopy = (char*) GlobalLock( hglbCopy ); memcpy( lptstrCopy, cStr, nLen * sizeof(TCHAR)); lptstrCopy[nLen] = (TCHAR) 0; // null character GlobalUnlock(hglbCopy); // Place the handle on the clipboard. SetClipboardData( CF_TEXT, hglbCopy ); CloseClipboard(); } // ------ Buffer Windows to string Memory ----------------------- HB_FUNC ( RETRIVETEXTFROMCLIPBOARD ) { if ( !OpenClipboard( GetActiveWindow() ) ) return; hb_retc(GetClipboardData( CF_TEXT )); CloseClipboard(); } #pragma ENDDUMP
|
 |

|
|
|
| |
Пост N: 373
Зарегистрирован: 05.10.06
|
|
Отправлено: 26.11.25 16:26. Заголовок: Можно спросить ИИ, н..
Можно спросить ИИ, например Алиса выдает такое решение: Пример кода (Harbour + встроенный C++) Скрытый текст #pragma BEGINDDL #include <windows.h> // Функция, которая помещает HBITMAP в буфер обмена HBFUNC( PUTBITMAPTOCLIPBOARD ) { HB_SYMBOLUNUSED( 0 ); // подавляем предупреждение о неиспользованном параметре // Получаем HBITMAP из параметра (предполагаем, что передали дескриптор bitmap) HB_HANDLE hBitmap = (HB_HANDLE)hb_parv(1); if (!hBitmap) return; // Открываем буфер обмена if (!OpenClipboard(NULL)) return; // Очищаем текущее содержимое EmptyClipboard(); // Помещаем bitmap в буфер (CF_BITMAP — стандартный формат для изображений) if (!SetClipboardData(CF_BITMAP, hBitmap)) { // Если ошибка — закрываем и выходим CloseClipboard(); return; } // Успешно поместили, закрываем буфер CloseClipboard(); } #pragma ENDDDL Как это использовать в Harbour Скомпилируйте DLL (или статическую библиотеку) с приведённым выше кодом. Например, назовите её clipbmp.dll. Подключите DLL в Harbour‑программе: harbour LIBRARY clipbmp Получите HBITMAP (дескриптор bitmap). Это может быть: bitmap, созданный через GDI (CreateCompatibleBitmap, LoadImage и т. п.); bitmap из контрола или другого источника. Передайте HBITMAP в функцию: harbour PUTBITMAPTOCLIPBOARD( hBitmap ) // hBitmap — дескриптор вашего bitmap Важные замечания HBITMAP должен быть глобальным (не локальным стеком). Если вы создаёте bitmap в C++, убедитесь, что он выделен через GlobalAlloc или GDI‑функции, которые возвращают «глобальный» дескриптор. Не освобождайте HBITMAP после SetClipboardData — Windows берёт на себя владение дескриптором. Если вы освободите его вручную, буфер обмена будет содержать недействительный указатель. Проверка ошибок (как в примере) обязательна для надёжности. Формат CF_BITMAP — стандартный для несжатых bitmap‑изображений в Windows. Если нужно сохранить PNG/JPEG, потребуется конвертация или использование других форматов (например, CF_DIB). Альтернатива: CF_DIB (Device-Independent Bitmap) Если нужно поместить bitmap в буфер без привязки к текущему устройству (более универсально), используйте формат CF_DIB: c++ // Вместо CF_BITMAP: SetClipboardData(CF_DIB, dibHandle); Но тогда dibHandle должен быть указателем на структуру BITMAPINFO + пиксельные данные (в формате DIB). Это сложнее, но даёт кросс‑устройство совместимость. Итог: Создайте/получите HBITMAP. Вызовите PUTBITMAPTOCLIPBOARD(hBitmap) из Harbour. Windows поместит изображение в буфер обмена — его можно вставить в Paint, Word и т. д.
|
|
 |

|
|
|
| |
Пост N: 374
Зарегистрирован: 05.10.06
|
|
Отправлено: 26.11.25 16:33. Заголовок: Andrey пишет: SetCl..
Andrey пишет: | цитата: | | SetClipboardData( CF_TEXT |
| тут текст помещают
|
 |

|
|
|
| |
Пост N: 8207
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.11.25 16:43. Заголовок: MIKHAIL я тебя поня..
MIKHAIL я тебя понял, спасибо. погуглю пожалуй
|
 |

|
|
|
| |
Пост N: 8208
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.11.25 19:00. Заголовок: Покопал чуток Минигу..
Покопал чуток Минигуи. Есть там примерчик :\MiniGUI\SAMPLES\Advanced\VIEW_IMAGE\ С чистым Harbour работает на ура, сырец брал BITMAP.PRG, весь код 2 строки ? hb:=BMP_LOAD_FILE(Hb_dirbase()+"logo.bmp") BMP_PUT_CLIPBOARD(hb) Но работает только с BMP. Покопал BosTaurus , там тоже есть такая возможность и работает не только с BMP, дернуть в чистую это под Harbour пока не получилось, но пробую 
|
 |

|
|