guixwind.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,469 行 · 第 1/3 页
C
1,469 行
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 ) ) {
SET_HBRBACKGROUND( hwnd, (UINT)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 ) ) { /* from menu */
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 );
}
}
#if defined(__NT__) || defined(WILLOWS)
VOID CALLBACK GUITimerProc( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
{
gui_window *wnd;
gui_timer_event timer;
uMsg = uMsg; dwTime = dwTime;
wnd = GUIGetWindow( hwnd );
if( wnd != NULL ) {
timer.id = idEvent;
GUIEVENTWND( wnd, GUI_TIMER_EVENT, &timer );
}
}
void GUIStartTimer( gui_window *wnd, int id, int msec )
{
SetTimer( wnd->hwnd, id, msec, GUITimerProc );
}
void GUIStopTimer( gui_window *wnd, int id )
{
KillTimer( wnd->hwnd, id );
}
#endif
#ifdef __OS2_PM__
WPI_MRESULT CALLBACK GUIFrameProc( HWND hwnd, WPI_MSG msg, WPI_PARAM1 wparam,
WPI_PARAM2 lparam )
{
HWND client;
bool call_def;
WPI_MRESULT ret;
gui_window *wnd;
call_def = TRUE;
ret = 0L;
client = WinWindowFromID( hwnd, FID_CLIENT );
wnd = GUIGetWindow( client );
if( wnd != NULL ) {
switch( msg ) {
case WM_SAVEAPPLICATION:
call_def = TRUE; // I'm cheating and using 'call_def'
// outside of its self-documented purpose
GUIEVENTWND( wnd, GUI_ENDSESSION, &call_def );
return( 0L );
case WM_TRANSLATEACCEL: {
// Don't let OS/2 process F10 as an accelerator
// Note: similar code exists in guimapky.c but we need to
// take different default action
PQMSG pqmsg = wparam;
USHORT flags = SHORT1FROMMP(pqmsg->mp1);
USHORT vkey = SHORT2FROMMP(pqmsg->mp2);
if( (flags & KC_VIRTUALKEY) && (vkey == VK_F10) )
return( (WPI_MRESULT)FALSE );
}
break;
case WM_CHAR:
return( GUIProcesskey( hwnd, msg, wparam, lparam ) );
break;
case WM_INITMENUPOPUP :
ret = GUIProcessInitMenuPopup( wnd, hwnd, msg, wparam, lparam );
return( ret );
case WM_MENUSELECT:
return( GUIProcessMenuSelect( wnd, hwnd, msg, wparam, lparam ) );
case WM_SETFOCUS:
if( !lparam ) {
ActivateNC( wnd, FALSE );
}
break;
case WM_ACTIVATE:
if( wparam ) {
CheckDoFront( wnd );
}
break;
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
CheckDoFront( wnd );
break;
case WM_VSCROLL :
case WM_HSCROLL :
GUIProcessScrollMsg( wnd, msg, wparam, lparam );
call_def = FALSE;
break;
}
}
if( call_def ) {
return( _wpi_callwindowproc( oldFrameProc, hwnd, msg, wparam, lparam ) );
}
return( ret );
}
#endif
void GUISetF10Menus( bool setting )
{
setting = setting;
}
bool GUIIsFirstInstance( void )
{
return( FirstInstance );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?