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 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 // 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 // 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 // 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 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 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 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 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 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 331 void ClearClipboardContent( HWND hWnd ) 332 { 333 if ( OpenClipboard( hWnd ) ) 334 { 335 EmptyClipboard( ); 336 CloseClipboard( ); 337 } 338 } 339 340 // clipboard viewer callback function 341 void CALLBACK OnClipboardContentChange( void ) 342 { 343 ++g_nCBChanges; 344 InvalidateRect( g_hwndMain, NULL, TRUE ); 345 UpdateWindow( g_hwndMain ); 346 } 347 348