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