xref: /AOO41X/main/sal/workben/clipboardwben/testviewer/cbvtest.cxx (revision 87d2adbc9cadf14644c3679b041b9226f7630199)
1*87d2adbcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*87d2adbcSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*87d2adbcSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*87d2adbcSAndrew Rist  * distributed with this work for additional information
6*87d2adbcSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*87d2adbcSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*87d2adbcSAndrew Rist  * "License"); you may not use this file except in compliance
9*87d2adbcSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*87d2adbcSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*87d2adbcSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*87d2adbcSAndrew Rist  * software distributed under the License is distributed on an
15*87d2adbcSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*87d2adbcSAndrew Rist  * KIND, either express or implied.  See the License for the
17*87d2adbcSAndrew Rist  * specific language governing permissions and limitations
18*87d2adbcSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*87d2adbcSAndrew Rist  *************************************************************/
21*87d2adbcSAndrew Rist 
22*87d2adbcSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir 
25cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
26cdf0e10cSrcweir #include "precompiled_sal.hxx"
27cdf0e10cSrcweir // TestWin32.cpp : Definiert den Einsprungpunkt f�r die Anwendung.
28cdf0e10cSrcweir //
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #define _WIN32_DCOM
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include "stdafx.h"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <windows.h>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include <ole2.h>
37cdf0e10cSrcweir #include <objidl.h>
38cdf0e10cSrcweir #include <objbase.h>
39cdf0e10cSrcweir #include <process.h>
40cdf0e10cSrcweir #include <olectl.h>
41cdf0e10cSrcweir #include <stdlib.h>
42cdf0e10cSrcweir #include <malloc.h>
43cdf0e10cSrcweir #include <crtdbg.h>
44cdf0e10cSrcweir #include <..\..\inc\systools\win32\MtaOleClipb.h>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #include "resource.h"
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #define MAX_LOADSTRING 100
49cdf0e10cSrcweir 
50cdf0e10cSrcweir // Globale Variablen:
51cdf0e10cSrcweir HINSTANCE			g_hInst;						// aktuelle Instanz
52cdf0e10cSrcweir HWND			    g_hwndMain;
53cdf0e10cSrcweir WCHAR				szTitle[MAX_LOADSTRING];			// Text der Titelzeile
54cdf0e10cSrcweir WCHAR				szWindowClass[MAX_LOADSTRING];	// Text der Titelzeile
55cdf0e10cSrcweir LPSTREAM			g_pStm    = NULL;
56cdf0e10cSrcweir char*				pTextBuff = NULL;
57cdf0e10cSrcweir DWORD				lData     = 0;
58cdf0e10cSrcweir UINT				g_nCBChanges = 0;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir // forward declaration
61cdf0e10cSrcweir ATOM  MyRegisterClass( HINSTANCE hInstance );
62cdf0e10cSrcweir BOOL  InitInstance( HINSTANCE, int );
63cdf0e10cSrcweir HMENU GetSubMenuHandle( HWND hwndParent, UINT uiTopLevelIndex );
64cdf0e10cSrcweir BOOL  IsClipboardViewer( HWND hwndParent );
65cdf0e10cSrcweir void  SwitchMenuState( HWND hwndParent );
66cdf0e10cSrcweir void  RegisterClipboardViewer( BOOL bRegister );
67cdf0e10cSrcweir void ShowAvailableClipboardFormats( HWND hWnd, HDC hdc, PAINTSTRUCT ps, RECT rcWnd );
68cdf0e10cSrcweir void ClearClipboardContent( HWND hWnd );
69cdf0e10cSrcweir 
70cdf0e10cSrcweir void    CALLBACK OnClipboardContentChange( void );
71cdf0e10cSrcweir LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
72cdf0e10cSrcweir LRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM );
73cdf0e10cSrcweir 
74cdf0e10cSrcweir //----------------------------------------------------
75cdf0e10cSrcweir // WinMain
76cdf0e10cSrcweir //----------------------------------------------------
77cdf0e10cSrcweir 
WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)78cdf0e10cSrcweir int APIENTRY WinMain(HINSTANCE hInstance,
79cdf0e10cSrcweir                      HINSTANCE hPrevInstance,
80cdf0e10cSrcweir                      LPSTR     lpCmdLine,
81cdf0e10cSrcweir                      int       nCmdShow )
82cdf0e10cSrcweir {
83cdf0e10cSrcweir  	// ZU ERLEDIGEN: F�gen Sie hier den Code ein.
84cdf0e10cSrcweir 	MSG     msg;
85cdf0e10cSrcweir 	HACCEL  hAccelTable;
86cdf0e10cSrcweir 	HRESULT hr = E_FAIL;
87cdf0e10cSrcweir 
88cdf0e10cSrcweir 	// it's important to initialize ole
89cdf0e10cSrcweir 	// in order to use the clipboard
90cdf0e10cSrcweir 	//hr = OleInitialize( NULL );
91cdf0e10cSrcweir 	hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 	g_hInst = hInstance;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 	// Globale Zeichenfolgen initialisieren
96cdf0e10cSrcweir 	LoadStringW(g_hInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
97cdf0e10cSrcweir 	LoadStringW(g_hInst, IDC_TESTWIN32, szWindowClass, MAX_LOADSTRING);
98cdf0e10cSrcweir 	MyRegisterClass(g_hInst);
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 	// Initialisierung der Anwendung durchf�hren:
101cdf0e10cSrcweir 	if( !InitInstance( g_hInst, nCmdShow ) )
102cdf0e10cSrcweir 	{
103cdf0e10cSrcweir 		return FALSE;
104cdf0e10cSrcweir 	}
105cdf0e10cSrcweir 
106cdf0e10cSrcweir 	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TESTWIN32);
107cdf0e10cSrcweir 
108cdf0e10cSrcweir 	// Hauptnachrichtenschleife:
109cdf0e10cSrcweir 	while( GetMessage(&msg, NULL, 0, 0) )
110cdf0e10cSrcweir 	{
111cdf0e10cSrcweir 		if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) )
112cdf0e10cSrcweir 		{
113cdf0e10cSrcweir 			TranslateMessage( &msg );
114cdf0e10cSrcweir 			DispatchMessage( &msg );
115cdf0e10cSrcweir 		}
116cdf0e10cSrcweir 	}
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 	// uninitializing the ole libraries
119cdf0e10cSrcweir 	//OleUninitialize( );
120cdf0e10cSrcweir 	CoUninitialize( );
121cdf0e10cSrcweir 
122cdf0e10cSrcweir 	return msg.wParam;
123cdf0e10cSrcweir }
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 
127cdf0e10cSrcweir //
128cdf0e10cSrcweir //  FUNKTION: MyRegisterClass()
129cdf0e10cSrcweir //
130cdf0e10cSrcweir //  AUFGABE: Registriert die Fensterklasse.
131cdf0e10cSrcweir //
132cdf0e10cSrcweir //  KOMMENTARE:
133cdf0e10cSrcweir //
134cdf0e10cSrcweir //    Diese Funktion und ihre Verwendung sind nur notwendig, wenn dieser Code
135cdf0e10cSrcweir //    mit Win32-Systemen vor der 'RegisterClassEx'-Funktion kompatibel sein soll,
136cdf0e10cSrcweir //    die zu Windows 95 hinzugef�gt wurde. Es ist wichtig diese Funktion aufzurufen,
137cdf0e10cSrcweir //    damit der Anwendung kleine Symbole mit den richtigen Proportionen zugewiesen
138cdf0e10cSrcweir //    werden.
139cdf0e10cSrcweir //
MyRegisterClass(HINSTANCE hInstance)140cdf0e10cSrcweir ATOM MyRegisterClass( HINSTANCE hInstance )
141cdf0e10cSrcweir {
142cdf0e10cSrcweir 	WNDCLASSEXW wcex;
143cdf0e10cSrcweir 
144cdf0e10cSrcweir 	wcex.cbSize = sizeof(WNDCLASSEX);
145cdf0e10cSrcweir 
146cdf0e10cSrcweir 	wcex.style			= CS_HREDRAW | CS_VREDRAW;
147cdf0e10cSrcweir 	wcex.lpfnWndProc	= (WNDPROC)WndProc;
148cdf0e10cSrcweir 	wcex.cbClsExtra		= 0;
149cdf0e10cSrcweir 	wcex.cbWndExtra		= 0;
150cdf0e10cSrcweir 	wcex.hInstance		= hInstance;
151cdf0e10cSrcweir 	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_TESTWIN32);
152cdf0e10cSrcweir 	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
153cdf0e10cSrcweir 	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
154cdf0e10cSrcweir 	wcex.lpszMenuName	= (LPCWSTR)IDC_TESTWIN32;
155cdf0e10cSrcweir 	wcex.lpszClassName	= szWindowClass;
156cdf0e10cSrcweir 	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 	return RegisterClassExW(&wcex);
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir //
162cdf0e10cSrcweir //   FUNKTION: InitInstance(HANDLE, int)
163cdf0e10cSrcweir //
164cdf0e10cSrcweir //   AUFGABE: Speichert die Instanzzugriffsnummer und erstellt das Hauptfenster
165cdf0e10cSrcweir //
166cdf0e10cSrcweir //   KOMMENTARE:
167cdf0e10cSrcweir //
168cdf0e10cSrcweir //        In dieser Funktion wird die Instanzzugriffsnummer in einer globalen Variable
169cdf0e10cSrcweir //        gespeichert und das Hauptprogrammfenster erstellt und angezeigt.
170cdf0e10cSrcweir //
InitInstance(HINSTANCE hInstance,int nCmdShow)171cdf0e10cSrcweir BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
172cdf0e10cSrcweir {
173cdf0e10cSrcweir    g_hwndMain = CreateWindowExW(0, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
174cdf0e10cSrcweir       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
175cdf0e10cSrcweir 
176cdf0e10cSrcweir    if( !IsWindow( g_hwndMain ) )
177cdf0e10cSrcweir    {
178cdf0e10cSrcweir       return FALSE;
179cdf0e10cSrcweir    }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir    ShowWindow( g_hwndMain, nCmdShow );
182cdf0e10cSrcweir    UpdateWindow( g_hwndMain );
183cdf0e10cSrcweir 
184cdf0e10cSrcweir    return TRUE;
185cdf0e10cSrcweir }
186cdf0e10cSrcweir 
187cdf0e10cSrcweir //
188cdf0e10cSrcweir //  FUNKTION: WndProc(HWND, unsigned, WORD, LONG)
189cdf0e10cSrcweir //
190cdf0e10cSrcweir //  AUFGABE:  Verarbeitet Nachrichten f�r das Hauptfenster.
191cdf0e10cSrcweir //
192cdf0e10cSrcweir //  WM_COMMAND	- Anwendungsmen� verarbeiten
193cdf0e10cSrcweir //  WM_PAINT	- Hauptfenster darstellen
194cdf0e10cSrcweir //  WM_DESTROY	- Beendigungsnachricht ausgeben und zur�ckkehren
195cdf0e10cSrcweir //
196cdf0e10cSrcweir //
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)197cdf0e10cSrcweir LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
198cdf0e10cSrcweir {
199cdf0e10cSrcweir 	int         wmId;
200cdf0e10cSrcweir 	int         wmEvent;
201cdf0e10cSrcweir 	PAINTSTRUCT ps;
202cdf0e10cSrcweir 	HDC         hdc;
203cdf0e10cSrcweir 	WCHAR       szHello[MAX_LOADSTRING];
204cdf0e10cSrcweir 
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 	LoadStringW(g_hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 	switch( message )
209cdf0e10cSrcweir 	{
210cdf0e10cSrcweir 	case WM_CREATE:
211cdf0e10cSrcweir 		ClearClipboardContent( hWnd );
212cdf0e10cSrcweir 		break;
213cdf0e10cSrcweir 
214cdf0e10cSrcweir 		case WM_COMMAND:
215cdf0e10cSrcweir 			wmId    = LOWORD(wParam);
216cdf0e10cSrcweir 			wmEvent = HIWORD(wParam);
217cdf0e10cSrcweir 			// Men�auswahlen analysieren:
218cdf0e10cSrcweir 			switch( wmId )
219cdf0e10cSrcweir 			{
220cdf0e10cSrcweir 				case IDD_CBVIEWER:
221cdf0e10cSrcweir 					SwitchMenuState( hWnd );
222cdf0e10cSrcweir 					RegisterClipboardViewer( IsClipboardViewer( hWnd ) );
223cdf0e10cSrcweir 					break;
224cdf0e10cSrcweir 
225cdf0e10cSrcweir 				case IDM_EXIT:
226cdf0e10cSrcweir 				   DestroyWindow( hWnd );
227cdf0e10cSrcweir 				   break;
228cdf0e10cSrcweir 
229cdf0e10cSrcweir 				default:
230cdf0e10cSrcweir 				   return DefWindowProc( hWnd, message, wParam, lParam );
231cdf0e10cSrcweir 			}
232cdf0e10cSrcweir 			break;
233cdf0e10cSrcweir 
234cdf0e10cSrcweir 		case WM_PAINT:
235cdf0e10cSrcweir 			hdc = BeginPaint (hWnd, &ps);
236cdf0e10cSrcweir 			// ZU ERLEDIGEN: Hier beliebigen Code zum Zeichnen hinzuf�gen...
237cdf0e10cSrcweir 			RECT rt;
238cdf0e10cSrcweir 			GetClientRect( hWnd, &rt );
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 			if ( IsClipboardViewer( g_hwndMain ) )
241cdf0e10cSrcweir 			{
242cdf0e10cSrcweir 				ShowAvailableClipboardFormats( hWnd, hdc, ps, rt );
243cdf0e10cSrcweir 			}
244cdf0e10cSrcweir 			else
245cdf0e10cSrcweir 			{
246cdf0e10cSrcweir 				WCHAR wcString[MAX_LOADSTRING];
247cdf0e10cSrcweir 				LoadStringW(g_hInst, IDS_MSG_CBVIEWER_IS_OFF, wcString, MAX_LOADSTRING);
248cdf0e10cSrcweir 				DrawTextW( hdc, wcString, wcslen( wcString ), &rt, DT_CENTER );
249cdf0e10cSrcweir 			}
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 			EndPaint( hWnd, &ps );
252cdf0e10cSrcweir 			break;
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 		case WM_DESTROY:
255cdf0e10cSrcweir 			PostQuitMessage( 0 );
256cdf0e10cSrcweir 			break;
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 		default:
259cdf0e10cSrcweir 			return DefWindowProc( hWnd, message, wParam, lParam );
260cdf0e10cSrcweir    }
261cdf0e10cSrcweir    return 0;
262cdf0e10cSrcweir }
263cdf0e10cSrcweir 
GetSubMenuHandle(HWND hwndParent,UINT uiTopLevelIndex)264cdf0e10cSrcweir HMENU GetSubMenuHandle( HWND hwndParent, UINT uiTopLevelIndex )
265cdf0e10cSrcweir {
266cdf0e10cSrcweir 	HMENU hMenuMain = GetMenu( hwndParent );
267cdf0e10cSrcweir 	_ASSERT( IsMenu( hMenu ) );
268cdf0e10cSrcweir 
269cdf0e10cSrcweir 	HMENU hSubMenu = GetSubMenu( hMenuMain, uiTopLevelIndex );
270cdf0e10cSrcweir 	_ASSERT( IsMenu( hSubMenu ) );
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 	return hSubMenu;
273cdf0e10cSrcweir }
274cdf0e10cSrcweir 
IsClipboardViewer(HWND hwndParent)275cdf0e10cSrcweir BOOL IsClipboardViewer( HWND hwndParent )
276cdf0e10cSrcweir {
277cdf0e10cSrcweir 	HMENU hSubMenu = GetSubMenuHandle( hwndParent, 0 );
278cdf0e10cSrcweir 	UINT uiMState = GetMenuState( hSubMenu, 0, MF_BYPOSITION );
279cdf0e10cSrcweir 	return ( MF_CHECKED == uiMState );
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
SwitchMenuState(HWND hwndParent)282cdf0e10cSrcweir void SwitchMenuState( HWND hwndParent )
283cdf0e10cSrcweir {
284cdf0e10cSrcweir 	HMENU hSubMenu = GetSubMenuHandle( hwndParent, 0 );
285cdf0e10cSrcweir 	WCHAR wcMenuString[MAX_LOADSTRING];
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 	if ( IsClipboardViewer( hwndParent ) )
288cdf0e10cSrcweir 	{
289cdf0e10cSrcweir 		LoadStringW(g_hInst, IDS_CBVIEWER_OFF, wcMenuString, MAX_LOADSTRING);
290cdf0e10cSrcweir 		ModifyMenuW( hSubMenu, 0, MF_BYPOSITION | MF_STRING, IDD_CBVIEWER, wcMenuString );
291cdf0e10cSrcweir 		CheckMenuItem( hSubMenu, 0, MF_BYPOSITION | MF_UNCHECKED );
292cdf0e10cSrcweir 	}
293cdf0e10cSrcweir 	else
294cdf0e10cSrcweir 	{
295cdf0e10cSrcweir 		LoadStringW(g_hInst, IDS_CBVIEWER_ON, wcMenuString, MAX_LOADSTRING);
296cdf0e10cSrcweir 		ModifyMenuW( hSubMenu, 0, MF_BYPOSITION | MF_STRING, IDD_CBVIEWER, wcMenuString );
297cdf0e10cSrcweir 		CheckMenuItem( hSubMenu, 0, MF_BYPOSITION | MF_CHECKED );
298cdf0e10cSrcweir 	}
299cdf0e10cSrcweir }
300cdf0e10cSrcweir 
RegisterClipboardViewer(BOOL bRegister)301cdf0e10cSrcweir void RegisterClipboardViewer( BOOL bRegister )
302cdf0e10cSrcweir {
303cdf0e10cSrcweir 	if ( bRegister )
304cdf0e10cSrcweir 		MTARegisterClipboardViewer( OnClipboardContentChange );
305cdf0e10cSrcweir 	else // unregister
306cdf0e10cSrcweir 		MTARegisterClipboardViewer( NULL );
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 	InvalidateRect( g_hwndMain, NULL, TRUE );
309cdf0e10cSrcweir 	UpdateWindow( g_hwndMain );
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
ShowAvailableClipboardFormats(HWND hWnd,HDC hdc,PAINTSTRUCT ps,RECT rcWnd)312cdf0e10cSrcweir void ShowAvailableClipboardFormats( HWND hWnd, HDC hdc, PAINTSTRUCT ps, RECT rcWnd )
313cdf0e10cSrcweir {
314cdf0e10cSrcweir 	if ( !OpenClipboard( hWnd ) )
315cdf0e10cSrcweir 	{
316cdf0e10cSrcweir 		WCHAR szErrMsg[] = { L"Couldn't open the clipboard" };
317cdf0e10cSrcweir 		DrawTextW( hdc, szErrMsg, wcslen( szErrMsg ), &rcWnd, DT_CENTER );
318cdf0e10cSrcweir 		return;
319cdf0e10cSrcweir 	}
320cdf0e10cSrcweir 	else
321cdf0e10cSrcweir 	{
322cdf0e10cSrcweir 		WCHAR szCBChangedMsg[100];
323cdf0e10cSrcweir 
324cdf0e10cSrcweir 		wsprintfW( szCBChangedMsg, L"Clipboard content changed %d", g_nCBChanges );
325cdf0e10cSrcweir 		DrawTextW( hdc, szCBChangedMsg, wcslen( szCBChangedMsg ), &rcWnd, DT_CENTER );
326cdf0e10cSrcweir 
327cdf0e10cSrcweir 		CloseClipboard( );
328cdf0e10cSrcweir 	}
329cdf0e10cSrcweir }
330cdf0e10cSrcweir 
ClearClipboardContent(HWND hWnd)331cdf0e10cSrcweir void ClearClipboardContent( HWND hWnd )
332cdf0e10cSrcweir {
333cdf0e10cSrcweir 	if ( OpenClipboard( hWnd ) )
334cdf0e10cSrcweir 	{
335cdf0e10cSrcweir 		EmptyClipboard( );
336cdf0e10cSrcweir 		CloseClipboard( );
337cdf0e10cSrcweir 	}
338cdf0e10cSrcweir }
339cdf0e10cSrcweir 
340cdf0e10cSrcweir // clipboard viewer callback function
OnClipboardContentChange(void)341cdf0e10cSrcweir void CALLBACK OnClipboardContentChange( void )
342cdf0e10cSrcweir {
343cdf0e10cSrcweir 	++g_nCBChanges;
344cdf0e10cSrcweir 	InvalidateRect( g_hwndMain, NULL, TRUE );
345cdf0e10cSrcweir 	UpdateWindow( g_hwndMain );
346cdf0e10cSrcweir }
347cdf0e10cSrcweir 
348