blob: 7f1950fcfbb4cbc8ee7ddde435c2fc097bb5f90e [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sal.hxx"
// TestWin32.cpp : Definiert den Einsprungpunkt für die Anwendung.
//
#define _WIN32_DCOM
#include "stdafx.h"
#include <windows.h>
#include <ole2.h>
#include <objidl.h>
#include <objbase.h>
#include <process.h>
#include <olectl.h>
#include <stdlib.h>
#include <malloc.h>
#include <crtdbg.h>
#include <..\..\inc\systools\win32\MtaOleClipb.h>
#include "resource.h"
#define MAX_LOADSTRING 100
// Globale Variablen:
HINSTANCE g_hInst; // aktuelle Instanz
HWND g_hwndMain;
WCHAR szTitle[MAX_LOADSTRING]; // Text der Titelzeile
WCHAR szWindowClass[MAX_LOADSTRING]; // Text der Titelzeile
LPSTREAM g_pStm = NULL;
char* pTextBuff = NULL;
DWORD lData = 0;
UINT g_nCBChanges = 0;
// forward declaration
ATOM MyRegisterClass( HINSTANCE hInstance );
BOOL InitInstance( HINSTANCE, int );
HMENU GetSubMenuHandle( HWND hwndParent, UINT uiTopLevelIndex );
BOOL IsClipboardViewer( HWND hwndParent );
void SwitchMenuState( HWND hwndParent );
void RegisterClipboardViewer( BOOL bRegister );
void ShowAvailableClipboardFormats( HWND hWnd, HDC hdc, PAINTSTRUCT ps, RECT rcWnd );
void ClearClipboardContent( HWND hWnd );
void CALLBACK OnClipboardContentChange( void );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM );
//----------------------------------------------------
// WinMain
//----------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
// ZU ERLEDIGEN: Fügen Sie hier den Code ein.
MSG msg;
HACCEL hAccelTable;
HRESULT hr = E_FAIL;
// it's important to initialize ole
// in order to use the clipboard
//hr = OleInitialize( NULL );
hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
g_hInst = hInstance;
// Globale Zeichenfolgen initialisieren
LoadStringW(g_hInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(g_hInst, IDC_TESTWIN32, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(g_hInst);
// Initialisierung der Anwendung durchführen:
if( !InitInstance( g_hInst, nCmdShow ) )
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TESTWIN32);
// Hauptnachrichtenschleife:
while( GetMessage(&msg, NULL, 0, 0) )
{
if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
// uninitializing the ole libraries
//OleUninitialize( );
CoUninitialize( );
return msg.wParam;
}
//
// FUNKTION: MyRegisterClass()
//
// AUFGABE: Registriert die Fensterklasse.
//
// KOMMENTARE:
//
// Diese Funktion und ihre Verwendung sind nur notwendig, wenn dieser Code
// mit Win32-Systemen vor der 'RegisterClassEx'-Funktion kompatibel sein soll,
// die zu Windows 95 hinzugefügt wurde. Es ist wichtig diese Funktion aufzurufen,
// damit der Anwendung kleine Symbole mit den richtigen Proportionen zugewiesen
// werden.
//
ATOM MyRegisterClass( HINSTANCE hInstance )
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TESTWIN32);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCWSTR)IDC_TESTWIN32;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassExW(&wcex);
}
//
// FUNKTION: InitInstance(HANDLE, int)
//
// AUFGABE: Speichert die Instanzzugriffsnummer und erstellt das Hauptfenster
//
// KOMMENTARE:
//
// In dieser Funktion wird die Instanzzugriffsnummer in einer globalen Variable
// gespeichert und das Hauptprogrammfenster erstellt und angezeigt.
//
BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
g_hwndMain = CreateWindowExW(0, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if( !IsWindow( g_hwndMain ) )
{
return FALSE;
}
ShowWindow( g_hwndMain, nCmdShow );
UpdateWindow( g_hwndMain );
return TRUE;
}
//
// FUNKTION: WndProc(HWND, unsigned, WORD, LONG)
//
// AUFGABE: Verarbeitet Nachrichten für das Hauptfenster.
//
// WM_COMMAND - Anwendungsmenü verarbeiten
// WM_PAINT - Hauptfenster darstellen
// WM_DESTROY - Beendigungsnachricht ausgeben und zurückkehren
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId;
int wmEvent;
PAINTSTRUCT ps;
HDC hdc;
WCHAR szHello[MAX_LOADSTRING];
LoadStringW(g_hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch( message )
{
case WM_CREATE:
ClearClipboardContent( hWnd );
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Menüauswahlen analysieren:
switch( wmId )
{
case IDD_CBVIEWER:
SwitchMenuState( hWnd );
RegisterClipboardViewer( IsClipboardViewer( hWnd ) );
break;
case IDM_EXIT:
DestroyWindow( hWnd );
break;
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
break;
case WM_PAINT:
hdc = BeginPaint (hWnd, &ps);
// ZU ERLEDIGEN: Hier beliebigen Code zum Zeichnen hinzufügen...
RECT rt;
GetClientRect( hWnd, &rt );
if ( IsClipboardViewer( g_hwndMain ) )
{
ShowAvailableClipboardFormats( hWnd, hdc, ps, rt );
}
else
{
WCHAR wcString[MAX_LOADSTRING];
LoadStringW(g_hInst, IDS_MSG_CBVIEWER_IS_OFF, wcString, MAX_LOADSTRING);
DrawTextW( hdc, wcString, wcslen( wcString ), &rt, DT_CENTER );
}
EndPaint( hWnd, &ps );
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
return 0;
}
HMENU GetSubMenuHandle( HWND hwndParent, UINT uiTopLevelIndex )
{
HMENU hMenuMain = GetMenu( hwndParent );
_ASSERT( IsMenu( hMenu ) );
HMENU hSubMenu = GetSubMenu( hMenuMain, uiTopLevelIndex );
_ASSERT( IsMenu( hSubMenu ) );
return hSubMenu;
}
BOOL IsClipboardViewer( HWND hwndParent )
{
HMENU hSubMenu = GetSubMenuHandle( hwndParent, 0 );
UINT uiMState = GetMenuState( hSubMenu, 0, MF_BYPOSITION );
return ( MF_CHECKED == uiMState );
}
void SwitchMenuState( HWND hwndParent )
{
HMENU hSubMenu = GetSubMenuHandle( hwndParent, 0 );
WCHAR wcMenuString[MAX_LOADSTRING];
if ( IsClipboardViewer( hwndParent ) )
{
LoadStringW(g_hInst, IDS_CBVIEWER_OFF, wcMenuString, MAX_LOADSTRING);
ModifyMenuW( hSubMenu, 0, MF_BYPOSITION | MF_STRING, IDD_CBVIEWER, wcMenuString );
CheckMenuItem( hSubMenu, 0, MF_BYPOSITION | MF_UNCHECKED );
}
else
{
LoadStringW(g_hInst, IDS_CBVIEWER_ON, wcMenuString, MAX_LOADSTRING);
ModifyMenuW( hSubMenu, 0, MF_BYPOSITION | MF_STRING, IDD_CBVIEWER, wcMenuString );
CheckMenuItem( hSubMenu, 0, MF_BYPOSITION | MF_CHECKED );
}
}
void RegisterClipboardViewer( BOOL bRegister )
{
if ( bRegister )
MTARegisterClipboardViewer( OnClipboardContentChange );
else // unregister
MTARegisterClipboardViewer( NULL );
InvalidateRect( g_hwndMain, NULL, TRUE );
UpdateWindow( g_hwndMain );
}
void ShowAvailableClipboardFormats( HWND hWnd, HDC hdc, PAINTSTRUCT ps, RECT rcWnd )
{
if ( !OpenClipboard( hWnd ) )
{
WCHAR szErrMsg[] = { L"Couldn't open the clipboard" };
DrawTextW( hdc, szErrMsg, wcslen( szErrMsg ), &rcWnd, DT_CENTER );
return;
}
else
{
WCHAR szCBChangedMsg[100];
wsprintfW( szCBChangedMsg, L"Clipboard content changed %d", g_nCBChanges );
DrawTextW( hdc, szCBChangedMsg, wcslen( szCBChangedMsg ), &rcWnd, DT_CENTER );
CloseClipboard( );
}
}
void ClearClipboardContent( HWND hWnd )
{
if ( OpenClipboard( hWnd ) )
{
EmptyClipboard( );
CloseClipboard( );
}
}
// clipboard viewer callback function
void CALLBACK OnClipboardContentChange( void )
{
++g_nCBChanges;
InvalidateRect( g_hwndMain, NULL, TRUE );
UpdateWindow( g_hwndMain );
}