bool GUITrackFloatingPopup( gui_window *wnd, gui_point *location, gui_mouse_track track, gui_ctl_id *curr_id ) { WPI_POINT pt; ULONG flags; GUI_RECTDIM left, top, right, bottom; HMENU popup; if( ( popup = GUIHFloatingPopup ) == (HMENU)NULL ) { return( false ); } GUIScaleToScreenRPt( location ); _wpi_getrectvalues( wnd->hwnd_client_rect, &left, &top, &right, &bottom ); location->x += left; location->y += top; if( GUI_DO_HSCROLL( wnd ) ) { location->x -= GUIGetScrollPos( wnd, SB_HORZ ); } if( GUI_DO_VSCROLL( wnd ) ) { location->y -= GUIGetScrollPos( wnd, SB_VERT ); } CurrId = NO_SELECT; if( ( curr_id != NULL ) && ( *curr_id != 0 ) ) { CurrId = *curr_id; } location->y = _wpi_cvth_y( location->y, (bottom - top) ); pt.x = location->x; pt.y = location->y; _wpi_mapwindowpoints( wnd->hwnd, HWND_DESKTOP, &pt, 1 ); flags = TPM_LEFTALIGN; if( track & GUI_TRACK_LEFT ) { flags |= TPM_LEFTBUTTON; } if( track & GUI_TRACK_RIGHT ) { flags |= TPM_RIGHTBUTTON; } InitComplete = false; GUIFlushKeys(); _wpi_trackpopupmenu( popup, flags, pt.x, pt.y, wnd->hwnd_frame ); _wpi_destroymenu( popup ); GUIHFloatingPopup = NULLHANDLE; if( ( CurrId != NO_SELECT ) && ( curr_id != NULL ) ) { *curr_id = CurrId; } CurrId = NO_SELECT; GUIDeleteFloatingPopups( wnd ); return( true ); }
void GUIMakeRelative( gui_window *wnd, WPI_POINT *pt, gui_point *point ) { WPI_RECT rect; GUI_RECTDIM left, top, right, bottom; rect = wnd->hwnd_client_rect; _wpi_mapwindowpoints( wnd->hwnd, HWND_DESKTOP, (WPI_LPPOINT)&rect, 2 ); _wpi_getrectvalues( rect, &left, &top, &right, &bottom ); point->x = pt->x - left; point->y = pt->y - top; if( GUI_DO_HSCROLL( wnd ) || GUI_DO_VSCROLL( wnd ) ) { if( GUI_DO_HSCROLL( wnd ) ) { point->x += GUIGetScrollPos( wnd, SB_HORZ ); } if( GUI_DO_VSCROLL( wnd ) ) { point->y += GUIGetScrollPos( wnd, SB_VERT ); } } GUIScreenToScaleRPt( point ); }
if( GUI_VSCROLL_ROWS( wnd ) ) { return( GUIFromTextY( 1, wnd ) ); } else { return( 1 ); } } } void GUIScroll( gui_window *wnd, int bar, int change ) { int new; int old; int range; int screen_size; old = GUIGetScrollPos( wnd, bar ); new = old + change; if( change < 0 ) { if( new < 0 ) { new = 0; change = new - old; } } screen_size = GUIGetScrollScreenSize( wnd, bar ); if( change > 0 ) { range = GUIGetScrollRange( wnd, bar ); if( new > range ) { new = range; if( new < 0 ) { new = 0; }
static bool DrawRect( gui_window *wnd, gui_rect *rect, WPI_COLOUR colour, bool fill, bool outline ) { WPI_RECT wnd_rect; gui_coord pos; gui_coord size; HBRUSH brush; int hscroll; int vscroll; int win_height; if( ( rect->width == 0 ) || ( rect->height == 0 ) ) { return( false ); } if( GUI_DO_VSCROLL( wnd ) ) { vscroll = GUIGetScrollPos( wnd, SB_VERT ); } else { vscroll = 0; } if( GUI_DO_HSCROLL( wnd ) ) { hscroll = GUIGetScrollPos( wnd, SB_HORZ ); } else { hscroll = 0; } win_height = _wpi_getheightrect( wnd->hwnd_client_rect ); pos.x = rect->x; pos.y = rect->y; size.x = rect->width; if( rect->width < 0 ) { pos.x += rect->width; size.x *= -1; } size.y = rect->height; if( rect->height < 0 ) { pos.y += rect->height; size.y *= -1; } GUIScaleToScreenR( &pos ); GUIScaleToScreenR( &size ); pos.x -= hscroll; pos.y -= vscroll; pos.y = _wpi_cvth_y_size_plus1( pos.y, win_height, size.y ); _wpi_setrectvalues( &wnd_rect, pos.x, pos.y, pos.x + size.x, pos.y + size.y ); if( GUIIsRectInUpdateRect( wnd, &wnd_rect ) ) { brush = _wpi_createsolidbrush( colour ); if( fill ) { _wpi_fillrect( wnd->hdc, &wnd_rect, colour, brush ); } if( outline ) { _wpi_borderrect( wnd->hdc, &wnd_rect, brush, colour, colour ); } _wpi_deletebrush( brush ); } return( true ); }
static bool DrawLine( gui_window *wnd, gui_point *start, gui_point *end, gui_line_styles style, gui_ord thickness, WPI_COLOUR colour ) { gui_point my_start; gui_point my_end; HPEN pen; int win_style; gui_coord coord; HPEN old_pen; int hscroll; int vscroll; WPI_POINT pt; int win_height; my_start = *start; my_end = *end; GUIScaleToScreenRPt( &my_start ); GUIScaleToScreenRPt( &my_end ); if( GUI_DO_VSCROLL( wnd ) ) { vscroll = GUIGetScrollPos( wnd, SB_VERT ); } else { vscroll = 0; } if( GUI_DO_HSCROLL( wnd ) ) { hscroll = GUIGetScrollPos( wnd, SB_HORZ ); } else { hscroll = 0; } switch( style ) { case GUI_PEN_SOLID : win_style = PS_SOLID; coord.x = thickness; GUIScaleToScreenR( &coord ); break; case GUI_PEN_DASH : coord.x = 1; win_style = PS_DASH; break; case GUI_PEN_DOT : coord.x = 1; win_style = PS_DOT; break; case GUI_PEN_DASHDOT : coord.x = 1; win_style = PS_DASHDOT; break; case GUI_PEN_DASHDOTDOT : coord.x = 1; win_style = PS_DASHDOTDOT; break; default: coord.x = 0; win_style = 0; break; } pen = _wpi_createpen( win_style, coord.x, colour ); old_pen = _wpi_selectpen( wnd->hdc, pen ); win_height = _wpi_getheightrect( wnd->hwnd_client_rect ); pt.x = my_start.x - hscroll; pt.y = my_start.y - vscroll; pt.y = _wpi_cvth_y_plus1( pt.y, win_height ); _wpi_movetoex( wnd->hdc, &pt, &pt ); pt.x = my_end.x - hscroll; pt.y = my_end.y - vscroll; pt.y = _wpi_cvth_y_plus1( pt.y, win_height ); _wpi_lineto( wnd->hdc, &pt ); if( old_pen != NULLHANDLE ) { _wpi_getoldpen( wnd->hdc, old_pen ); } _wpi_deletepen( pen ); return( true ); }
void GUIDrawTextBitmapRGB( gui_window *wnd, const char *text, size_t length, int height, gui_coord *pos, WPI_COLOUR fore, WPI_COLOUR back, gui_ord extentx, bool draw_extent, int bitmap ) { int nDrawX, nDrawY; UINT lenx; HBRUSH brush; HBRUSH old_brush; HPEN pen; HPEN old_pen; int old_rop; size_t num_chars; WPI_RECT rect; gui_coord indent; int hscroll_pos; gui_coord extent; WPI_COLOUR colour; GUI_RECTDIM left, top, right, bottom; GUI_RECTDIM paint_left, paint_top, paint_right, paint_bottom; WPI_RECT paint_rect; WPI_RECT draw_rect; //draw_cache dcache; if( ( wnd->hdc == NULLHANDLE ) || ( wnd->ps == NULL ) || ( ( text == NULL ) && ( bitmap == 0 ) ) || ( ( bitmap != 0 ) && ( height == 0 ) ) ) { return; } old_rop = 0; old_brush = (HBRUSH)NULL; brush = (HBRUSH)NULL; old_pen = (HPEN)NULL; pen = (HPEN)NULL; GUIGetMetrics( wnd ); if( !bitmap ) { height = AVGYCHAR(GUItm); } rect = wnd->hwnd_client; _wpi_getrectvalues( rect, &left, &top, &right, &bottom); _wpi_getpaintrect( wnd->ps, &paint_rect ); _wpi_getwrectvalues( paint_rect, &paint_left, &paint_top, &paint_right, &paint_bottom ); top = paint_top / height * height; bottom = ( paint_bottom + height - 1) / height * height; if( GUI_DO_HSCROLL( wnd ) ) { hscroll_pos = GUIGetScrollPos( wnd, SB_HORZ ); } else { hscroll_pos = 0; } if( bitmap == 0 ) { num_chars = strlen( text ); if( num_chars > length ) { num_chars = length; } } indent.x = pos->x; indent.y = pos->y; GUIScaleToScreenR( &indent ); nDrawY = indent.y; if( GUI_DO_VSCROLL( wnd ) ) { nDrawY -= GUIGetScrollPos( wnd, SB_VERT ); } nDrawX = left; nDrawX += ( indent.x - hscroll_pos ); if( bitmap > 0 ) { lenx = length ; } else { lenx = GUIGetTextExtentX( wnd, text, num_chars ); } if( draw_extent ) { /* blanks out some portion of rest of the line */ if( extentx != GUI_NO_COLUMN ) { extent.x = extentx; GUIScaleToScreen( &extent ); right = nDrawX + extent.x; } } else { right = nDrawX + lenx; } nDrawY = _wpi_cvth_y_size( nDrawY, _wpi_getheightrect(wnd->hwnd_client), height ); _wpi_setrectvalues( &draw_rect, nDrawX, nDrawY, right, nDrawY+height ); if( GUIIsRectInUpdateRect( wnd, &draw_rect ) ) { colour = _wpi_getnearestcolor( wnd->hdc, back ); brush = _wpi_createsolidbrush( colour ); pen = _wpi_createpen( PS_SOLID, 1, colour ); if( pen == NULLHANDLE ) { GUIError(LIT( Pen_Failed )); } old_brush = _wpi_selectbrush( wnd->hdc, brush ); old_pen = _wpi_selectpen( wnd->hdc, pen ); #ifdef __OS2_PM__ _wpi_rectangle( wnd->hdc, nDrawX, nDrawY+1, right, nDrawY + height - 1 ); #else _wpi_rectangle( wnd->hdc, nDrawX, nDrawY, right, nDrawY + height); #endif /* if visible even with scrolling */ if( nDrawX < ( paint_right + hscroll_pos ) ) { if( bitmap > 0 ) { GUIDrawBitmap( bitmap, wnd->hdc, nDrawX, nDrawY, colour); } else { #ifdef __OS2_PM__ nDrawY += _wpi_metricdescent( GUItm ); #endif old_rop = _wpi_setrop2( wnd->hdc, R2_COPYPEN ); SetText( wnd, fore, back ); _wpi_textout( wnd->hdc, nDrawX, nDrawY, text, num_chars ); } } /* restore old resources */ if( old_rop != 0 ) { _wpi_setrop2( wnd->hdc, old_rop ); } if( old_brush != (HBRUSH)NULL ) { _wpi_getoldbrush( wnd->hdc, old_brush ); } if( brush != (HBRUSH)NULL ) { _wpi_deletebrush( brush ); } if( old_pen != (HPEN)NULL ) { _wpi_getoldpen( wnd->hdc, old_pen ); } if( pen != (HPEN)NULL ) { _wpi_deletepen( pen ); } } }