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