Здраствуйте!
Заранее прошу прощения за простой вопрос, но все-таки...
Есть список указателей (CObList). Используются указатели на 3 класса, потомки общего базового (не CObject).
Надо скажем парочку из экземпляров (разного размера) засунуть в буфер. Ф-ии SetClipboardData нужен хэндл. Память я выделяю с помощью
GlobalAlloc. Но КАК туда последовательно записывать объекты?!
Заранее спасибо.
Здравствуйте kl, Вы писали:
kl>Здраствуйте! kl>Заранее прошу прощения за простой вопрос, но все-таки... kl>Есть список указателей (CObList). Используются указатели на 3 класса, потомки общего базового (не CObject). kl>Надо скажем парочку из экземпляров (разного размера) засунуть в буфер. Ф-ии SetClipboardData нужен хэндл. Память я выделяю с помощью kl>GlobalAlloc. Но КАК туда последовательно записывать объекты?! kl>Заранее спасибо.
Вопрос, кстати, не такой уж простой. По крайней мере не имеет общего решения. Тебе придется свою структуру описывать и ее передавать в буфер обмена Windows, а также свой формат зарегистрировать (см RegisterClipboardFormat).
Насчет записи: если ты на MFC пишешь, то проще всего через CMemFile, а если на Win32 API — см. реализацию CMemFile, она довольно простая.
Опять-же, если ты MFC юзаешь, проще будет через COleDataSource и IStream все сделать.
Re[2]: Как засунуть кое-что в Clipboard? (новичок)
Здравствуйте Андрей, Вы писали:
А>Вопрос, кстати, не такой уж простой. По крайней мере не имеет общего решения. Тебе придется свою структуру описывать и ее передавать в буфер обмена Windows, а также свой формат зарегистрировать (см RegisterClipboardFormat). А>Насчет записи: если ты на MFC пишешь, то проще всего через CMemFile, а если на Win32 API — см. реализацию CMemFile, она довольно простая. А>Опять-же, если ты MFC юзаешь, проще будет через COleDataSource и IStream все сделать.
Насчет регистрирования то все прозрачно...
Кстати, а зачем COleDataSource, чем SetClipboardData хуже? И то и то принимает HGLOBAL, а никакие drag & drop мне не нужны.
А вот про CMemFile я и забыл, но ты уверен что он нормально себя чуствует с блоком, выделенным GlobalAlloc?
Спасибо за ответ!
no fate but what we make
Re[3]: Как засунуть кое-что в Clipboard? (новичок)
Здравствуйте kl, Вы писали:
kl>Насчет регистрирования то все прозрачно... kl>Кстати, а зачем COleDataSource, чем SetClipboardData хуже? И то и то принимает HGLOBAL, а никакие drag & drop мне не нужны.
COleDataSource нужен, чтобы использовать IStream — его же можно будет в Clipboard потом запихать и HGLOBAL тебе нафиг не нужен будет, а drag&drop здесь ни при чем.
kl>А вот про CMemFile я и забыл, но ты уверен что он нормально себя чуствует с блоком, выделенным GlobalAlloc?
Очень даже нормально, если правильно использовать. А лучше даже CSharedFile использовать — создаешь его, пишешь как в обычный файл, затем делаешь Detach — и получаешь готовый HGLOBAL, то есть GlobalAlloc тебе явно использовать не надо.
kl>Спасибо за ответ!
Всегда пожалуйста.
Re[4]: Как засунуть кое-что в Clipboard? (новичок)
Здравствуйте Андрей, Вы писали:
А>Здравствуйте kl, Вы писали:
kl>>Насчет регистрирования то все прозрачно... kl>>Кстати, а зачем COleDataSource, чем SetClipboardData хуже? И то и то принимает HGLOBAL, а никакие drag & drop мне не нужны. А>COleDataSource нужен, чтобы использовать IStream — его же можно будет в Clipboard потом запихать и HGLOBAL тебе нафиг не нужен будет, а drag&drop здесь ни при чем.
kl>>А вот про CMemFile я и забыл, но ты уверен что он нормально себя чуствует с блоком, выделенным GlobalAlloc? А>Очень даже нормально, если правильно использовать. А лучше даже CSharedFile использовать — создаешь его, пишешь как в обычный файл, затем делаешь Detach — и получаешь готовый HGLOBAL, то есть GlobalAlloc тебе явно использовать не надо.
kl>>Спасибо за ответ! А>Всегда пожалуйста.
Насчет CSharedFile ясно, но чего то я не догоняю насчет того, что "HGLOBAL нафиг не нужен".
Stream то я создаю через CreateStreamOnHGlobal (может не так надо??) , поэтому хэндл все равно у меня есть. Поэтому вместо COleDataObject::Attach, COleDataSource::SetClipboard, я использую SetClipboardData. Мне кажется так эффективнее, может я чего то не понимаю?
no fate but what we make
Re[5]: Как засунуть кое-что в Clipboard? (новичок)
Здравствуйте kl, Вы писали:
kl>Здравствуйте Андрей, Вы писали:
А>>Здравствуйте kl, Вы писали:
kl>>>Насчет регистрирования то все прозрачно... kl>>>Кстати, а зачем COleDataSource, чем SetClipboardData хуже? И то и то принимает HGLOBAL, а никакие drag & drop мне не нужны. А>>COleDataSource нужен, чтобы использовать IStream — его же можно будет в Clipboard потом запихать и HGLOBAL тебе нафиг не нужен будет, а drag&drop здесь ни при чем.
kl>>>А вот про CMemFile я и забыл, но ты уверен что он нормально себя чуствует с блоком, выделенным GlobalAlloc? А>>Очень даже нормально, если правильно использовать. А лучше даже CSharedFile использовать — создаешь его, пишешь как в обычный файл, затем делаешь Detach — и получаешь готовый HGLOBAL, то есть GlobalAlloc тебе явно использовать не надо.
kl>>>Спасибо за ответ! А>>Всегда пожалуйста.
kl>Насчет CSharedFile ясно, но чего то я не догоняю насчет того, что "HGLOBAL нафиг не нужен". kl>Stream то я создаю через CreateStreamOnHGlobal (может не так надо??) , поэтому хэндл все равно у меня есть. Поэтому вместо COleDataObject::Attach, COleDataSource::SetClipboard, я использую SetClipboardData. Мне кажется так эффективнее, может я чего то не понимаю?
Я могу ошибаться, но по-моему, CreateStreamOnHGlobal нужна, чтобы получить IStream, который можно передать в Clipboard, а не наоборот.
IStream в Clipboard ты с помощью Win32API не передашь. Хотя, может быть и будет работать с HGLOBAL — я не проверял. Но как-то это все вычурно получается, проще через CSharedFile.
Re[6]: Как засунуть кое-что в Clipboard? (новичок)