forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   CBuilder и буфер обмена (http://forum.boolean.name/showthread.php?t=16068)

Mick 21.12.2011 12:49

CBuilder и буфер обмена
 
Добрый день.
Может кто-нибудь подскажет, как увязать CBuilder и буфер обмена.
Если поконкретнее, то проблема в следующем:
устанавливаю свою программу в цепочку слежения за буфером обмена, а вот дальше непонятно, как получить сообщение об изменении содержимого буфера. В VisualC сообщение WM_DRAWCLIPBOARD перехватывается явно, а вот где в билдере это сделать непонятно. Да и вообще, как в билдере можно обработать сообщения Windows, отличные от стандартных эвентов компонент?

pozitiffcat 21.12.2011 14:55

Ответ: CBuilder и буфер обмена
 
TApplicationEvents компонент
Код:

void __fastcall TMainForm::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
 {
  switch (Msg.message)
  {
    case WM_NCLBUTTONUP:
      Handled = true;
    break;
    case WM_NCLBUTTONDOWN:
      Handled = true;
    break;
    case WM_NCMOUSEMOVE:
      Handled = true;
    break;


Mick 28.12.2011 01:05

Ответ: CBuilder и буфер обмена
 
Спасибо, но...
Делаю так:
Код:

...
next_wiever = SetClipboardViewer(Handle);//устанавливаю свое окно в цепочку слежения за буфером обмена
...

и далее
Код:

void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{

  switch (Msg.message)
  {
    case WM_DRAWCLIPBOARD:    MessageBox(0,"WM_DRAWCLIPBOARD","  ",MB_OK);//просто вывести сообщение если в буфер что-то скопировано
      Handled = true;
  break;
  }
}
...

В результате - ничего.
Причем установка в цепочку происходит, указатель ненулевой, а вот на изменение содержимого нет реакции.

pozitiffcat 28.12.2011 09:20

Ответ: CBuilder и буфер обмена
 
Цитата:

Сообщение от Mick (Сообщение 215484)
Спасибо, но...
Делаю так:
Код:

...
next_wiever = SetClipboardViewer(Handle);//устанавливаю свое окно в цепочку слежения за буфером обмена
...

и далее
Код:

void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{

  switch (Msg.message)
  {
    case WM_DRAWCLIPBOARD:    MessageBox(0,"WM_DRAWCLIPBOARD","  ",MB_OK);//просто вывести сообщение если в буфер что-то скопировано
      Handled = true;
  break;
  }
}
...

В результате - ничего.
Причем установка в цепочку происходит, указатель ненулевой, а вот на изменение содержимого нет реакции.

как то так
Код:

class TForm1 : public TForm
{
__published:        // IDE-managed Components
TMemo *Memo1;
TImage *Image1;
void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
private:        // User declarations
void __fastcall OnClipboard(TWMNoParams& Msg);
void __fastcall OnChgChain(TWMNoParams& Msg);
public:        // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DRAWCLIPBOARD,TWMNoParams,OnCli pboard)
MESSAGE_HANDLER(WM_CHANGECBCHAIN,TWMNoParams,OnChg Chain)
END_MESSAGE_MAP(TComponent)
};

#cpp - file


#include <vcl.h>
#pragma hdrstop

#include "Unit3.h"
#include <vcl\Clipbrd.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWND Hclb;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
SetClipboardViewer(Handle);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
ChangeClipboardChain(Handle,Hclb);
CanClose = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnClipboard(TWMNoParams& Msg){
Memo1->Visible = false;
Image1->Visible = false;
try{
if(Clipboard()->HasFormat(CF_BITMAP)){
Image1->Picture->LoadFromClipboardFormat(CF_BITMAP,Clipboard()->GetAsHandle(CF_BITMAP),0);
Image1->Visible = true;
}
else{
Memo1->Text = Clipboard()->AsText;
Memo1->Visible = true;
}
}
catch(...){ SendMessage(Hclb,WM_DRAWCLIPBOARD,0,0);}
}
void __fastcall TForm1::OnChgChain(TWMNoParams& Msg){
SendMessage(Hclb,WM_CHANGECBCHAIN,0,0);
}

еще можно попробовать отлавливать
Код:

if (msg.message == WM_DRAWCLIPBOARD)
{
MessageBox(Form1->Handle, "asd", "asd", MB_OK);
Handled = true;
}
else if (msg.message == WM_CHANGECBCHAIN)
{

}


Mick 30.12.2011 01:29

Ответ: CBuilder и буфер обмена
 
Спасибо, все работает.
Я и раньше пробовал через таблицу откликов, но тип сообщения указывал неверно.
Если не секрет, откуда взято значение TWMNoParams - где можно почитать.

pozitiffcat 30.12.2011 09:16

Ответ: CBuilder и буфер обмена
 
Это чисто VCL фишка http://docwiki.embarcadero.com/VCL/e...es.TWMNoParams первое в яндексе


Часовой пояс GMT +4, время: 05:35.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot