gphmain.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 507 行 · 第 1/2 页
C
507 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#include "gdefn.h"
#undef HANDLE // already defined by WPI
#undef GLOBALHANDLE
#include "win.h"
#if defined( __OS2__ )
#include "pmmenu.h"
#endif
// Amount of pixels to scroll for a line
#define LINEAMT 20
// Structure that is used to contain the scrolling information
static struct ScrollStruct {
int max;
int pixls;
int maxpos;
int minpos;
int currpos;
int line;
int page;
int currcoord;
};
#if defined( __OS2__ )
//Original Frame processing procedure
PFNWP _OldFrameProc;
extern HWND _GetWinMenuHandle();
#endif
// Variable that contains the position of where to start the repaint
struct xycoord _BitBlt_Coord;
// Static functions
static double CalScrollAmt( double, double, double, double, double );
static double CalScrollPos( double, double, double, double, double );
static struct ScrollStruct getscrolldata( HWND Wnd, int dir );
static void CalPos( struct ScrollStruct *info, WPI_PARAM1 wParam,
/*================*/WPI_PARAM2 lParam, int *newpos, int *newcoord );
WPI_MRESULT CALLBACK GraphWndProc( HWND Wnd,
WPI_MSG message,
WPI_PARAM1 wParam,
WPI_PARAM2 lParam )
//=============================================================
{
WPI_PRES Win_dc;
PAINTSTRUCT ps;
int width, height;
int x, y, t;
int h_minpos, h_maxpos, h_currpos;
int v_minpos, v_maxpos, v_currpos;
WPI_RECTDIM left, top, right, bottom;
WPI_RECT rect;
struct ScrollStruct scroll_info;
LPWDATA w;
HWND frame;
#if defined( __OS2__ )
int wheight;
WPI_RECT wrect;
#endif
w = _GetWindowData( Wnd );
if( w == NULL ) {
return( _wpi_defwindowproc( Wnd, message, wParam, lParam ) );
}
#if defined( __OS2__ )
frame = w->frame;
#else
frame = Wnd;
#endif
switch( message ) {
#if defined( __WINDOWS__ )
case WM_SETFOCUS:
SetFocus( _MainWindow );
case WM_SYSCOMMAND:
case WM_MOUSEACTIVATE:
_MakeWindowActive( w );
return( _wpi_defwindowproc( Wnd, message, wParam, lParam ) );
case WM_KILLFOCUS:
if( ( wParam != NULL) && ( wParam != _MainWindow ) ) {
_ShowWindowActive( NULL, w );
}
return( _wpi_defwindowproc( Wnd, message, wParam, lParam ) );
#else
case WM_FOCUSCHANGE:
case WM_SYSCOMMAND:
_MakeWindowActive( w );
return( _wpi_defwindowproc( Wnd, message, wParam, lParam ) );
#endif
case WM_PAINT:
// Setup
Win_dc = _wpi_beginpaint( Wnd, NULLHANDLE, &ps );
_wpi_torgbmode( Win_dc );
_wpi_getpaintrect( &ps, &rect );
_wpi_getwrectvalues( rect, &left, &top, &right, &bottom );
width = _wpi_getwidthrect( rect );
height = _wpi_getheightrect( rect );
// Copy from the memory dc to the screen
#if defined( __OS2__ )
GetClientRect( Wnd, &wrect );
wheight = _wpi_getheightrect( wrect );
y = _GetPresHeight() - wheight - _BitBlt_Coord.ycoord + top;
#else
y = _BitBlt_Coord.ycoord + top;
#endif
_wpi_bitblt( Win_dc,
left,
top,
width, height,
_Mem_dc,
_BitBlt_Coord.xcoord + left,
y,
SRCCOPY );
//Cleanup
_wpi_endpaint( Wnd, Win_dc, &ps );
break;
#if defined( __OS2__ )
case WM_CLOSE:
WinDestroyWindow( w->frame );
return( 0 );
#endif
case WM_DESTROY:
// free the system resources allocated
if( _Mem_dc ){
_wpi_deletecliprgn( _Mem_dc, _ClipRgn );
_wpi_deletecompatiblepres( _Mem_dc, _Hdc );
if( _Mem_bmp ){
_wpi_deletebitmap( _Mem_bmp );
if( !_IsStockFont() ){
_wpi_f_deletefont( _CurFnt );
}
}
#if defined( __OS2__ )
WinSendMsg( _GetWinMenuHandle(), ( ULONG )MM_DELETEITEM,
MPFROM2SHORT( ( w->handles[0] + DID_WIND_STDIO ), FALSE ), 0 );
#endif
_DestroyAWindow( w );
}
break;
case WM_VSCROLL:
scroll_info = getscrolldata( frame, SB_VERT );
CalPos( &scroll_info, wParam, lParam, &v_currpos, &y );
// Make sure we have to refresh first
if( _BitBlt_Coord.ycoord != y ) {
_BitBlt_Coord.ycoord = y;
_wpi_setscrollpos( frame,
SB_VERT,
v_currpos,
TRUE );
_wpi_invalidaterect( Wnd, NULL, 0 );
_wpi_updatewindow( Wnd );
}
return( _wpi_defwindowproc( Wnd, message, wParam, lParam ) );
case WM_HSCROLL:
scroll_info = getscrolldata( frame, SB_HORZ );
CalPos( &scroll_info, wParam, lParam, &h_currpos, &x );
// make sure we need to refresh first
if( _BitBlt_Coord.xcoord != x ) {
_BitBlt_Coord.xcoord = x;
_wpi_setscrollpos( frame,
SB_HORZ,
h_currpos,
TRUE );
_wpi_invalidaterect( Wnd, NULL, 0 );
_wpi_updatewindow( Wnd );
}
return( _wpi_defwindowproc( Wnd, message, wParam, lParam ) );
case WM_SIZE:
x = _wpi_getsystemmetrics( SM_CXSCREEN );
y = _wpi_getsystemmetrics( SM_CYSCREEN );
_wpi_getscrollrange( frame, SB_VERT, &v_minpos, &v_maxpos );
_wpi_getscrollrange( frame, SB_HORZ, &h_minpos, &h_maxpos );
_wpi_getclientrect( Wnd, &rect );
_wpi_getrectvalues( rect, &left, &top, &right, &bottom );
height = bottom - top + 1;
width = right - left + 1;
if( width >= x ) {
// hide the scroll bar
#if defined( __OS2__ )
WinShowWindow( WinWindowFromID( frame, FID_HORZSCROLL ),
FALSE );
#else
ShowScrollBar( Wnd, SB_HORZ, FALSE );
#endif
_BitBlt_Coord.xcoord = 0;
h_currpos = 0;
} else {
// if the window isn't as big as the device context
// show the scroll bar
t = x - width + 1;
if( x - _BitBlt_Coord.xcoord + 1 < width ) {
_BitBlt_Coord.xcoord = x - width + 1;
}
if( _BitBlt_Coord.xcoord == t ) {
h_currpos = h_maxpos;
} else {
h_currpos = CalScrollAmt( h_maxpos, h_minpos,
_BitBlt_Coord.xcoord,
x, width );
}
#if defined( __OS2__ )
WinShowWindow( WinWindowFromID( frame, FID_HORZSCROLL ),
TRUE );
#else
ShowScrollBar( Wnd, SB_HORZ, 1 );
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?