📄 wmdisim.c
字号:
*/
static void deleteMaximizedMenuConfig( void )
{
HMENU root_menu;
int count;
if( !insertedItems ) {
return;
}
insertedItems = FALSE;
root_menu = _wpi_getmenu( mdiInfo.root );
_wpi_deletemenu( root_menu, 0, TRUE );
count = (int)_wpi_getmenuitemcount( root_menu );
_wpi_deletemenu( root_menu, count-1, TRUE );
_wpi_drawmenubar( mdiInfo.root );
}
/*
* MDISetMainWindowTitle - set the title of the main window
*/
void MDISetMainWindowTitle( char *fname )
{
char buff[MAX_STR];
if( childrenMaximized ) {
sprintf( buff, "%s - %s", mdiInfo.main_name, fname );
_wpi_setwindowtext( mdiInfo.root, buff );
}
} /* MDISetMainWindowTitle */
/*
* MDIIsMaximized - test if we are currently maximized
*/
int MDIIsMaximized( void )
{
return( childrenMaximized );
} /* MDIIsMaximized */
/*
* MDIIsWndMaximized -- test is given window is currently maximized
*/
int MDIIsWndMaximized( HWND hwnd )
{
mdi_data *md;
md = MDI_DATA_FROM_HWND( hwnd );
return( md->curr_state == STATE_MAX );
} /* MDIIsWndMaximized */
/*
* MDIUpdatedMenu - test if we have updated ( added to ) the menus
*/
int MDIUpdatedMenu( void )
{
return( updatedMenu );
} /* MDIUpdatedMenu */
/*
* MDISetMaximized - set the current maximized state
*/
void MDISetMaximized( int setting )
{
childrenMaximized = setting;
} /* MDISetMaximized */
/*
* MDITile - do a tile
*/
void MDITile( int is_horz )
{
#if defined( __UNIX__ )
return;
#else
#ifndef __OS2_PM__
WORD tile_how;
#if !defined( __NT__ )
HANDLE h;
#if defined( __WINDOWS_386__ )
LPVOID TileChildWindows;
HINDIR hindir;
#else
int (FAR PASCAL* TileChildWindows)( HWND parent, WORD action );
#endif
#else
extern int FAR PASCAL TileChildWindows( HWND parent, WORD action );
#endif
if( childrenMaximized ) {
return;
}
if( is_horz ) {
tile_how = MDITILE_HORIZONTAL;
} else {
tile_how = MDITILE_VERTICAL;
}
#if !defined( __NT__ )
h = LoadLibrary( "USER.EXE" );
if( h == NULL ) {
return;
}
TileChildWindows = (LPVOID) GetProcAddress( h, "TileChildWindows" );
if( TileChildWindows == NULL ) {
return;
}
#if defined( __WINDOWS_386__ )
hindir = GetIndirectFunctionHandle( TileChildWindows, INDIR_WORD,
INDIR_WORD, INDIR_ENDLIST );
InvokeIndirectFunction( hindir, mdiInfo.container, tile_how );
free( hindir );
#else
TileChildWindows( mdiInfo.container, tile_how );
#endif
FreeLibrary( h );
#else
TileChildWindows( mdiInfo.container, tile_how );
#endif
#else
is_horz = is_horz;
#endif
#endif
} /* MDITile */
/*
* MDICascade - do a cascade
*/
void MDICascade( void )
{
#if defined( __UNIX__ )
return;
#else
#ifndef __OS2_PM__
#if !defined( __NT__ )
HANDLE h;
#if defined( __WINDOWS_386__ )
LPVOID CascadeChildWindows;
HINDIR hindir;
#else
int (FAR PASCAL* CascadeChildWindows)( HWND parent, WORD action );
#endif
#else
extern int FAR PASCAL CascadeChildWindows( HWND parent, WORD action );
#endif
if( childrenMaximized ) {
return;
}
#if !defined( __NT__ )
h = LoadLibrary( "USER.EXE" );
if( h == NULL ) {
return;
}
CascadeChildWindows = (LPVOID) GetProcAddress( h, "CascadeChildWindows" );
if( CascadeChildWindows == NULL ) {
return;
}
#if defined( __WINDOWS_386__ )
hindir = GetIndirectFunctionHandle( CascadeChildWindows, INDIR_WORD,
INDIR_WORD, INDIR_ENDLIST );
InvokeIndirectFunction( hindir, mdiInfo.container, 0 );
free( hindir );
#else
CascadeChildWindows( mdiInfo.container, 0 );
#endif
FreeLibrary( h );
#else
CascadeChildWindows( mdiInfo.container, 0 );
#endif
#endif
#endif
} /* MDICascade */
/*
* MDINewWindow - a new MDI window has been created
*/
int MDINewWindow( HWND hwnd )
{
mdi_data *md;
md = (mdi_data *) MemAlloc( sizeof( mdi_data ) );
if( md == NULL ) {
return( FALSE );
}
md->hwnd = hwnd;
_wpi_setwindowlong( hwnd, mdiInfo.data_off, (LONG) md );
if( mdiHead == NULL ) {
mdiHead = mdiTail = md;
} else {
mdiTail->next = md;
mdiTail = md;
}
if( childrenMaximized ) {
doMaximize( hwnd );
mdiInfo.set_window_title( hwnd );
}
return( TRUE );
} /* MDINewWindow */
/*
* finiWindow - an mdi window is done
*/
static void finiWindow( HWND hwnd )
{
mdi_data *curr,*prev;
curr = mdiHead;
prev = NULL;
while( curr != NULL ) {
if( curr->hwnd == hwnd ) {
break;
}
prev = curr;
curr = curr->next;
}
if( curr == NULL ) {
return;
}
if( prev != NULL ) {
prev->next = curr->next;
}
if( curr == mdiHead ) {
mdiHead = curr->next;
}
if( curr == mdiTail ) {
mdiTail = prev;
}
MemFree( curr );
} /* finiWindow */
#ifndef __OS2_PM__
/*
* processSysCommand - process a WM_SYSCOMMAND message for an MDI child
*/
static int processSysCommand( HWND hwnd, WPI_MSG msg, WPI_PARAM1 wparam,
WPI_PARAM2 lparam, WPI_MRESULT *lrc )
{
mdi_data *md;
md = MDI_DATA_FROM_HWND( hwnd );
switch( LOWORD( wparam ) & 0xfff0 ) {
case SC_RESTORE:
*lrc = _wpi_defwindowproc( hwnd, msg, wparam, lparam );
if( md->orig_state == STATE_MAX ) {
md->orig_state = STATE_NORMAL;
doMaximizeAll( hwnd );
} else {
doRestoreAll();
}
return( TRUE );
case SC_MAXIMIZE:
doMaximizeAll( hwnd );
mdiInfo.set_window_title( hwnd );
*lrc = 0;
return( TRUE );
case SC_CLOSE:
*lrc = _wpi_defwindowproc( hwnd, msg, wparam, lparam );
return( TRUE );
case SC_MINIMIZE:
if( md->curr_state == STATE_MAX ) {
doRestoreAll();
md->orig_state = STATE_MAX;
}
*lrc = _wpi_defwindowproc( hwnd, msg, wparam, lparam );
return( TRUE );
case SC_NEXTWINDOW:
if( md->next == NULL ) {
md = mdiHead;
} else {
md = md->next;
}
/* note: we are sending WM_SETFOCUS, for lack of anything
* better (WM_CHILDACTIVATE maybe?)
*/
_wpi_sendmessage( md->hwnd, WM_SETFOCUS, 0, 0L );
return( TRUE );
}
return( FALSE );
} /* processSysCommand */
#if 0
/*
* tryContainerScrollBars - try to add container scroll bars
*/
static void tryContainerScrollBars( void )
{
WPI_RECT r;
if( !haveMinChildRect || childrenMaximized ) {
return;
}
_wpi_getwindowrect( mdiInfo.container, &r );
if( minChildRect.top < r.top || minChildRect.bottom > r.bottom ) {
_wpi_setscrollrange( mdiInfo.container, SB_VERT, minChildRect.top,
minChildRect.bottom, FALSE );
} else {
_wpi_setscrollrange( mdiInfo.container, SB_VERT, 1, 1, FALSE );
}
if( minChildRect.left < r.left || minChildRect.right > r.right ) {
_wpi_setscrollrange( mdiInfo.container, SB_HORZ, minChildRect.left,
minChildRect.right, FALSE );
} else {
_wpi_setscrollrange( mdiInfo.container, SB_HORZ, 1, 1, FALSE );
}
} /* tryContainerScrollBars */
/*
* newChildPositions - handle re-location of a child window
*/
static void newChildPositions( void )
{
mdi_data *curr;
RECT r;
RECT orig;
if( childrenMaximized ) {
return;
}
curr = mdiHead;
memset( &minChildRect, 0, sizeof( RECT ) );
while( curr != NULL ) {
_wpi_getwindowrect( curr->hwnd, &r );
orig = minChildRect;
UnionRect( &minChildRect, &orig, &r );
haveMinChildRect = TRUE;
curr = curr->next;
}
tryContainerScrollBars();
} /* newChildPositions */
/*
* MDIResizeContainer - handle the resizing of the container window
*/
void MDIResizeContainer( void )
{
tryContainerScrollBars();
} /* MDIResizeContainer */
#endif
#endif
/*
* MDIHitClose - check if close bitmap was hit on menu of main window
*/
int MDIHitClose( HWND hwnd, WPI_MSG msg, WPI_PARAM1 wparam, WPI_PARAM2 lparam )
{
#ifndef __OS2_PM__
msg = msg;
if( childrenMaximized && wparam == HTMENU ) {
if( hitSysMenu( hwnd, lparam ) ) {
_wpi_postmessage( currentWindow, WM_SYSCOMMAND, SC_CLOSE, 0L );
return( TRUE );
}
}
#else
hwnd = hwnd;
msg = msg;
wparam = wparam;
lparam = lparam;
#endif
return( FALSE );
} /* MDIHitClose */
/*
* CheckForMessage -- check for a WM_COMMAND message that needs to be
* sent to the maximized window
*/
#ifndef __OS2_PM__
static bool CheckForMessage( HMENU menu, HWND currentWindow,
WPI_PARAM1 wparam, WPI_PARAM2 lparam )
{
#ifndef __OS2_PM__
int num;
int i;
UINT id;
UINT flags;
if( menu != NULL ) {
num = (int)_wpi_getmenuitemcount( menu );
for( i = 0; i < num; i++ ) {
flags = GetMenuState( menu, i, MF_BYPOSITION );
if( flags & MF_POPUP ) {
if( CheckForMessage( GetSubMenu( menu, i ), currentWindow,
wparam, lparam ) ) {
return( TRUE );
}
} else {
id = GetMenuItemID( menu, i );
if( id == wparam ) {
_wpi_sendmessage( currentWindow, WM_COMMAND, wparam, lparam );
return( TRUE );
}
}
}
}
#else
menu = menu;
currentWindow = currentWindow;
wparam = wparam;
lparam = lparam;
#endif
return( FALSE );
} /* CheckForMessage */
#endif
/*
* MDIIsSysCommand - see if WM_COMMAND is really a WM_SYSCOMMAND
*/
int MDIIsSysCommand( HWND hwnd, WPI_MSG msg, WPI_PARAM1 wparam, WPI_PARAM2 lparam )
{
#ifndef __OS2_PM__
HMENU sys_menu;
hwnd = hwnd;
msg = msg;
if( childrenMaximized ) {
if( LOWORD( wparam ) >= 0xF000 ) {
_wpi_sendmessage( currentWindow, WM_SYSCOMMAND, wparam, lparam );
return( TRUE );
} else {
sys_menu = GetSystemMenu( currentWindow, FALSE );
CheckForMessage( sys_menu, currentWindow, wparam, lparam );
}
}
#else
hwnd = hwnd;
msg = msg;
wparam = wparam;
lparam = lparam;
#endif
return( FALSE );
} /* MDIIsSysCommand */
static void fixSystemMenu( HWND hwnd )
{
modifyChildSystemMenu( _wpi_getsystemmenu( hwnd ) );
}
/*
* MDIChildHandleMessage - handle messages for MDI child windows
*/
int MDIChildHandleMessage( HWND hwnd, WPI_MSG msg, WPI_PARAM1 wparam,
WPI_PARAM2 lparam, WPI_MRESULT *lrc )
{
#ifndef __OS2_PM__
bool iconic;
#endif
wparam = wparam;
lparam = lparam;
lrc = lrc;
switch( msg ) {
case WM_CREATE:
fixSystemMenu( hwnd );
break;
case WM_SIZE:
case WM_MOVE:
// newChildPositions();
break;
#ifndef __OS2_PM__
case WM_SYSCOMMAND:
return( processSysCommand( hwnd, msg, wparam, lparam, lrc ) );
#endif
case WM_DESTROY:
finiWindow( hwnd );
if( childrenMaximized && mdiHead == NULL ) {
doRestoreAll();
childrenMaximized = TRUE;
}
if( currentWindow == hwnd ) {
currentWindow = NULL;
}
break;
case WM_SETFOCUS:
currentWindow = hwnd;
if( childrenMaximized ) {
mdiInfo.set_window_title( hwnd );
setMaximizedMenuConfig( hwnd );
}
break;
#ifndef __OS2_PM__
case WM_COMMAND:
if( childrenMaximized && LOWORD( wparam ) >= 0xF000 ) {
_wpi_sendmessage( currentWindow, WM_SYSCOMMAND, wparam, lparam );
return( TRUE );
}
break;
case WM_NCLBUTTONDBLCLK:
iconic = _wpi_isiconic( currentWindow );
if( !childrenMaximized && (wparam == HTCAPTION) && iconic ) {
_wpi_sendmessage( currentWindow, WM_SYSCOMMAND, SC_MAXIMIZE, 0L );
*lrc = 0;
return( TRUE );
}
break;
#endif
}
return( FALSE );
} /* MDIChildHandleMessage */
/*
* MDIContainerResized - resize MDI windows when container resized, if we're
* maximized
*/
void MDIContainerResized( void )
{
mdi_data *md;
WPI_RECT r;
WPI_RECTDIM left, top, right, bottom;
if( MDIIsMaximized() ) {
_wpi_getwindowrect( mdiInfo.container, &r );
_wpi_getrectvalues( r, &left, &top, &right, &bottom );
md = mdiHead;
while( md != NULL ) {
if( _wpi_isiconic( md->hwnd ) ) {
_wpi_movewindow( md->hwnd, 0, 0, right - left + 1,
bottom - top + 1, TRUE );
}
md = md->next;
}
}
} /* MDIContainerResized */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -