Sun Jan 22 18:55:33 1995 Alexandre Julliard (julliard@lamisun.epfl.ch) * [loader/resource.c] [objects/dib.c] Fixed icon loading and drawing, now that BitBlt() works correctly. * [objects/clipping.c] [objects/region.c] Implemented elliptic regions with a set of rectangle. This greatly simplifies the region code and should boost clipping performance. * [objects/color.c] Fixed bug that caused seg-fault on 24bpp displays. * [objects/bitblt.c] Fixed bug when shrinking a bitmap to more than half its size. * [windows/graphics.c] Fixed bugs in PaintRgn() and Polyline(). * [windows/nonclient.c] [windows/painting.c] [windows/winpos.c] Fixed some problems with window background painting. Thu Jan 12 12:20:25 PST 1995 Ross Biro (biro@yggdrasil.com) * [tools/build.c] * [tools/newbuild.c] * [Imakefile] * [include/wine.h] * [loader/call.S] * [loader/selector.c] * [include/segmem.h] * [misc/main.c] Changed selector code and 16/32 bit xfer code so that wine no longer has to be loaded low in memory. Changed wine to work with ELF binary formats under Linux. Sat Sep 17 11:08:49 1994 Eric Youngdale (eric@esp22) * [debugger/db_disasm.c] New instruction disassembler - borrowed from Mach kernel. Has a BSD style of license as opposed to the gdb code we were previously using which was under the GPL. Mon Jan 9 18:27:11 1995 Alexandre Julliard (julliard@lamisun.epfl.ch) * [Imakefile] Compiling with -Wall flag. * [*/*] Fixes to minimize the number of compilation warnings. * [objects/bitblt.c] Fixed BitBlt() and used the same code to rewrite PatBlt() and StretchBlt(). The three *Blt() functions should now be correct in every case (famous last words). * [objects/brush.c] [objects/dither.c] Merged the two files into brush.c * [objects/dc.c] Fixed bug when the Windows programs forget to re-select the original bitmap in a memory DC. * [objects/font.c] Tty to use 'fixed' font when the system font can't be found. * [windows/dialog.c] Tentative fix to make dialogs look better when using fixed-width fonts. * [windows/graphics.c] Partially implemented the PS_INSIDEFRAME pen style. * [windows/nonclient.c] Fix for windows that have the WS_EX_DLGMODALFRAME style bit without the WS_DLGFRAME style.
258 lines
6.2 KiB
C
258 lines
6.2 KiB
C
/*
|
|
* Default window procedure
|
|
*
|
|
* Copyright 1993 Alexandre Julliard
|
|
|
|
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include "windows.h"
|
|
#include "win.h"
|
|
#include "class.h"
|
|
#include "user.h"
|
|
#include "nonclient.h"
|
|
#include "winpos.h"
|
|
#include "syscolor.h"
|
|
#include "stddebug.h"
|
|
/* #define DEBUG_MESSAGE */
|
|
#include "debug.h"
|
|
|
|
/* Last COLOR id */
|
|
#define COLOR_MAX COLOR_BTNHIGHLIGHT
|
|
|
|
/***********************************************************************
|
|
* DEFWND_SetText
|
|
*
|
|
* Set the window text.
|
|
*/
|
|
void DEFWND_SetText( HWND hwnd, LPSTR text )
|
|
{
|
|
LPSTR textPtr;
|
|
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
|
|
|
if (wndPtr->hText) USER_HEAP_FREE( wndPtr->hText );
|
|
wndPtr->hText = USER_HEAP_ALLOC( LMEM_MOVEABLE, strlen(text) + 1 );
|
|
textPtr = (LPSTR) USER_HEAP_ADDR( wndPtr->hText );
|
|
strcpy( textPtr, text );
|
|
}
|
|
|
|
#include <assert.h>
|
|
|
|
/***********************************************************************
|
|
* DefWindowProc (USER.107)
|
|
*/
|
|
LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
|
|
{
|
|
MEASUREITEMSTRUCT *measure;
|
|
CLASS * classPtr;
|
|
LPSTR textPtr;
|
|
int len;
|
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
|
|
|
dprintf_message(stddeb, "DefWindowProc: %d %d %d %08lx\n",
|
|
hwnd, msg, wParam, lParam );
|
|
|
|
switch(msg)
|
|
{
|
|
case WM_NCCREATE:
|
|
{
|
|
CREATESTRUCT * createStruct = (CREATESTRUCT *)lParam;
|
|
if (createStruct->lpszName)
|
|
DEFWND_SetText( hwnd, createStruct->lpszName );
|
|
return 1;
|
|
}
|
|
|
|
case WM_NCCALCSIZE:
|
|
return NC_HandleNCCalcSize( hwnd, (NCCALCSIZE_PARAMS *)lParam );
|
|
|
|
case WM_PAINTICON:
|
|
case WM_NCPAINT:
|
|
return NC_HandleNCPaint( hwnd );
|
|
|
|
case WM_NCHITTEST:
|
|
return NC_HandleNCHitTest( hwnd, MAKEPOINT(lParam) );
|
|
|
|
case WM_NCLBUTTONDOWN:
|
|
return NC_HandleNCLButtonDown( hwnd, wParam, lParam );
|
|
|
|
case WM_LBUTTONDBLCLK:
|
|
case WM_NCLBUTTONDBLCLK:
|
|
return NC_HandleNCLButtonDblClk( hwnd, wParam, lParam );
|
|
|
|
case WM_NCACTIVATE:
|
|
return NC_HandleNCActivate( hwnd, wParam );
|
|
|
|
case WM_NCDESTROY:
|
|
if (wndPtr->hText) USER_HEAP_FREE(wndPtr->hText);
|
|
if (wndPtr->hVScroll) USER_HEAP_FREE(wndPtr->hVScroll);
|
|
if (wndPtr->hHScroll) USER_HEAP_FREE(wndPtr->hHScroll);
|
|
wndPtr->hText = wndPtr->hVScroll = wndPtr->hHScroll = 0;
|
|
return 0;
|
|
|
|
case WM_PAINT:
|
|
{
|
|
PAINTSTRUCT paintstruct;
|
|
BeginPaint( hwnd, &paintstruct );
|
|
EndPaint( hwnd, &paintstruct );
|
|
return 0;
|
|
}
|
|
|
|
case WM_SETREDRAW:
|
|
if (!wParam)
|
|
{
|
|
ValidateRect( hwnd, NULL );
|
|
wndPtr->flags |= WIN_NO_REDRAW;
|
|
}
|
|
else wndPtr->flags &= ~WIN_NO_REDRAW;
|
|
return 0;
|
|
|
|
case WM_CLOSE:
|
|
DestroyWindow( hwnd );
|
|
return 0;
|
|
|
|
case WM_MOUSEACTIVATE:
|
|
if (wndPtr->dwStyle & WS_CHILD)
|
|
{
|
|
LONG ret = SendMessage( wndPtr->hwndParent, WM_MOUSEACTIVATE,
|
|
wParam, lParam );
|
|
if (ret) return ret;
|
|
}
|
|
return MA_ACTIVATE;
|
|
|
|
case WM_ACTIVATE:
|
|
if (wParam) SetFocus( hwnd );
|
|
break;
|
|
|
|
case WM_WINDOWPOSCHANGING:
|
|
return WINPOS_HandleWindowPosChanging( (WINDOWPOS *)lParam );
|
|
|
|
case WM_WINDOWPOSCHANGED:
|
|
{
|
|
WINDOWPOS * winPos = (WINDOWPOS *)lParam;
|
|
if (!(winPos->flags & SWP_NOMOVE))
|
|
SendMessage( hwnd, WM_MOVE, 0,
|
|
MAKELONG( wndPtr->rectClient.left,
|
|
wndPtr->rectClient.top ));
|
|
if (!(winPos->flags & SWP_NOSIZE))
|
|
SendMessage( hwnd, WM_SIZE, SIZE_RESTORED,
|
|
MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
|
|
wndPtr->rectClient.bottom-wndPtr->rectClient.top));
|
|
return 0;
|
|
}
|
|
|
|
case WM_ERASEBKGND:
|
|
case WM_ICONERASEBKGND:
|
|
{
|
|
if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 0;
|
|
if (!classPtr->wc.hbrBackground) return 0;
|
|
if (classPtr->wc.hbrBackground <= COLOR_MAX+1)
|
|
{
|
|
HBRUSH hbrush;
|
|
hbrush = CreateSolidBrush(
|
|
GetSysColor(classPtr->wc.hbrBackground-1));
|
|
FillWindow( GetParent(hwnd), hwnd, (HDC)wParam, hbrush);
|
|
DeleteObject (hbrush);
|
|
}
|
|
else
|
|
FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
|
|
classPtr->wc.hbrBackground );
|
|
return 1;
|
|
}
|
|
|
|
case WM_GETDLGCODE:
|
|
return 0;
|
|
|
|
case WM_CTLCOLOR:
|
|
{
|
|
if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
|
|
{
|
|
SetBkColor( (HDC)wParam, RGB(255, 255, 255) );
|
|
SetTextColor( (HDC)wParam, RGB(0, 0, 0) );
|
|
UnrealizeObject( sysColorObjects.hbrushScrollbar );
|
|
return sysColorObjects.hbrushScrollbar;
|
|
}
|
|
else
|
|
{
|
|
SetBkColor( (HDC)wParam, GetSysColor(COLOR_WINDOW) );
|
|
SetTextColor( (HDC)wParam, GetSysColor(COLOR_WINDOWTEXT) );
|
|
return sysColorObjects.hbrushWindow;
|
|
}
|
|
}
|
|
|
|
case WM_GETTEXT:
|
|
{
|
|
if (wParam)
|
|
{
|
|
if (wndPtr->hText)
|
|
{
|
|
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
|
if ((int)wParam > (len = strlen(textPtr)))
|
|
{
|
|
strcpy((char *)lParam, textPtr);
|
|
return (DWORD)len;
|
|
}
|
|
}
|
|
lParam = (DWORD)NULL;
|
|
}
|
|
return (0L);
|
|
}
|
|
|
|
case WM_GETTEXTLENGTH:
|
|
{
|
|
if (wndPtr->hText)
|
|
{
|
|
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
|
return (DWORD)strlen(textPtr);
|
|
}
|
|
return (0L);
|
|
}
|
|
|
|
case WM_SETTEXT:
|
|
DEFWND_SetText( hwnd, (LPSTR)lParam );
|
|
NC_HandleNCPaint( hwnd ); /* Repaint caption */
|
|
return 0;
|
|
|
|
case WM_SETCURSOR:
|
|
if (wndPtr->dwStyle & WS_CHILD)
|
|
if (SendMessage(wndPtr->hwndParent, WM_SETCURSOR, wParam, lParam))
|
|
return TRUE;
|
|
return NC_HandleSetCursor( hwnd, wParam, lParam );
|
|
|
|
case WM_SYSCOMMAND:
|
|
return NC_HandleSysCommand( hwnd, wParam, MAKEPOINT(lParam) );
|
|
|
|
case WM_SYSKEYDOWN:
|
|
if (wParam == VK_MENU)
|
|
{ /* Send to WS_OVERLAPPED parent. TODO: Handle MDI */
|
|
HWND top;
|
|
for(top=hwnd;GetParent(top)!=0;top=GetParent(top));
|
|
SendMessage( top, WM_SYSCOMMAND, SC_KEYMENU, 0L );
|
|
}
|
|
break;
|
|
|
|
case WM_SYSKEYUP:
|
|
break;
|
|
case WM_MEASUREITEM:
|
|
measure = (MEASUREITEMSTRUCT *)lParam;
|
|
switch(measure->CtlType) {
|
|
case ODT_BUTTON:
|
|
break;
|
|
case ODT_COMBOBOX:
|
|
measure->itemHeight = 10;
|
|
/* printf("defwndproc WM_MEASUREITEM // ODT_COMBOBOX !\n");*/
|
|
break;
|
|
case ODT_LISTBOX:
|
|
measure->itemHeight = 10;
|
|
/* printf("defwndproc WM_MEASUREITEM // ODT_LISTBOX !\n");*/
|
|
break;
|
|
case ODT_MENU:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|