This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/WATCOM/samples/win/iconview/mdi.c

229 lines
6.6 KiB
C

#define INCLUDE_COMMDLG_H 1
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "view.h"
#include "icon.h"
#include "mdi.h"
#include "util.h"
#include "switch.h"
extern char IconClass[];
/*
* DrawMdiIcon - draws the icon in MDI_icon on the screen by blitting
* the XOR_mask onto the area given by rect (after anding the background
* with the AND_mask).
*/
static void DrawMdiIcon( HDC hdc, an_MDI_icon *MDI_icon, RECT *r )
{
BITMAP bm;
HDC memDC;
POINT src_org, src_size;
POINT dst_org, dst_size;
dst_size.y = r->bottom - r->top + 1;
dst_size.x = r->right - r->left + 1;
DPtoLP( hdc, &dst_size, 1 );
dst_org.x = r->left;
dst_org.y = r->top;
DPtoLP( hdc, &dst_org, 1 );
GetObject( MDI_icon->AND_bitmap, sizeof( BITMAP ), (LPSTR) &bm );
memDC = CreateCompatibleDC( hdc );
SelectObject( memDC, MDI_icon->AND_bitmap );
src_size.x = bm.bmWidth;
src_size.y = bm.bmHeight;
DPtoLP( hdc, &src_size, 1 );
src_org.x = 0;
src_org.y = 0;
DPtoLP( hdc, &src_org, 1 );
StretchBlt( hdc, dst_org.x, dst_org.y, dst_size.x, dst_size.y,
memDC, src_org.x, src_org.y, src_size.x, src_size.y, SRCAND );
SelectObject( memDC, MDI_icon->XOR_bitmap );
StretchBlt( hdc, dst_org.x, dst_org.y, dst_size.x, dst_size.y,
memDC, src_org.x, src_org.y, src_size.x, src_size.y, SRCCOPY );
DeleteDC( memDC );
} /* DrawMdiIcon */
/*
* MdiReadIcon - reads in the icon contained in the file fp, and
* creates an MDI child window for the new icon. The bitmaps are
* associated with the window by using the GetWindowLong procs.
*/
HWND MdiReadIcon( FILE *fp, char *title, char *file_name, long flags )
{
HWND hwnd;
MDICREATESTRUCT mdi;
an_icon_file *icon_file;
an_icon *icon;
an_MDI_icon *MDI_icon;
HDC hdc;
mdi.szClass = IconClass;
mdi.szTitle = title;
mdi.hOwner = Instance;
mdi.x = (signed short) CW_USEDEFAULT;
mdi.y = (signed short) CW_USEDEFAULT;
mdi.cx = (signed short) CW_USEDEFAULT;
mdi.cy = (signed short) CW_USEDEFAULT;
mdi.style = flags;
mdi.lParam = 0;
hwnd = (HWND) SendMessage( ClientWindow, WM_MDICREATE, 0,
(LONG)(LPSTR)&mdi );
MDI_icon = (an_MDI_icon *)GetWindowLong( hwnd, 0 );
hdc = GetDC( hwnd );
icon_file = IconOpen( fp );
icon = IconResourceToIcon( fp, icon_file, 0 );
MDI_icon->XOR_bitmap = IconToXorBitmap( hdc, icon );
MDI_icon->AND_bitmap = IconToAndBitmap( hdc, icon );
IconFini( icon );
IconClose( icon_file );
MDI_icon->file_name = strdup( file_name );
MDI_icon->current_icon = 0;
ReleaseDC( hwnd, hdc );
return( hwnd );
} /* MdiReadIcon */
/*
* MdiOpenIcon - prompts the user for a file name using the standard
* file open dialog boxes and then calls MdiReadIcon to do the actual
* work of creating a window for the screen and transforming the icon
* file into usable bitmaps.
*/
HWND MdiOpenIcon()
{
BOOL rc;
char filename[ _MAX_PATH ];
char ext[ _MAX_EXT ];
char title[ _MAX_FNAME ];
char filter[] = { "icons (*.ico)\0*.ico\0\0" };
FILE *fp;
HWND hwnd;
OPENFILENAME of;
filename[ 0 ] = 0;
memset( &of, 0, sizeof( OPENFILENAME ) );
of.lStructSize = sizeof( OPENFILENAME );
of.hwndOwner = NULL;
of.lpstrFilter = (LPSTR) filter;
of.lpstrDefExt = "";
of.nFilterIndex = 1L;
of.lpstrFile = filename;
of.nMaxFile = _MAX_PATH;
of.lpstrTitle = NULL;
of.Flags = OFN_HIDEREADONLY;
rc = GetOpenFileName( &of );
if( rc ) {
_splitpath( filename, NULL, NULL, title, ext );
strcat( title, ext );
fp = fopen( filename, "rb" );
hwnd = MdiReadIcon( fp, title, filename, WS_ICONIC );
ShowWindow( hwnd, SW_SHOWMINIMIZED );
UpdateWindow( hwnd );
fclose( fp );
return( hwnd );
} else {
return( NULL );
}
} /* MdiIconOpen */
/*
* ReloadIcon - destroys the current bitmap for an MDI icon and loads
* in the version which occurs at the offset given by MDI_icon->current_icon.
* No error checking is performed because we know that the icon version was
* selected via a dialog with a combo box and hence must be valid.
*/
static void ReloadIcon( HWND hwnd, an_MDI_icon *MDI_icon )
{
FILE *fp;
an_icon_file *icon_file;
an_icon *icon;
HDC hdc;
fp = fopen( MDI_icon->file_name, "rb" );
if( !fp ) return;
DeleteObject( MDI_icon->XOR_bitmap );
DeleteObject( MDI_icon->AND_bitmap );
icon_file = IconOpen( fp );
icon = IconResourceToIcon( fp, icon_file, MDI_icon->current_icon );
hdc = GetDC( hwnd );
MDI_icon->XOR_bitmap = IconToXorBitmap( hdc, icon );
MDI_icon->AND_bitmap = IconToAndBitmap( hdc, icon );
ReleaseDC( hwnd, hdc );
IconFini( icon );
IconClose( icon_file );
fclose( fp );
} /* ReloadIcon */
/*
* This is the window proc for an individual MDI child window containing
* a displayable icon.
*/
LONG _EXPORT FAR PASCAL MdiIconProc( HWND hwnd, UINT msg,
WPARAM wparam, LPARAM lparam )
{
an_MDI_icon *icon;
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
icon = (an_MDI_icon *) GetWindowLong( hwnd, 0 );
switch( msg ) {
case WM_CREATE:
icon = UtilMalloc( sizeof( an_MDI_icon ) );
icon->XOR_bitmap = 0; /* use as flag so we don't paint */
SetWindowLong( hwnd, 0, (LONG) (LPVOID) icon );
break;
case WM_COMMAND:
if( LOWORD( wparam ) == IDM_SWITCHICON ) {
if( SwitchIcon( icon ) ) {
ReloadIcon( hwnd, icon );
InvalidateRect( hwnd, NULL, TRUE );
UpdateWindow( hwnd );
}
}
break;
case WM_PAINT:
if( icon->XOR_bitmap ) {
hdc = BeginPaint( hwnd, &ps );
/* draw the bitmap in the client area of the MDI window */
GetClientRect( hwnd, &rect );
DrawMdiIcon( hdc, icon, &rect );
EndPaint( hwnd, &ps );
}
break;
case WM_DESTROY:
/* destroy the BITMAP and the ICON */
DeleteObject( icon->XOR_bitmap );
DeleteObject( icon->AND_bitmap );
UtilFree( icon->file_name );
UtilFree( icon );
break;
default:
return( DefMDIChildProc( hwnd, msg, wparam, lparam ) );
}
return( 0 );
} /* MdiIconProc */