W tym artykule wyjaśnię, jak przystosować Twoją aplikację do reagowania na zmianę zawartości schowka. Jest kilka możliwości wykorzystania tego, główne dwie to: void __fastcall WMDrawClipboard(TMessage* Message); void __fastcall WMChangeCBChain(TMessage* Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_DRAWCLIPBOARD, TMessage*, WMDrawClipboard) MESSAGE_HANDLER(WM_CHANGECBCHAIN, TMessage*, WMChangeCBChain) END_MESSAGE_MAP(TComponent)Są to komunikaty, które będziemy odbierać kiedy zmieni się zawartość albo łańcuch schowka. Musimy również zachować uchwyt do następnego okna w łańcuchu (powody podam później): HWND NextHandle;To powinno zostać umieszczone w sekcji private. Teraz pora wpisać kod funkcji obsługujących te komunikaty. Przyłączanie do łańcucha schowka Normalnie dokonuje się tego w konstruktorze głównej formy aplikacji. Wszystko czego potrzeba to ten kod: NextHandle = SetClipboardViewer(Handle);Dodajemy w ten sposób nasz uchwyt do łańcucha schowka, zwrócony uchwyt jest uchwytem do następnego członka łańcucha, ale o tym później. Odpowiadanie na zmianę zawartości schowka Za każdym razem, kiedy ulegnie zmianie zawartość schowka, otrzymamy komunikat WM_DRAWCLIPBOARD. W procedurze, którą zadeklarowaliśmy wcześniej, możemy teraz odpowiedzieć na zmianę zawartości schowka. Musimy również przekazać ten komunikat do następnego członka łańcucha. W poniższej funkcji zmienimy tytuł formy na zawartość schowka: void __fastcall TForm1::WMDrawClipboard(TMessage* Message) { //Dodaj tu kod odpowiadający na zmianę Caption = Clipboard()->AsText; SendMessage(NextHandle,WM_DRAWCLIPBOARD,0,0); }Odpowiadanie na zmiany w łańcuchu Musimy również zadbać o to, by po usunięciu lub dodaniu nowego członka do łańcucha został zaktualizowany uchwyt do następnego członka łańcucha: void __fastcall TForm1::WMChangeCBChain(TMessage* Message) { if((void *)Message->WParam == NextHandle) NextHandle = (void *)Message->LParam; else SendMessage(NextHandle, WM_CHANGECBCHAIN, Message->WParam, // uchwyt do okna usuwanego Message->LParam); // uchwyt do następnego okna }Opuszczanie łańcucha schowka Dokonujemy tego w destruktorze formy. Wszystko co musimy zrobić to usunąć aplikację z łańcucha: __fastcall TForm1::~TForm1() { // Nie zapomnij o deklaracji w nagłówku ChangeClipboardChain(Handle, // nasz uchwyt do usunięcia NextHandle ); // następby uchwyt w łańcuchu }Końcowe uwagi Aby użyć globalnego obiektu Clipboard należy dodać do nagłówka linijkę #include <Clipbrd.hpp>. Mam nadzieję, że ten tutorial przyda Ci się do czegoś :-) Tu możesz ściągnąć gotowe pliki źródłowe (C++ Builder 4)
|