/* * doMaximizeAll - maximize all children */ static void doMaximizeAll( HWND first ) { mdi_data *md; bool was_max; was_max = childrenMaximized; childrenMaximized = TRUE; doMaximize( first ); if( !was_max ) { md = mdiHead; while( md != NULL ) { if( md->hwnd != first ) { if( _wpi_isiconic( md->hwnd ) ) { doMaximize( md->hwnd ); } } md = md->next; } } SetSystemMenu( first ); } /* doMaximizeAll */
/* * BkColorEnumProc - used to change the background color of all MDI children */ BOOL CALLBACK BkColorEnumProc( HWND hwnd, LONG lparam ) { img_node *node; lparam = lparam; if( _wpi_getowner( hwnd ) ) { return( TRUE ); } if( _wpi_isiconic( hwnd ) ) { return( TRUE ); } node = SelectImage( _wpi_getclient( hwnd ) ); if( node == NULL ) { return( TRUE ); } if( node->imgtype == BITMAP_IMG ) { return( TRUE ); } InvalidateRect( _wpi_getclient( hwnd ), NULL, FALSE ); InvalidateRect( node->viewhwnd, NULL, FALSE ); return( TRUE ); } /* BkColorEnumProc */
/* * 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 = NULLHANDLE; } 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 */
/* * GridEnumProc - used to grid all the children */ BOOL CALLBACK GridEnumProc( HWND hwnd, LONG lparam ) { lparam = lparam; if( _wpi_getowner( hwnd ) ) { return( 1 ); } if( _wpi_isiconic( hwnd ) ) { return( 1 ); } else { InvalidateRect( _wpi_getclient( hwnd ), NULL, FALSE ); } return( 1 ); } /* GridEnumProc */
/* * ViewEnumProc - enumerate the child windows and show the view window * for each window */ BOOL CALLBACK ViewEnumProc( HWND hwnd, LONG lparam ) { lparam = lparam; if( _wpi_getowner( hwnd ) ) { return( TRUE ); } if( _wpi_isiconic( hwnd ) ) { return( TRUE ); } else { SendMessage( hwnd, UM_SHOWVIEWWINDOW, 0, 0L ); } return( TRUE ); } /* ViewEnumProc */
/* * GridEnumProc - used to grid all the children */ BOOL CALLBACK GridEnumProc( HWND hwnd, LONG lparam ) { HWND frame; lparam = lparam; if ( _wpi_getowner(hwnd) ) { return 1; } if ( _wpi_isiconic(hwnd) ) { return 1; } else { InvalidateRect( _wpi_getclient(hwnd), NULL, FALSE ); } frame = frame; // suppress compiler warnings return 1; } /* GridEnumProc */
/* * GetPosProc - get the position of all the child windows */ BOOL CALLBACK GetPosProc( HWND hwnd, LONG lparam ) { WPI_RECT windowrect; WPI_POINT topleft; // this ends up being bottom left for PM WPI_RECTDIM left; WPI_RECTDIM top; lparam = lparam; #ifdef __OS2_PM__ if( windowIndex >= imageMax ) { return( 0 ); } #endif if( _wpi_getowner( hwnd ) != NULL ) { return( 1 ); } if( _wpi_isiconic( hwnd ) ) { windowCoords[windowIndex].x = -1; windowCoords[windowIndex].y = -1; windowIndex++; return( 1 ); } _wpi_getwindowrect( hwnd, &windowrect ); _wpi_getrectvalues( windowrect, &left, &top, NULL, NULL ); topleft.x = left; topleft.y = top; _wpi_screentoclient( ClientWindow, &topleft ); if( topleft.x < 0 ) { topleft.x = 0; } #ifndef __OS2_PM__ if( topleft.y < 0 ) { topleft.y = 0; } #endif windowCoords[windowIndex] = topleft; windowIndex++; return( 1 ); } /* GetPosProc */
/* * MDIContainerResized - resize MDI windows when container resized, if we're * maximized */ void MDIContainerResized( void ) { mdi_data *md; WPI_RECT r; WPI_RECTDIM left; WPI_RECTDIM top; WPI_RECTDIM right; WPI_RECTDIM 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 */
/* * ImgEdFrameProc - handle messages for the image editor application */ WPI_MRESULT CALLBACK ImgEdFrameProc( HWND hwnd, WPI_MSG msg, WPI_PARAM1 wparam, WPI_PARAM2 lparam ) { static BOOL window_destroyed = FALSE; static HMENU hmenu; ctl_id cmdid; img_node *node; WPI_RECT rcmain; #ifndef __OS2_PM__ about_info ai; #endif WPI_RECTDIM left, top; if( !window_destroyed ) { enableMainItems( hmenu ); } switch( msg ) { case UM_EXIT: _wpi_sendmessage( hwnd, WM_COMMAND, IMGED_CLOSEALL, 0L ); /* fall through */ case UM_EXIT_NO_SAVE: if( _wpi_getfirstchild( _wpi_getclient( ClientWindow ) ) != NULL ) { break; } #ifndef __OS2_PM__ _wpi_destroywindow( _wpi_getframe( hwnd ) ); #else _wpi_sendmessage( hwnd, WM_CLOSE, 0, 0 ); #endif break; case UM_SAVE_ALL: SaveAllImages(); break; case WM_CREATE: hmenu = _wpi_getmenu( _wpi_getframe( hwnd ) ); #ifndef __OS2_PM__ createClientWindow( hwnd ); #endif if( !InitStatusLine( hwnd ) ) { return( -1 ); } InitFunctionBar( hwnd ); InitIconInfo(); InitializeCursors(); /* * Set values from profile information ... */ if( ImgedConfigInfo.brush_size <= 5 && ImgedConfigInfo.brush_size >= 2 ) { checkBrushItem( hmenu, IMGED_2x2 - 2 + ImgedConfigInfo.brush_size ); } if( ImgedConfigInfo.grid_on ) { CheckGridItem( hmenu ); } if( ImgedConfigInfo.square_grid ) { CheckSquareGrid( hmenu ); } if( ImgedConfigInfo.show_state & SET_SHOW_VIEW ) { CheckViewItem( hmenu ); } _wpi_enablemenuitem( hmenu, IMGED_CRESET, FALSE, FALSE ); _wpi_enablemenuitem( hmenu, IMGED_RCOLOR, FALSE, FALSE ); #ifndef __OS2_PM__ // not necessary for PM InitMenus( hmenu ); #endif SetHintText( IEAppTitle ); return( 0 ); #ifdef __NT__ case WM_DROPFILES: OpenImage( (HANDLE)wparam ); break; #endif case WM_MOVE: _wpi_getwindowrect( hwnd, &rcmain ); if( !ImgedConfigInfo.ismaximized ) { ImgedConfigInfo.last_xpos = ImgedConfigInfo.x_pos; ImgedConfigInfo.last_ypos = ImgedConfigInfo.y_pos; _wpi_getrectvalues( rcmain, &left, &top, NULL, NULL ); ImgedConfigInfo.x_pos = (short)left; ImgedConfigInfo.y_pos = (short)top; } return( 0 ); case WM_SIZE: ResizeFunctionBar( lparam ); ResizeStatusBar( lparam ); #ifndef __OS2_PM__ if( ClientWindow != NULL ) { setClientSize( hwnd ); } #else resizeClientArea( lparam ); #endif if( !_imgwpi_issizeminimized( wparam ) && !_imgwpi_issizemaximized( wparam ) ) { _wpi_getwindowrect( hwnd, &rcmain ); ImgedConfigInfo.width = (short)_wpi_getwidthrect( rcmain ); ImgedConfigInfo.height = (short)_wpi_getheightrect( rcmain ); ImgedConfigInfo.ismaximized = FALSE; } else { ImgedConfigInfo.x_pos = ImgedConfigInfo.last_xpos; ImgedConfigInfo.y_pos = ImgedConfigInfo.last_ypos; ImgedConfigInfo.ismaximized = _imgwpi_issizemaximized( wparam ); } return( FALSE ); case WM_MENUSELECT: #ifndef __OS2_PM__ if( GET_WM_MENUSELECT_FLAGS( wparam, lparam ) & MF_SEPARATOR ) { break; } if( GET_WM_MENUSELECT_FLAGS( wparam, lparam ) & MF_SYSMENU ) { PrintHintTextByID( WIE_SYSMENUOPERATIONS, NULL ); break; } #endif ShowHintText( LOWORD( wparam ) ); break; case WM_COMMAND: cmdid = LOWORD( wparam ); if( !IEIsMenuIDValid( hmenu, cmdid ) ) { break; } switch( cmdid ) { case IMGED_NEW: if( !ImgedIsDDE ) { if( !NewImage( UNDEF_IMG, NULL ) ) { PrintHintTextByID( WIE_NEIMAGENOTCREATED, NULL ); } } break; case IMGED_CLOSE: node = GetCurrentNode(); if( node != NULL ) { _wpi_sendmessage( node->hwnd, WM_CLOSE, 0, 0L ); } break; case IMGED_CLOSEALL: CloseAllImages(); break; case IMGED_HELP: IEHelpRoutine(); break; case IMGED_HELP_SEARCH: IEHelpSearchRoutine(); break; case IMGED_HELP_ON_HELP: IEHelpOnHelpRoutine(); break; case IMGED_ABOUT: #ifndef __OS2_PM__ ai.owner = hwnd; ai.inst = Instance; ai.name = IEAllocRCString( WIE_ABOUTTEXT ); ai.version = IEAllocRCString( WIE_ABOUTVERSION ); ai.title = IEAllocRCString( WIE_ABOUTTITLE ); DoAbout( &ai ); if( ai.name != NULL ) { IEFreeRCString( ai.name ); } if( ai.version != NULL ) { IEFreeRCString( ai.version ); } if( ai.title != NULL ) { IEFreeRCString( ai.title ); } #endif break; #ifndef __OS2_PM__ case IMGED_DDE_UPDATE_PRJ: IEUpdateDDEEditSession(); break; #endif case IMGED_SAVE_AS: SaveFile( SB_SAVE_AS ); break; case IMGED_SAVE: SaveFile( SB_SAVE ); break; case IMGED_OPEN: if( !ImgedIsDDE ) { OpenImage( NULL ); } break; case IMGED_CLEAR: ClearImage(); break; case IMGED_NEWIMG: AddNewIcon(); break; case IMGED_SELIMG: SelectIconImg(); break; case IMGED_DELIMG: DeleteIconImg(); break; case IMGED_UNDO: UndoOp(); break; case IMGED_REDO: RedoOp(); break; case IMGED_REST: RestoreImage(); break; case IMGED_SNAP: #ifndef __OS2_PM__ SnapPicture(); #endif break; case IMGED_RIGHT: case IMGED_LEFT: case IMGED_UP: case IMGED_DOWN: ShiftImage( cmdid ); break; case IMGED_FLIPHORZ: case IMGED_FLIPVERT: FlipImage( cmdid ); break; case IMGED_ROTATECC: case IMGED_ROTATECL: RotateImage( cmdid ); break; case IMGED_PASTE: PlaceAndPaste(); break; case IMGED_COPY: IECopyImage(); break; case IMGED_CUT: CutImage(); break; case IMGED_COLOR: CheckPaletteItem( hmenu ); break; case IMGED_VIEW: CheckViewItem( hmenu ); break; case IMGED_TOOLBAR: CheckToolbarItem( hmenu ); break; case IMGED_SQUARE: CheckSquareGrid( hmenu ); break; case IMGED_SIZE: ChangeImageSize(); break; case IMGED_GRID: CheckGridItem( hmenu ); break; case IMGED_MAXIMIZE: MaximizeCurrentChild(); break; case IMGED_SETTINGS: SelectOptions(); break; case IMGED_2x2: case IMGED_3x3: case IMGED_4x4: case IMGED_5x5: checkBrushItem( hmenu, cmdid ); break; case IMGED_CEDIT: #ifndef __OS2_PM__ EditColors(); #endif break; case IMGED_CRESET: #ifndef __OS2_PM__ RestoreColors(); #endif break; case IMGED_CSCREEN: ChooseBkColor(); break; case IMGED_SCOLOR: #ifndef __OS2_PM__ SaveColorPalette(); #endif break; case IMGED_LCOLOR: #ifndef __OS2_PM__ if( LoadColorPalette() ) { _wpi_enablemenuitem( hmenu, IMGED_RCOLOR, TRUE, FALSE ); } #endif break; case IMGED_RCOLOR: RestoreColorPalette(); break; case IMGED_FREEHAND: case IMGED_LINE: case IMGED_RECTO: case IMGED_RECTF: case IMGED_CIRCLEO: case IMGED_CIRCLEF: case IMGED_FILL: case IMGED_BRUSH: case IMGED_CLIP: case IMGED_HOTSPOT: SetToolType( cmdid ); PushToolButton( cmdid ); break; case IMGED_ARRANGE: #ifndef __OS2_PM__ SendMessage( ClientWindow, WM_MDIICONARRANGE, 0, 0L ); #endif break; case IMGED_TILE: #ifndef __OS2_PM__ SendMessage( ClientWindow, WM_MDITILE, MDITILE_VERTICAL, 0L ); #endif break; case IMGED_CASCADE: #ifndef __OS2_PM__ SendMessage( ClientWindow, WM_MDICASCADE, MDITILE_SKIPDISABLED, 0L ); #endif break; case IMGED_EXIT: _wpi_sendmessage( hwnd, WM_COMMAND, IMGED_CLOSEALL, 0L ); if( _wpi_getfirstchild( _wpi_getclient( ClientWindow ) ) != NULL ) { break; } #ifndef __OS2_PM__ _wpi_destroywindow( _wpi_getframe( hwnd ) ); #else _wpi_sendmessage( hwnd, WM_CLOSE, 0, 0 ); #endif break; default: #if 1 return( _imgwpi_defframeproc( hwnd, ClientWindow, msg, wparam, lparam ) ); #else return( 0 ); #endif } return( 0 ); #ifndef __OS2_PM__ case WM_COMPACTING: RelieveUndos(); return 0; #endif case WM_QUERYENDSESSION: if( _wpi_isiconic( _wpi_getframe( hwnd ) ) ) { if( ImgedConfigInfo.ismaximized ) { _wpi_maximizewindow( _wpi_getframe( hwnd ) ); } else { _wpi_showwindow( _wpi_getframe( hwnd ), SW_SHOWNORMAL ); } } _wpi_sendmessage( hwnd, WM_COMMAND, IMGED_CLOSEALL, 0L ); if( _wpi_getfirstchild( _wpi_getclient( ClientWindow ) ) != NULL ) { return( 0 ); } return( (WPI_MRESULT)1 ); case WM_CLOSE: // wParam is non-zero if the DDE connection died if( !wparam && !ImgEdEnableMenuInput ) { // this prevents the user from closing the editor during // DDE initialization return( 0 ); } _wpi_sendmessage( hwnd, WM_COMMAND, IMGED_CLOSEALL, 0L ); #ifdef __OS2_PM__ return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); #else if( _wpi_getfirstchild( _wpi_getclient( ClientWindow ) ) != NULL ) { return( 0 ); } window_destroyed = TRUE; _wpi_destroywindow( _wpi_getframe( hwnd ) ); return( 0 ); #endif case WM_DESTROY: #ifndef __OS2_PM__ WWinHelp( HMainWindow, "resimg.hlp", HELP_QUIT, 0 ); #endif FiniStatusLine(); CleanupClipboard(); CleanupCursors(); CloseToolBar(); CloseFunctionBar(); _wpi_deletefont( SmallFont ); _wpi_postquitmessage( 0 ); return( 0 ); default: break; } return( _imgwpi_defframeproc( hwnd, ClientWindow, msg, wparam, lparam ) ); } /* ImgEdFrameProc */
bool GUIIsMinimized( gui_window *wnd ) { return( _wpi_isiconic( GUIGetParentFrameHWND( wnd ) ) ); }
/* * DrawAreaWinProc - window procedure for the drawing area window * - this window is an MDI window */ MRESULT CALLBACK DrawAreaWinProc( HWND hwnd, WPI_MSG msg, WPI_PARAM1 wparam, WPI_PARAM2 lparam ) { static WPI_POINT start_pt = { -1, -1 }; static WPI_POINT end_pt = { -1, -1 }; static WPI_POINT prev_pt = { -1, -1 }; static WPI_POINT new_pt = { -1, -1 }; static WPI_POINT pt1; static BOOL flbuttondown = FALSE; static BOOL frbuttondown = FALSE; static BOOL fdraw_shape = FALSE; static BOOL firsttime; static BOOL wasicon; int mousebutton; WPI_POINT pointsize; WPI_POINT pt2; #ifndef __OS2_PM__ CREATESTRUCT *cs; MDICREATESTRUCT *mdi_cs; MINMAXINFO *minmax; #endif img_node *node; int i; switch ( msg ) { case WM_CREATE: #ifndef __OS2_PM__ cs = (CREATESTRUCT __FAR *)lparam; mdi_cs = (MDICREATESTRUCT __FAR *)cs->lpCreateParams; node = (img_node *)mdi_cs->lParam; for( i = 0; i < node->num_of_images; i++ ) { node[i].hwnd = hwnd; } AddImageNode( node ); CreateUndoStack( node ); setTheCursor( -1, hwnd ); wasicon = FALSE; #endif firsttime = TRUE; i = i; return( 0 ); case WM_MDIACTIVATE: if( IMGED_GET_MDI_FACTIVATE( hwnd, wparam, lparam ) ) { if( _wpi_isiconic( hwnd ) ) { wasicon = TRUE; break; } else { wasicon = FALSE; FocusOnImage( hwnd ); } } return( 0 ); #ifndef __OS2_PM__ case WM_GETMINMAXINFO: node = SelectImage( hwnd ); if( node != NULL ) { minmax = (MINMAXINFO *)lparam; minmax->ptMinTrackSize.x = node->width + 2 * _wpi_getsystemmetrics( SM_CXFRAME ); minmax->ptMinTrackSize.y = node->height + 2 * _wpi_getsystemmetrics( SM_CYFRAME ) + _wpi_getsystemmetrics( SM_CYCAPTION ) - 1; } break; #endif case UM_SHOWVIEWWINDOW: ShowViewWindows( hwnd ); return 0; case WM_SIZE: if ( _imgwpi_issizerestored( wparam ) ) { ResizeChild( lparam, hwnd, firsttime ); firsttime = FALSE; if( wasicon ) { FocusOnImage( hwnd ); wasicon = FALSE; } #ifndef __OS2_PM__ } else if ( _imgwpi_issizeminimized( wparam ) ) { node = SelectImage( hwnd ); HideViewWindow( hwnd ); DeleteActiveImage(); ClearImageText(); SendMessage( ClientWindow, WM_MDINEXT, (WPARAM)(LPVOID)hwnd, 0L ); wasicon = TRUE; #endif } return( 0 ); #ifndef __OS2_PM__ case WM_CHAR: pointsize = GetPointSize( hwnd ); if( LOWORD( wparam ) == ESC_CHAR ) { if( !(lparam & 0x40000000) ) { switch( toolType ) { case IMGED_PASTE: fdraw_shape = FALSE; flbuttondown = FALSE; frbuttondown = FALSE; DontPaste( hwnd, &pt1, pointsize ); break; case IMGED_LINE: case IMGED_RECTO: case IMGED_RECTF: case IMGED_CIRCLEO: case IMGED_CIRCLEF: case IMGED_CLIP: if( !flbuttondown && !frbuttondown ) { break; } fdraw_shape = FALSE; flbuttondown = FALSE; frbuttondown = FALSE; if( toolType == IMGED_LINE ) { OutlineLine( hwnd, &start_pt, &prev_pt, &new_pt, TRUE ); } else if( toolType == IMGED_CLIP ) { OutlineClip( hwnd, &start_pt, &prev_pt, &new_pt, TRUE ); SetRectExists( FALSE ); } else { OutlineRegion( hwnd, &start_pt, &prev_pt, &new_pt, TRUE ); } break; default: break; } } } return( 0 ); #endif case WM_MOUSEMOVE: pointsize = GetPointSize( hwnd ); #ifdef __OS2_PM__ WinSetPointer( HWND_DESKTOP, hCursor[cursorIndex] ); #endif IMGED_MAKEPOINT( wparam, lparam, new_pt ); switch( toolType ) { case IMGED_SNAP: #ifndef __OS2_PM__ OutlineSnap(); #endif break; case IMGED_PASTE: pt1.x = new_pt.x / pointsize.x; pt1.y = new_pt.y / pointsize.y; pt2.x = prev_pt.x / pointsize.x; pt2.y = prev_pt.y / pointsize.y; if( pt1.x != pt2.x || pt1.y != pt2.y ) { DragClipBitmap( hwnd, &pt1, pointsize ); } SetPosInStatus( &new_pt, &pointsize, hwnd ); break; case IMGED_FREEHAND: case IMGED_BRUSH: if( flbuttondown ) { Paint( hwnd, &prev_pt, &new_pt, LMOUSEBUTTON ); } else if( frbuttondown ) { Paint( hwnd, &prev_pt, &new_pt, RMOUSEBUTTON ); } SetPosInStatus( &new_pt, &pointsize, hwnd ); break; case IMGED_LINE: case IMGED_RECTO: case IMGED_RECTF: case IMGED_CIRCLEO: case IMGED_CIRCLEF: case IMGED_CLIP: if( flbuttondown || frbuttondown ) { if( new_pt.x / pointsize.x != end_pt.x / pointsize.x || new_pt.y / pointsize.y != end_pt.y / pointsize.y ) { if( toolType == IMGED_LINE ) { OutlineLine( hwnd, &start_pt, &new_pt, &prev_pt, FALSE ); } else if( toolType == IMGED_CLIP ) { OutlineClip( hwnd, &start_pt, &new_pt, &prev_pt, FALSE ); } else { OutlineRegion( hwnd, &start_pt, &new_pt, &prev_pt, FALSE ); } end_pt = new_pt; SetSizeInStatus( hwnd, &start_pt, &new_pt, &pointsize ); } } else { SetPosInStatus( &new_pt, &pointsize, hwnd ); } break; case IMGED_FILL: SetPosInStatus( &new_pt, &pointsize, hwnd ); break; default: SetPosInStatus( &new_pt, &pointsize, hwnd ); break; } prev_pt = new_pt; return( 0 ); case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: pointsize = GetPointSize( hwnd ); SetCapture( hwnd ); if( msg == WM_LBUTTONDOWN ) { if( frbuttondown ) { break; } #ifdef __OS2_PM__ node = GetCurrentNode(); if( hwnd != node->hwnd ) { break; } #endif flbuttondown = TRUE; mousebutton = LMOUSEBUTTON; } else { if( flbuttondown ) { break; } node = GetCurrentNode(); if( hwnd != node->hwnd ) { break; } frbuttondown = TRUE; mousebutton = RMOUSEBUTTON; } fdraw_shape = TRUE; IMGED_MAKEPOINT( wparam, lparam, start_pt ); IMGED_MAKEPOINT( wparam, lparam, new_pt ); switch( toolType ) { case IMGED_SNAP: #ifndef __OS2_PM__ TransferImage( hwnd ); #endif fdraw_shape = FALSE; flbuttondown = FALSE; frbuttondown = FALSE; break; case IMGED_FREEHAND: case IMGED_BRUSH: BeginFreeHand( hwnd ); DrawSinglePoint( hwnd, &start_pt, mousebutton ); break; case IMGED_LINE: IMGED_MAKEPOINT( wparam, lparam, end_pt ); OutlineLine( hwnd, &start_pt, &new_pt, &prev_pt, TRUE ); break; case IMGED_RECTO: case IMGED_RECTF: case IMGED_CIRCLEO: case IMGED_CIRCLEF: IMGED_MAKEPOINT( wparam, lparam, end_pt ); OutlineRegion( hwnd, &start_pt, &new_pt, &prev_pt, TRUE ); break; case IMGED_CLIP: IMGED_MAKEPOINT( wparam, lparam, end_pt ); RedrawPrevClip( hwnd ); OutlineClip( hwnd, &start_pt, &new_pt, &prev_pt, TRUE ); break; case IMGED_FILL: FillArea( &start_pt, mousebutton ); RecordImage( hwnd ); break; case IMGED_HOTSPOT: SetIsSaved( hwnd, FALSE ); prev_pt.x = start_pt.x / pointsize.x; prev_pt.y = start_pt.y / pointsize.y; SetNewHotSpot( &prev_pt ); break; default: break; } prev_pt = new_pt; return 0; case WM_LBUTTONUP: case WM_RBUTTONUP: pointsize = GetPointSize( hwnd ); IMGED_MAKEPOINT( wparam, lparam, end_pt ); IMGED_MAKEPOINT( wparam, lparam, new_pt ); if( msg == WM_LBUTTONUP ) { mousebutton = LMOUSEBUTTON; } else { mousebutton = RMOUSEBUTTON; } if( fdraw_shape ) { switch( toolType ) { case IMGED_PASTE: PasteImage( &start_pt, pointsize, hwnd ); flbuttondown = FALSE; frbuttondown = FALSE; break; case IMGED_FREEHAND: case IMGED_BRUSH: if( flbuttondown || frbuttondown ) { EndFreeHand( hwnd ); RecordImage( hwnd ); } break; case IMGED_LINE: DrawLine( hwnd, &start_pt, &end_pt, mousebutton ); RecordImage( hwnd ); break; case IMGED_RECTO: case IMGED_RECTF: case IMGED_CIRCLEO: case IMGED_CIRCLEF: DisplayRegion( hwnd, &start_pt, &end_pt, mousebutton ); RecordImage( hwnd ); break; case IMGED_CLIP: SetClipRect( hwnd, &start_pt, &end_pt, pointsize ); break; default: break; } fdraw_shape = FALSE; } ReleaseCapture(); flbuttondown = FALSE; frbuttondown = FALSE; prev_pt = new_pt; return( 0 ); case WM_PAINT: RepaintDrawArea( hwnd ); return( 0 ); case WM_QUERYENDSESSION: case WM_CLOSE: if( lastChanceSave( hwnd ) ) { CloseCurrentImage( hwnd ); return( (MRESULT)1 ); } else { return( (MRESULT)0 ); } #ifndef __OS2_PM__ case WM_DESTROY: SetCursor( LoadCursor( NULL, IDC_ARROW ) ); return( 0 ); #endif default: break; } return( _imgwpi_defMDIchildproc( hwnd, msg, wparam, lparam ) ); } /* DrawAreaWinProc */
/* * doMaximize - handle maximizing an edit window */ static void doMaximize( HWND hwnd ) { DWORD style; mdi_data *md; WPI_RECT r; bool iconic; WPI_RECTDIM left; WPI_RECTDIM top; WPI_RECTDIM right; WPI_RECTDIM bottom; setMaximizedMenuConfig( hwnd ); md = MDI_DATA_FROM_HWND( hwnd ); if( mdiInfo.start_max_restore != NULL ) { mdiInfo.start_max_restore( hwnd ); } iconic = _wpi_isiconic( hwnd ); if( iconic ) { _wpi_getrestoredrect( hwnd, &md->orig_size ); } else { _wpi_getwindowrect( hwnd, &md->orig_size ); } md->orig_state = md->curr_state; md->curr_state = STATE_MAX; if( mdiInfo.set_style != NULL ) { (mdiInfo.set_style)( hwnd, TRUE ); } else { style = _wpi_getwindowlong( hwnd, GWL_STYLE ); style &= ~mdiInfo.reg_style; style |= mdiInfo.max_style; _wpi_setwindowlong( hwnd, GWL_STYLE, style ); } _wpi_setscrollrange( hwnd, SB_VERT, 1, 1, TRUE ); _wpi_setscrollrange( hwnd, SB_HORZ, 1, 1, TRUE ); _wpi_getwindowrect( mdiInfo.container, &r ); _wpi_getrectvalues( r, &left, &top, &right, &bottom ); if( !iconic ) { _wpi_offsetrect( mdiInfo.hinstance, &md->orig_size, -left, -top ); } _wpi_setrectvalues( &r, 0, 0, right-left+1, bottom-top+1 ); if( iconic ) { _wpi_setrestoredrect( hwnd, &r ); } else { _wpi_getrectvalues( r, &left, &top, &right, &bottom ); _wpi_movewindow( hwnd, left, top, right, bottom, TRUE ); } if( mdiInfo.end_max_restore != NULL ) { mdiInfo.end_max_restore( hwnd ); } _wpi_invalidaterect( hwnd, NULL, FALSE ); } /* doMaximize */
WPI_MRESULT CALLBACK GUIWindowProc( HWND hwnd, WPI_MSG msg, WPI_PARAM1 wparam, WPI_PARAM2 lparam ) { gui_window *wnd; gui_window *root; WORD param; WPI_POINT currentpoint; gui_coord point; gui_coord size; WPI_MRESULT ret; WPI_MINMAXINFO _W386FAR *info; WPI_RECT rect; HWND parent; CREATESTRUCT FAR *lpcs; wmcreate_info _W386FAR *wmcreateinfo; gui_create_info *createinfo; bool use_defproc; unsigned control_id; HWND win; #ifndef __OS2_PM__ gui_key_state key_state; RECT rc; #endif root = NULL; ret = 0L; use_defproc = FALSE; if( msg == WM_CREATE ) { lpcs = ( CREATESTRUCT FAR * )MK_FP32( (void *)lparam ); wmcreateinfo = (wmcreate_info _W386FAR *)MK_FP32( _wpi_getcreateparms( lpcs ) ); if ( wmcreateinfo != NULL ) { wnd = wmcreateinfo->wnd; createinfo = wmcreateinfo->info; if( wnd->hwnd == NULLHANDLE ) { #ifdef __OS2_PM__ if( wnd->root_frame != NULLHANDLE && wnd->root == NULLHANDLE ) { wnd->root = hwnd; } else { wnd->hwnd = hwnd; } #else if( _wpi_getparent( hwnd ) == HWND_DESKTOP ) { wnd->root = hwnd; wnd->root_frame = hwnd; } else { wnd->hwnd = hwnd; wnd->hwnd_frame = hwnd; } #endif } DoSetWindowLong( hwnd, wnd ); } } wnd = GUIGetWindow( hwnd ); if( wnd == NULL ) { return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); } if( GUIMDIProcessMessage( wnd, hwnd, msg, wparam, lparam, &ret ) ) { return( ret ); } if( wnd->root == hwnd ) { /* message for root window */ switch( msg ) { case WM_CREATE : #ifdef __OS2_PM__ wnd->root_pinfo.normal_pres = _wpi_createos2normpres( GUIMainHInst, hwnd ); #endif _wpi_getclientrect( wnd->root_frame, &wnd->root_client ); if( CreateBackgroundWnd( wnd, createinfo ) ) { return( 0 ); } return( (WPI_MRESULT)WPI_ERROR_ON_CREATE ); break; case WM_DESTROY : wnd->flags |= DOING_DESTROY; GUICloseToolBar( wnd ); //ret = _wpi_defwindowproc( hwnd, msg, wparam, lparam ); //wnd->root = NULL; //wnd->root_frame = NULL; return( 0L ); } } else if( ( wnd->root != NULLHANDLE ) && ( hwnd == wnd->hwnd ) ) { /* message for container window */ switch( msg ) { case WM_SIZE : if( !_wpi_isiconic( _wpi_getframe( hwnd ) ) ) { size.x = _wpi_getwmsizex( wparam, lparam ); size.y = _wpi_getwmsizey( wparam, lparam ); GUIDoResize( wnd, hwnd, &size ); } return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); break; case WM_MOVE : return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); break; case WM_VSCROLL : case WM_HSCROLL : case WM_CLOSE : return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); break; } } switch( msg ) { case WM_CREATE : #ifdef __OS2_PM__ wnd->hwnd_pinfo.normal_pres = _wpi_createos2normpres( GUIMainHInst, hwnd ); #endif NumWindows++; // even if -1 is returned, window will get WM_DESTROY win = GUIGetParentFrameHWND( wnd ); if( ( wnd->root_frame != NULLHANDLE ) || ( createinfo->style & GUI_POPUP ) ) { if( !GUIAddToSystemMenu( wnd, win, 0, NULL, createinfo->style ) ) { return( (WPI_MRESULT)WPI_ERROR_ON_CREATE ); } } else { if( !GUIAddToSystemMenu( wnd, win, createinfo->num_menus, createinfo->menu, createinfo->style ) ) { return( (WPI_MRESULT)WPI_ERROR_ON_CREATE ); } } _wpi_getclientrect( hwnd, &wnd->hwnd_client ); GUISetRowCol( wnd, NULL ); if( ( hwnd == wnd->hwnd ) && ( wnd->root == NULLHANDLE ) ) { GUIMDINewWindow( hwnd ); } if( GUIEVENTWND( wnd, GUI_INIT_WINDOW, NULL ) ) { wnd->flags |= SENT_INIT; GUISetScroll( wnd ); /* initalize scroll ranges */ GUIBringToFront( wnd ); return( 0 ); } else { /* app decided not to create window */ return( (WPI_MRESULT)WPI_ERROR_ON_CREATE ); } break; #if defined(__NT__) || defined(WILLOWS) case WM_CTLCOLORBTN : case WM_CTLCOLORDLG : //case WM_CTLCOLORLISTBOX : case WM_CTLCOLORSTATIC : //case WM_CTLCOLOREDIT : ret = (WPI_MRESULT)GUICtl3dCtlColorEx( msg, wparam, lparam ); if( ret == (HBRUSH)NULL ) { SetBkColor( (HDC)wparam, GetNearestColor( (HDC)wparam, GUIGetBack( wnd, GUI_BACKGROUND ) ) ); ret = (WPI_MRESULT)wnd->bk_brush; } return( ret ); #elif !defined( __OS2_PM__ ) case WM_CTLCOLOR : switch( HIWORD( lparam ) ) { case CTLCOLOR_BTN : case CTLCOLOR_DLG : case CTLCOLOR_EDIT : case CTLCOLOR_LISTBOX : case CTLCOLOR_MSGBOX : case CTLCOLOR_STATIC : ret = (WPI_MRESULT)GUICtl3dCtlColorEx( msg, wparam, lparam ); if( ret == (HBRUSH)NULL ) { SetBkColor( (HDC)wparam, GetNearestColor( (HDC)wparam, GUIGetBack( wnd, GUI_BACKGROUND ) ) ); ret = (WPI_MRESULT)wnd->bk_brush; } break; } return( ret ); #endif #ifndef __OS2_PM__ case WM_INITMENUPOPUP : return( GUIProcessInitMenuPopup( wnd, hwnd, msg, wparam, lparam ) ); case WM_MENUSELECT : return( GUIProcessMenuSelect( wnd, hwnd, msg, wparam, lparam ) ); #endif case WM_GETMINMAXINFO : info = (WPI_MINMAXINFO _W386FAR *)MK_FP32( (void *)lparam ); ret = _wpi_defwindowproc( hwnd, msg, wparam, lparam ); if( wnd->root == NULLHANDLE ) { parent = _wpi_getparent( hwnd ); _wpi_getclientrect( parent, &rect ); _wpi_setmaxposition( *info, 0, 0 ); _wpi_setmaxtracksize( info, _wpi_getwidthrect( rect ), _wpi_getheightrect( rect ) ); } return( ret ); case WM_ERASEBKGND: #ifdef __OS2_PM__ //GUIInvalidatePaintHandles( wnd ); return( (WPI_MRESULT)TRUE ); #else if( !_wpi_isiconic( hwnd ) ) { GetClientRect( hwnd, &rc ); FillRect( (HDC)wparam, &rc, wnd->bk_brush ); } use_defproc = TRUE; break; #endif #if !defined(__OS2_PM__) && !defined(WILLOWS) case WM_PAINTICON : { HICON old; old = SET_HICON( wnd->hwnd, wnd->icon ); ret = _wpi_defwindowproc( hwnd, msg, wparam, lparam ); SET_HICON( wnd->hwnd, old ); return( ret ); } #endif case WM_PAINT: if( _wpi_isiconic( hwnd ) ) { return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); } else { GUIPaint( wnd, hwnd, FALSE ); } break; #ifndef __OS2_PM__ case WM_ACTIVATEAPP : root = GUIGetRootWindow(); ActivateNC( root, wparam ); if( GUICurrWnd != NULL ) { ActivateNC( GUICurrWnd, wparam ); } use_defproc = (bool)wparam; // I'm cheating and using 'use_defproc' // outside of its self-documented purpose if( root ) GUIEVENTWND( root, GUI_ACTIVATEAPP, &use_defproc ); use_defproc = TRUE; break; #if 0 // this repaints the nc client area when the window loses focus to // a window that is not a descendant of a GUI window case WM_KILLFOCUS : if( !GUIIsGUIChild( (HWND)wparam ) ) { ActivateNC( wnd, FALSE ); } break; #endif case WM_SETFOCUS : if( !_wpi_ismsgsetfocus( msg, lparam ) ) { return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); } if( !EditControlHasFocus ) { if( SetFocusToParent() ) { return( 0L ); } } break; #endif case WM_VSCROLL : case WM_HSCROLL : GUIProcessScrollMsg( wnd, msg, wparam, lparam ); return( 0L ); #ifdef __NT__ case WM_MOUSEWHEEL : { // Try to handle mousewheel messages... // Fake them into GUIProcessScrollMsg() // as "normal" vertical scroll messages. short gcWheelDelta; //wheel delta from roll WORD wKey; // The wnd I get is not the same as WM_VSCROLL : above gets... // Note to self: Fix it... // Seems like the main app window gets the message, rather than // the MDI clients... gcWheelDelta = HIWORD(wparam); wKey = LOWORD(wparam); // Scroll wheel upwards gives 120 // " " downward " -120 if( wnd != GUICurrWnd ) // Send to child window with focus wnd = GUICurrWnd; if( gcWheelDelta > 0 ) { // positive - scroll up if( wKey == MK_CONTROL || wKey == MK_SHIFT ) GUIProcessScrollMsg( wnd, WM_VSCROLL, SB_PAGEUP, 0L ); else GUIProcessScrollMsg( wnd, WM_VSCROLL, SB_LINEUP, 0L ); } else { // negative - scroll down if( wKey == MK_CONTROL || wKey == MK_SHIFT ) GUIProcessScrollMsg( wnd, WM_VSCROLL, SB_PAGEDOWN, 0L ); else GUIProcessScrollMsg( wnd, WM_VSCROLL, SB_LINEDOWN, 0L ); } // Inform GUI system we are done with scrolling for now. GUIProcessScrollMsg( wnd, WM_VSCROLL, SB_ENDSCROLL, 0 ); } return( 0L ); #endif case WM_MOVE : use_defproc = TRUE; if( wnd->flags & DOING_CLOSE ) { break; } if( !GUIParentHasFlags( wnd, IS_MINIMIZED ) ) { GUIEVENTWND( wnd, GUI_MOVE, NULL ); } use_defproc = TRUE; break; case WM_SIZE: use_defproc = TRUE; if( wnd->flags & DOING_CLOSE ) { break; } if( _wpi_isiconic( _wpi_getframe( hwnd ) ) ) { wnd->flags |= IS_MINIMIZED; if( wnd->style & GUI_CHANGEABLE_FONT ) { GUIEnableSysMenuItem( wnd, GUI_CHANGE_FONT, FALSE ); } GUIEVENTWND( wnd, GUI_ICONIFIED, NULL ); if( GUIMDI ) { GUIBringNewToFront( wnd ); } } else { wnd->flags &= ~IS_MINIMIZED; size.x = _wpi_getwmsizex( wparam, lparam ); size.y = _wpi_getwmsizey( wparam, lparam ); GUIDoResize( wnd, hwnd, &size ); if( wnd->flags & IS_ROOT ) { win = GUIGetParentFrameHWND( wnd ); if( !_wpi_isiconic( win ) ) { GUIMaximizeZoomedChildren( wnd ); } } } //Call back to tell about resizing so system tray can be used WndSizeChange( hwnd, wparam, lparam ); break; case WM_MOUSEMOVE: currentpoint.x = GET_WM_MOUSEMOVE_POSX( wparam, lparam ); currentpoint.y = GET_WM_MOUSEMOVE_POSY( wparam, lparam ); point.x = currentpoint.x; point.y = currentpoint.y; GUIScreenToScaleR( &point ); if( ( currentpoint.x != prevpoint.x ) || ( currentpoint.y != prevpoint.y ) ) { prevpoint.x = currentpoint.x; prevpoint.y = currentpoint.y; SendPointEvent( wparam, lparam, wnd, GUI_MOUSEMOVE, TRUE ); } break; #ifndef __OS2_PM__ case WM_NCLBUTTONDOWN : case WM_NCMBUTTONDOWN : case WM_NCRBUTTONDOWN : CheckDoFront( wnd ); use_defproc = TRUE; break; case WM_RBUTTONDOWN: _wpi_setcapture( hwnd ); CheckDoFront( wnd ); SendPointEvent( wparam, lparam, wnd, GUI_RBUTTONDOWN, TRUE ); break; #else case WM_RBUTTONDOWN : WPI_MAKEPOINT( wparam, lparam, currentpoint ); win = PM1632WinWindowFromPoint( hwnd, ¤tpoint, FALSE ); if( ( win != (HWND)NULL) && ( win != hwnd ) ) { control_id = _wpi_getdlgctrlid( win ); if( control_id != 0 ) { GUIEVENTWND( wnd, GUI_CONTROL_RCLICKED, &control_id ); } } else { _wpi_setcapture( hwnd ); CheckDoFront( wnd ); SendPointEvent( wparam, lparam, wnd, GUI_RBUTTONDOWN, TRUE ); } break; #endif case WM_LBUTTONDOWN: _wpi_setcapture( hwnd ); CheckDoFront( wnd ); SendPointEvent( wparam, lparam, wnd, GUI_LBUTTONDOWN, TRUE ); use_defproc = TRUE; break; case WM_LBUTTONUP: _wpi_releasecapture(); SendPointEvent( wparam, lparam, wnd, GUI_LBUTTONUP, TRUE ); use_defproc = TRUE; break; case WM_RBUTTONUP: _wpi_releasecapture(); SendPointEvent( wparam, lparam, wnd, GUI_RBUTTONUP, TRUE ); break; case WM_LBUTTONDBLCLK: CheckDoFront( wnd ); SendPointEvent( wparam, lparam, wnd, GUI_LBUTTONDBLCLK, TRUE ); break; case WM_RBUTTONDBLCLK: CheckDoFront( wnd ); SendPointEvent( wparam, lparam, wnd, GUI_RBUTTONDBLCLK, TRUE ); break; case WM_SYSCOMMAND: param = _wpi_getid( wparam ); switch( param ) { case SC_NEXTWINDOW : if( GUIMDI ) { NextWndToFront( hwnd ); return( 0L ); } default : if( ( param & 0xf000 ) == ( SC_NEXTWINDOW & 0xf000 ) ) { /* top value same for all SC_* values */ return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); } else { ProcessMenu( wnd, param ); } break; } break; #ifdef __OS2_PM__ case WM_CONTROL : GUIProcessControlNotification( SHORT1FROMMP(wparam), SHORT2FROMMP(wparam), wnd ); break; #else case WM_PARENTNOTIFY: if( ( LOWORD(wparam) == WM_RBUTTONDOWN ) || ( LOWORD(wparam) == WM_LBUTTONDOWN ) || ( LOWORD(wparam) == WM_MBUTTONDOWN ) ) { if( wnd->root == NULLHANDLE ) { CheckDoFront( wnd ); } } if( LOWORD(wparam) == WM_RBUTTONDOWN ) { WPI_MAKEPOINT( wparam, lparam, currentpoint ); MapWindowPoints( hwnd, (HWND)NULL, ¤tpoint, 1 ); win = _wpi_windowfrompoint( currentpoint ); control_id = _wpi_getdlgctrlid( win ); if( control_id != 0 ) { if( _wpi_getparent(win) == hwnd ) { GUIEVENTWND( wnd, GUI_CONTROL_RCLICKED, &control_id ); } } } break; case WM_ENDSESSION : { gui_end_session es; es.endsession = (bool)wparam; es.logoff = (bool)( lparam == 0x80000000L ); GUIEVENTWND( wnd, GUI_ENDSESSION, &es ); return( 0L ); } case WM_QUERYENDSESSION : { gui_end_session es; es.endsession = (bool)wparam; es.logoff = (bool)( lparam == 0x80000000L ); // ENDSESSION_LOGOFF if( !GUIEVENTWND( wnd, GUI_QUERYENDSESSION, &es ) ) { return( TRUE ); } return( 0L ); } #endif case WM_COMMAND: if( _wpi_ismenucommand( wparam, lparam ) || IsToolBarCommand( wnd, wparam, lparam ) ) { /* from menu or toolbar */ ProcessMenu( wnd, _wpi_getid( wparam ) ); //SetFocusToParent(); } else { GUIProcessControlMsg( wparam, lparam, wnd, NULL ); } use_defproc = TRUE; break; #ifndef __OS2_PM__ case WM_VKEYTOITEM : use_defproc = FALSE; ret = -1; GUIGetKeyState( &key_state.state ); if( ( GUIWindowsMapKey( wparam, lparam, &key_state.key ) ) ) { ret = GUIEVENTWND( wnd, GUI_KEYTOITEM, &key_state ); } break; #endif #ifdef __OS2_PM__ case WM_CHAR : case WM_TRANSLATEACCEL : #else case WM_MENUCHAR : case WM_SYSKEYDOWN : case WM_SYSKEYUP : case WM_KEYUP : case WM_KEYDOWN : #endif return( GUIProcesskey( hwnd, msg, wparam, lparam ) ); case WM_CLOSE : if( wnd->flags & DOING_CLOSE ) { return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); } else if( wnd->style & GUI_CLOSEABLE ) { if( GUIEVENTWND( wnd, GUI_CLOSE, NULL ) ) { wnd->flags |= DOING_CLOSE; if( wnd->flags & IS_ROOT ) { return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); } else { _wpi_destroywindow( wnd->hwnd_frame ); } } } return( 0L ); // Message to deal with tray icons (Win 95 and NT 4.0 ). case WM_TRAYCALLBACK : TrayCallBack( hwnd, wparam, lparam ); return( 0L ); case WM_DESTROY : wnd->flags |= DOING_DESTROY; NumWindows--; GUIEVENTWND( wnd, GUI_DESTROY, NULL ); //ret = _wpi_defwindowproc( hwnd, msg, wparam, lparam ); GUIDestroyAllChildren( wnd ); if( wnd->flags & IS_ROOT ) { GUIDestroyAllPopupsWithNoParent(); } GUIFreeWindowMemory( wnd, FALSE, FALSE ); if( NumWindows == 0 ) { _wpi_postquitmessage( 0 ); Posted = TRUE; } return( 0L ); default: use_defproc = TRUE; } if( use_defproc ) { return( _wpi_defwindowproc( hwnd, msg, wparam, lparam ) ); } else { return( ret ); } }