Release 0.4.10
Mon Nov 22 13:58:56 1993 David Metcalfe <david@prism.demon.co.uk> * [windows/scroll.c] Preliminary implementations of ScrollWindow, ScrollDC and ScrollWindowEx. Nov 21, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [controls/listbox.c] Optimization of redraw during 'Add' or 'Insert'. * [controls/scroll.c] Optimization of WM_PAINT during 'thumbtracking'. * [controls/button.c] Add of beta implement of 'BS_OWNERDRAW' * [controls/static.c] Style 'SS_ICON' new supported. * [misc/message.c] Begin of implemantation of MB_XXX styles. * [loader/resource.c] Function LoadIcon() : now prepare transparency Bitmap mask. Function LoadCursor() : now prepare a 'X pixmapcursor'. New function SetCursor() : not finished. New function ShowCursor() : not finished. New function AccessResource() : stub. * [obj/dib.c] Function DrawIcon(): deugging phase of icon transparency mask. * [loader/library.c] new file for news functions LoadLibrary() & FreeLibrary(). * [sysres.dll] Resources only 16bits DLL for System Resources, icons, etc... Sun Nov 14 14:39:06 1993 julliard@di.epfl.ch (Alexandre Julliard) * [include/dialog.h] [windows/dialog.c] Simplified dialog template parsing. Implemented DialogBoxIndirect(). * [windows/win.c] Fixed bug in CreateWindow() when aborting window creation. Modified UpdateWindow() to only update visible windows. Implemented IsWindow(). Nov 14, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [controls/listbox.c] Listbox control window : new messages. * [controls/combo.c] Combo box control window : new messages. * [misc/message.c] Moved stub MessageBox() to this new file. Implemented of a callback, now MessageBox show a window. * [loader/resource.c] New function DestroyIcon() New function DestroyCursor() Filled stub LoadIcon() Filled stub LoadCursor() Bug fixed in FindResourceByName() : missing lseek(). * [obj/dib.c] New function DrawIcon() * [windows/win.c] New function CloseWindow() New function OpenIcon() New function IsIconic() New Function FindWindow() Sun Nov 14 08:27:19 1993 Karl Guenter Wuensch (hz225wu@unidui.uni-duisburg.de) * [loader/selector.c] Wrote AllocCStoDSAlias() and AllocDStoCSAlias() Sun Nov 14 08:27:19 1993 Bob Amstadt (bob at amscons) * [loader/selector.c] Wrote AllocSelector() and PrestoChangoSelector(). YUK! Sat Nov 13 13:56:42 1993 Bob Amstadt (bob at amscons) * [loader/resource.c] Wrote FindResource(), LoadResource(), LockResource(), and FreeResource() * [include/segmem.h] [loader/selector.c] [loader/signal.h] Changed selector allocation method. Sun Nov 10 08:27:19 1993 Karl Guenter Wuensch (hz225wu@unidui.uni-duisburg.de) * [if1632/callback.c if1632/call.S if1632/user.spec] added Catch (KERNEL.55) and Throw (KERNEL.56) Nov 7, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [controls/scroll.c] Scroll bar control window Bug resolved : Painting message before scroll visible. * [controls/listbox.c] Listbox control window Destroy cleanup. * [controls/combo.c] Combo box control window Destroy cleanup. * [controls/button.c] GetCheck Message now return is state. * [windows/win.c] New function IsWindowVisible()
This commit is contained in:
parent
0e60778484
commit
e399fc3636
123
ChangeLog
123
ChangeLog
|
@ -1,3 +1,126 @@
|
||||||
|
Mon Nov 22 13:58:56 1993 David Metcalfe <david@prism.demon.co.uk>
|
||||||
|
|
||||||
|
* [windows/scroll.c]
|
||||||
|
Preliminary implementations of ScrollWindow, ScrollDC and
|
||||||
|
ScrollWindowEx.
|
||||||
|
|
||||||
|
Nov 21, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
|
||||||
|
|
||||||
|
* [controls/listbox.c]
|
||||||
|
Optimization of redraw during 'Add' or 'Insert'.
|
||||||
|
|
||||||
|
* [controls/scroll.c]
|
||||||
|
Optimization of WM_PAINT during 'thumbtracking'.
|
||||||
|
|
||||||
|
* [controls/button.c]
|
||||||
|
Add of beta implement of 'BS_OWNERDRAW'
|
||||||
|
|
||||||
|
* [controls/static.c]
|
||||||
|
Style 'SS_ICON' new supported.
|
||||||
|
|
||||||
|
* [misc/message.c]
|
||||||
|
Begin of implemantation of MB_XXX styles.
|
||||||
|
|
||||||
|
* [loader/resource.c]
|
||||||
|
Function LoadIcon() : now prepare transparency Bitmap mask.
|
||||||
|
Function LoadCursor() : now prepare a 'X pixmapcursor'.
|
||||||
|
New function SetCursor() : not finished.
|
||||||
|
New function ShowCursor() : not finished.
|
||||||
|
New function AccessResource() : stub.
|
||||||
|
|
||||||
|
* [obj/dib.c]
|
||||||
|
Function DrawIcon(): deugging phase of icon transparency mask.
|
||||||
|
|
||||||
|
* [loader/library.c]
|
||||||
|
new file for news functions LoadLibrary() & FreeLibrary().
|
||||||
|
|
||||||
|
* [sysres.dll]
|
||||||
|
Resources only 16bits DLL for System Resources, icons, etc...
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Sun Nov 14 14:39:06 1993 julliard@di.epfl.ch (Alexandre Julliard)
|
||||||
|
|
||||||
|
* [include/dialog.h] [windows/dialog.c]
|
||||||
|
Simplified dialog template parsing.
|
||||||
|
Implemented DialogBoxIndirect().
|
||||||
|
|
||||||
|
* [windows/win.c]
|
||||||
|
Fixed bug in CreateWindow() when aborting window creation.
|
||||||
|
Modified UpdateWindow() to only update visible windows.
|
||||||
|
Implemented IsWindow().
|
||||||
|
|
||||||
|
Nov 14, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
|
||||||
|
|
||||||
|
* [controls/listbox.c]
|
||||||
|
Listbox control window : new messages.
|
||||||
|
|
||||||
|
* [controls/combo.c]
|
||||||
|
Combo box control window : new messages.
|
||||||
|
|
||||||
|
* [misc/message.c]
|
||||||
|
Moved stub MessageBox() to this new file.
|
||||||
|
Implemented of a callback, now MessageBox show a window.
|
||||||
|
|
||||||
|
* [loader/resource.c]
|
||||||
|
New function DestroyIcon()
|
||||||
|
New function DestroyCursor()
|
||||||
|
Filled stub LoadIcon()
|
||||||
|
Filled stub LoadCursor()
|
||||||
|
Bug fixed in FindResourceByName() : missing lseek().
|
||||||
|
|
||||||
|
* [obj/dib.c]
|
||||||
|
New function DrawIcon()
|
||||||
|
|
||||||
|
* [windows/win.c]
|
||||||
|
New function CloseWindow()
|
||||||
|
New function OpenIcon()
|
||||||
|
New function IsIconic()
|
||||||
|
New Function FindWindow()
|
||||||
|
|
||||||
|
Sun Nov 14 08:27:19 1993 Karl Guenter Wuensch (hz225wu@unidui.uni-duisburg.de)
|
||||||
|
|
||||||
|
* [loader/selector.c]
|
||||||
|
Wrote AllocCStoDSAlias() and AllocDStoCSAlias()
|
||||||
|
|
||||||
|
Sun Nov 14 08:27:19 1993 Bob Amstadt (bob at amscons)
|
||||||
|
|
||||||
|
* [loader/selector.c]
|
||||||
|
Wrote AllocSelector() and PrestoChangoSelector(). YUK!
|
||||||
|
|
||||||
|
Sat Nov 13 13:56:42 1993 Bob Amstadt (bob at amscons)
|
||||||
|
|
||||||
|
* [loader/resource.c]
|
||||||
|
Wrote FindResource(), LoadResource(), LockResource(),
|
||||||
|
and FreeResource()
|
||||||
|
|
||||||
|
* [include/segmem.h] [loader/selector.c] [loader/signal.h]
|
||||||
|
Changed selector allocation method.
|
||||||
|
|
||||||
|
Sun Nov 10 08:27:19 1993 Karl Guenter Wuensch (hz225wu@unidui.uni-duisburg.de)
|
||||||
|
|
||||||
|
* [if1632/callback.c if1632/call.S if1632/user.spec]
|
||||||
|
added Catch (KERNEL.55) and Throw (KERNEL.56)
|
||||||
|
|
||||||
|
Nov 7, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
|
||||||
|
|
||||||
|
* [controls/scroll.c]
|
||||||
|
Scroll bar control window
|
||||||
|
Bug resolved : Painting message before scroll visible.
|
||||||
|
|
||||||
|
* [controls/listbox.c]
|
||||||
|
Listbox control window
|
||||||
|
Destroy cleanup.
|
||||||
|
|
||||||
|
* [controls/combo.c]
|
||||||
|
Combo box control window
|
||||||
|
Destroy cleanup.
|
||||||
|
|
||||||
|
* [controls/button.c]
|
||||||
|
GetCheck Message now return is state.
|
||||||
|
|
||||||
|
* [windows/win.c]
|
||||||
|
New function IsWindowVisible()
|
||||||
|
|
||||||
Mon Nov 1 14:40:21 1993 julliard@di.epfl.ch (Alexandre Julliard)
|
Mon Nov 1 14:40:21 1993 julliard@di.epfl.ch (Alexandre Julliard)
|
||||||
|
|
||||||
* [if1632/user.spec]
|
* [if1632/user.spec]
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,6 +1,6 @@
|
||||||
######################################################################
|
######################################################################
|
||||||
# These variables are inherited by the sub-makefiles
|
# These variables are inherited by the sub-makefiles
|
||||||
DEBUGOPTS=-DDEBUG_RESOURCE
|
DEBUGOPTS=
|
||||||
COPTS=-O2 -m486
|
COPTS=-O2 -m486
|
||||||
INCLUDE_DIR=include
|
INCLUDE_DIR=include
|
||||||
LDFLAGS=
|
LDFLAGS=
|
||||||
|
|
13
README
13
README
|
@ -31,6 +31,19 @@ For example, to run Windows' solitaire:
|
||||||
Have a nice game of solitaire, but be careful. Emulation isn't perfect.
|
Have a nice game of solitaire, but be careful. Emulation isn't perfect.
|
||||||
So, occassionally it will crash.
|
So, occassionally it will crash.
|
||||||
|
|
||||||
|
WHAT'S NEW with version 0.4.10: (see ChangeLog for details)
|
||||||
|
- Bug fixes
|
||||||
|
- More scroll bar functions
|
||||||
|
- More icon and cursor handling
|
||||||
|
|
||||||
|
WHAT'S NEW with version 0.4.9: (see ChangeLog for details)
|
||||||
|
- Bug fixes
|
||||||
|
- real MessageBox()
|
||||||
|
- New resource functions
|
||||||
|
- Icon functions
|
||||||
|
- Selector manipulation functions
|
||||||
|
- Catch()/Throw()
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.7: (see ChangeLog for details)
|
WHAT'S NEW with version 0.4.7: (see ChangeLog for details)
|
||||||
- More dialog box functions
|
- More dialog box functions
|
||||||
- More DOS interrupts
|
- More DOS interrupts
|
||||||
|
|
|
@ -9,6 +9,7 @@ static char Copyright2[] = "Copyright David Metcalfe, 1993";
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
#include "user.h"
|
||||||
|
|
||||||
LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam);
|
LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam);
|
||||||
|
|
||||||
|
@ -48,6 +49,10 @@ static LONG UB_Paint(HWND hWnd);
|
||||||
static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
|
static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
|
||||||
static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
|
static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
|
||||||
static LONG UB_KillFocus(HWND hWnd);
|
static LONG UB_KillFocus(HWND hWnd);
|
||||||
|
static LONG OB_Paint(HWND hWnd);
|
||||||
|
static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
|
||||||
|
static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
|
||||||
|
static LONG OB_KillFocus(HWND hWnd);
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -60,7 +65,7 @@ typedef struct
|
||||||
LONG (*getCheckfn)();
|
LONG (*getCheckfn)();
|
||||||
} BTNFN;
|
} BTNFN;
|
||||||
|
|
||||||
#define MAX_BTN_TYPE 10
|
#define MAX_BTN_TYPE 12
|
||||||
|
|
||||||
static BTNFN btnfn[MAX_BTN_TYPE] =
|
static BTNFN btnfn[MAX_BTN_TYPE] =
|
||||||
{
|
{
|
||||||
|
@ -153,7 +158,25 @@ static BTNFN btnfn[MAX_BTN_TYPE] =
|
||||||
(LONG(*)())RB_KillFocus,
|
(LONG(*)())RB_KillFocus,
|
||||||
(LONG(*)())RB_SetCheck,
|
(LONG(*)())RB_SetCheck,
|
||||||
(LONG(*)())RB_GetCheck
|
(LONG(*)())RB_GetCheck
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
(LONG(*)())NULL, /* Not defined */
|
||||||
|
(LONG(*)())NULL,
|
||||||
|
(LONG(*)())NULL,
|
||||||
|
(LONG(*)())NULL,
|
||||||
|
(LONG(*)())NULL,
|
||||||
|
(LONG(*)())NULL,
|
||||||
|
(LONG(*)())NULL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
(LONG(*)())OB_Paint, /* BS_OWNERDRAW */
|
||||||
|
(LONG(*)())OB_LButtonDown,
|
||||||
|
(LONG(*)())OB_LButtonUp,
|
||||||
|
(LONG(*)())NULL,
|
||||||
|
(LONG(*)())OB_KillFocus,
|
||||||
|
(LONG(*)())NULL,
|
||||||
|
(LONG(*)())NULL
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -239,7 +262,7 @@ LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
|
||||||
|
|
||||||
case BM_GETCHECK:
|
case BM_GETCHECK:
|
||||||
if (btnfn[style].getCheckfn)
|
if (btnfn[style].getCheckfn)
|
||||||
(btnfn[style].getCheckfn)(hWnd);
|
return (btnfn[style].getCheckfn)(hWnd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -954,3 +977,91 @@ static LONG UB_KillFocus(HWND hWnd)
|
||||||
UpdateWindow(hWnd);
|
UpdateWindow(hWnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* Ownerdrawn Button Functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
static LONG OB_Paint(HWND hWnd)
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
HDC hDC;
|
||||||
|
RECT rc;
|
||||||
|
HANDLE hDis;
|
||||||
|
LPDRAWITEMSTRUCT lpdis;
|
||||||
|
WND *wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
hDC = BeginPaint(hWnd, &ps);
|
||||||
|
GetClientRect(hWnd, &rc);
|
||||||
|
hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
|
||||||
|
lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
|
||||||
|
lpdis->hDC = hDC;
|
||||||
|
lpdis->itemID = 0;
|
||||||
|
CopyRect(&lpdis->rcItem, &rc);
|
||||||
|
lpdis->CtlID = wndPtr->wIDmenu;
|
||||||
|
lpdis->CtlType = ODT_BUTTON;
|
||||||
|
lpdis->itemAction = ODA_DRAWENTIRE;
|
||||||
|
/* printf("ownerdrawn button WM_DRAWITEM CtrlID=%X\n", lpdis->CtlID);*/
|
||||||
|
SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis);
|
||||||
|
USER_HEAP_FREE(hDis);
|
||||||
|
EndPaint(hWnd, &ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
|
||||||
|
{
|
||||||
|
HDC hDC;
|
||||||
|
RECT rc;
|
||||||
|
HANDLE hDis;
|
||||||
|
LPDRAWITEMSTRUCT lpdis;
|
||||||
|
WND *wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
/* SetFocus(hWnd); */
|
||||||
|
SetCapture(hWnd);
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
GetClientRect(hWnd, &rc);
|
||||||
|
if (PtInRect(&rc, MAKEPOINT(lParam)))
|
||||||
|
NOTIFY_PARENT(hWnd, BN_CLICKED);
|
||||||
|
GetClientRect(hWnd, &rc);
|
||||||
|
hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
|
||||||
|
lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
|
||||||
|
lpdis->hDC = hDC;
|
||||||
|
lpdis->itemID = 0;
|
||||||
|
CopyRect(&lpdis->rcItem, &rc);
|
||||||
|
lpdis->CtlID = wndPtr->wIDmenu;
|
||||||
|
lpdis->CtlType = ODT_BUTTON;
|
||||||
|
lpdis->itemAction = ODA_SELECT;
|
||||||
|
SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis);
|
||||||
|
USER_HEAP_FREE(hDis);
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
}
|
||||||
|
|
||||||
|
static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
|
||||||
|
{
|
||||||
|
HDC hDC;
|
||||||
|
RECT rc;
|
||||||
|
HANDLE hDis;
|
||||||
|
LPDRAWITEMSTRUCT lpdis;
|
||||||
|
WND *wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
ReleaseCapture();
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
GetClientRect(hWnd, &rc);
|
||||||
|
if (PtInRect(&rc, MAKEPOINT(lParam)))
|
||||||
|
NOTIFY_PARENT(hWnd, BN_CLICKED);
|
||||||
|
GetClientRect(hWnd, &rc);
|
||||||
|
hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
|
||||||
|
lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
|
||||||
|
lpdis->hDC = hDC;
|
||||||
|
lpdis->itemID = 0;
|
||||||
|
CopyRect(&lpdis->rcItem, &rc);
|
||||||
|
lpdis->CtlID = wndPtr->wIDmenu;
|
||||||
|
lpdis->CtlType = ODT_BUTTON;
|
||||||
|
lpdis->itemAction = ODA_SELECT;
|
||||||
|
SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis);
|
||||||
|
USER_HEAP_FREE(hDis);
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
}
|
||||||
|
|
||||||
|
static LONG OB_KillFocus(HWND hWnd)
|
||||||
|
{
|
||||||
|
InvalidateRect(hWnd, NULL, FALSE);
|
||||||
|
UpdateWindow(hWnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
120
controls/combo.c
120
controls/combo.c
|
@ -74,16 +74,20 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
||||||
WND *wndPtr;
|
WND *wndPtr;
|
||||||
LPHEADCOMBO lphc;
|
LPHEADCOMBO lphc;
|
||||||
char str[128];
|
char str[128];
|
||||||
|
PAINTSTRUCT paintstruct;
|
||||||
static RECT rectsel;
|
static RECT rectsel;
|
||||||
switch(message)
|
switch(message)
|
||||||
{
|
{
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
CreateComboStruct(hwnd);
|
CreateComboStruct(hwnd);
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
width = wndPtr->rectClient.right - wndPtr->rectClient.left;
|
|
||||||
height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
|
|
||||||
lphc = ComboGetStorageHeader(hwnd);
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
if (lphc == NULL) return 0;
|
if (lphc == NULL) return 0;
|
||||||
|
#ifdef DEBUG_COMBO
|
||||||
|
printf("Combo WM_CREATE %lX !\n", lphc);
|
||||||
|
#endif
|
||||||
|
width = wndPtr->rectClient.right - wndPtr->rectClient.left;
|
||||||
|
height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
|
||||||
lphc->hWndDrop = CreateWindow("BUTTON", "",
|
lphc->hWndDrop = CreateWindow("BUTTON", "",
|
||||||
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
width - 16, 0, 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
|
width - 16, 0, 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
|
||||||
|
@ -94,25 +98,23 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
||||||
WS_CHILD | WS_CLIPCHILDREN | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,
|
WS_CHILD | WS_CLIPCHILDREN | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,
|
||||||
wndPtr->rectClient.left, wndPtr->rectClient.top + 16, width, height,
|
wndPtr->rectClient.left, wndPtr->rectClient.top + 16, width, height,
|
||||||
wndPtr->hwndParent, 1, wndPtr->hInstance, (LPSTR)MAKELONG(0, hwnd));
|
wndPtr->hwndParent, 1, wndPtr->hInstance, (LPSTR)MAKELONG(0, hwnd));
|
||||||
/*
|
|
||||||
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
||||||
*/
|
|
||||||
InvalidateRect(lphc->hWndEdit, NULL, TRUE);
|
|
||||||
UpdateWindow(lphc->hWndEdit);
|
|
||||||
InvalidateRect(lphc->hWndDrop, NULL, TRUE);
|
|
||||||
UpdateWindow(lphc->hWndDrop);
|
|
||||||
#ifdef DEBUG_COMBO
|
#ifdef DEBUG_COMBO
|
||||||
printf("Combo Creation Drop=%X LBox=%X!\n", lphc->hWndDrop, lphc->hWndLBox);
|
printf("Combo Creation Drop=%X LBox=%X!\n", lphc->hWndDrop, lphc->hWndLBox);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
lphc = ComboGetStorageHeader(hwnd);
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
if (lphc == 0) return 0;
|
||||||
DestroyWindow(lphc->hWndDrop);
|
DestroyWindow(lphc->hWndDrop);
|
||||||
DestroyWindow(lphc->hWndEdit);
|
DestroyWindow(lphc->hWndEdit);
|
||||||
|
/*
|
||||||
DestroyWindow(lphc->hWndLBox);
|
DestroyWindow(lphc->hWndLBox);
|
||||||
|
*/
|
||||||
free(lphc);
|
free(lphc);
|
||||||
|
*((LPHEADCOMBO *)&wndPtr->wExtra[1]) = 0;
|
||||||
#ifdef DEBUG_COMBO
|
#ifdef DEBUG_COMBO
|
||||||
printf("Combo WM_DESTROY !\n");
|
printf("Combo WM_DESTROY %lX !\n", lphc);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -128,24 +130,33 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
||||||
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
|
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
|
||||||
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
|
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
|
||||||
ShowWindow(lphc->hWndLBox, SW_SHOW);
|
ShowWindow(lphc->hWndLBox, SW_SHOW);
|
||||||
|
/*
|
||||||
|
SetFocus(lphc->hWndLBox);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/*
|
||||||
|
SetFocus(lphc->hWndEdit);
|
||||||
|
*/
|
||||||
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
||||||
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
|
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
|
||||||
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
|
if (y != LB_ERR) {
|
||||||
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
|
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
|
||||||
printf("combo hide\n");
|
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (LOWORD(lParam) == lphc->hWndLBox) {
|
if (LOWORD(lParam) == lphc->hWndLBox) {
|
||||||
switch(HIWORD(lParam))
|
switch(HIWORD(lParam))
|
||||||
{
|
{
|
||||||
case LBN_SELCHANGE:
|
case LBN_SELCHANGE:
|
||||||
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
|
lphc->dwState = lphc->dwState & (CB_SHOWDROPDOWN ^ 0xFFFF);
|
||||||
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
||||||
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
|
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
|
||||||
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
|
if (y != LB_ERR) {
|
||||||
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
|
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
|
||||||
|
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
|
||||||
|
}
|
||||||
SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
|
SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
|
||||||
MAKELONG(hwnd, CBN_SELCHANGE));
|
MAKELONG(hwnd, CBN_SELCHANGE));
|
||||||
break;
|
break;
|
||||||
|
@ -165,6 +176,8 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
||||||
case WM_CTLCOLOR:
|
case WM_CTLCOLOR:
|
||||||
return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
|
return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
|
BeginPaint( hwnd, &paintstruct );
|
||||||
|
EndPaint( hwnd, &paintstruct );
|
||||||
lphc = ComboGetStorageHeader(hwnd);
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
InvalidateRect(lphc->hWndEdit, NULL, TRUE);
|
InvalidateRect(lphc->hWndEdit, NULL, TRUE);
|
||||||
UpdateWindow(lphc->hWndEdit);
|
UpdateWindow(lphc->hWndEdit);
|
||||||
|
@ -175,17 +188,6 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
||||||
UpdateWindow(lphc->hWndLBox);
|
UpdateWindow(lphc->hWndLBox);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case WM_MOUSEMOVE:
|
|
||||||
if ((wParam & MK_LBUTTON) != 0) {
|
|
||||||
y = HIWORD(lParam);
|
|
||||||
if (y < 4) {
|
|
||||||
lphc = ComboGetStorageHeader(hwnd);
|
|
||||||
}
|
|
||||||
GetClientRect(hwnd, &rect);
|
|
||||||
if (y > (rect.bottom - 4)) {
|
|
||||||
lphc = ComboGetStorageHeader(hwnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case CB_ADDSTRING:
|
case CB_ADDSTRING:
|
||||||
#ifdef DEBUG_COMBO
|
#ifdef DEBUG_COMBO
|
||||||
printf("CB_ADDSTRING '%s' !\n", (LPSTR)lParam);
|
printf("CB_ADDSTRING '%s' !\n", (LPSTR)lParam);
|
||||||
|
@ -196,6 +198,10 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
||||||
printf("CB_GETLBTEXT #%u !\n", wParam);
|
printf("CB_GETLBTEXT #%u !\n", wParam);
|
||||||
lphc = ComboGetStorageHeader(hwnd);
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
return(SendMessage(lphc->hWndLBox, LB_GETTEXT, wParam, lParam));
|
return(SendMessage(lphc->hWndLBox, LB_GETTEXT, wParam, lParam));
|
||||||
|
case CB_GETLBTEXTLEN:
|
||||||
|
printf("CB_GETLBTEXTLEN !\n");
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
return(SendMessage(lphc->hWndLBox, LB_GETTEXTLEN, wParam, lParam));
|
||||||
case CB_INSERTSTRING:
|
case CB_INSERTSTRING:
|
||||||
printf("CB_INSERTSTRING '%s' !\n", (LPSTR)lParam);
|
printf("CB_INSERTSTRING '%s' !\n", (LPSTR)lParam);
|
||||||
lphc = ComboGetStorageHeader(hwnd);
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
@ -210,17 +216,65 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
||||||
return(SendMessage(lphc->hWndLBox, LB_RESETCONTENT, 0, 0L));
|
return(SendMessage(lphc->hWndLBox, LB_RESETCONTENT, 0, 0L));
|
||||||
case CB_DIR:
|
case CB_DIR:
|
||||||
printf("ComboBox CB_DIR !\n");
|
printf("ComboBox CB_DIR !\n");
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
return(SendMessage(lphc->hWndLBox, LB_DIR, wParam, lParam));
|
return(SendMessage(lphc->hWndLBox, LB_DIR, wParam, lParam));
|
||||||
case CB_FINDSTRING:
|
case CB_FINDSTRING:
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
return(SendMessage(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam));
|
return(SendMessage(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam));
|
||||||
case CB_GETCOUNT:
|
case CB_GETCOUNT:
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L));
|
return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L));
|
||||||
case CB_GETCURSEL:
|
case CB_GETCURSEL:
|
||||||
printf("ComboBox CB_GETCURSEL !\n");
|
printf("ComboBox CB_GETCURSEL !\n");
|
||||||
return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L));
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
return(SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L));
|
||||||
case CB_SETCURSEL:
|
case CB_SETCURSEL:
|
||||||
printf("ComboBox CB_SETCURSEL wParam=%x !\n", wParam);
|
printf("ComboBox CB_SETCURSEL wParam=%X !\n", wParam);
|
||||||
return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, wParam, 0L));
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
return(SendMessage(lphc->hWndLBox, LB_SETCURSEL, wParam, 0L));
|
||||||
|
case CB_GETEDITSEL:
|
||||||
|
printf("ComboBox CB_GETEDITSEL !\n");
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
/* return(SendMessage(lphc->hWndEdit, EM_GETSEL, 0, 0L)); */
|
||||||
|
break;
|
||||||
|
case CB_SETEDITSEL:
|
||||||
|
printf("ComboBox CB_SETEDITSEL lParam=%lX !\n", lParam);
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
/* return(SendMessage(lphc->hWndEdit, EM_SETSEL, 0, lParam)); */
|
||||||
|
break;
|
||||||
|
case CB_SELECTSTRING:
|
||||||
|
printf("ComboBox CB_SELECTSTRING !\n");
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
break;
|
||||||
|
case CB_SHOWDROPDOWN:
|
||||||
|
printf("ComboBox CB_SHOWDROPDOWN !\n");
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
lphc->dwState = lphc->dwState | CB_SHOWDROPDOWN;
|
||||||
|
if (wParam != 0) {
|
||||||
|
ShowWindow(lphc->hWndLBox, SW_SHOW);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
|
||||||
|
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
||||||
|
SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
|
||||||
|
MAKELONG(hwnd, CBN_DROPDOWN));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CB_GETITEMDATA:
|
||||||
|
printf("ComboBox CB_GETITEMDATA wParam=%X !\n", wParam);
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
return(SendMessage(lphc->hWndLBox, LB_GETITEMDATA, wParam, 0L));
|
||||||
|
break;
|
||||||
|
case CB_SETITEMDATA:
|
||||||
|
printf("ComboBox CB_SETITEMDATA wParam=%X lParam=%lX !\n", wParam, lParam);
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
return(SendMessage(lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam));
|
||||||
|
break;
|
||||||
|
case CB_LIMITTEXT:
|
||||||
|
printf("ComboBox CB_LIMITTEXT !\n");
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
/* return(SendMessage(lphc->hWndEdit, EM_LIMITTEXT, wParam, 0L)); */
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return DefWindowProc( hwnd, message, wParam, lParam );
|
return DefWindowProc( hwnd, message, wParam, lParam );
|
||||||
|
@ -235,6 +289,10 @@ LPHEADCOMBO ComboGetStorageHeader(HWND hwnd)
|
||||||
WND *wndPtr;
|
WND *wndPtr;
|
||||||
LPHEADCOMBO lphc;
|
LPHEADCOMBO lphc;
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
if (wndPtr == 0) {
|
||||||
|
printf("Bad Window handle on ComboBox !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
lphc = *((LPHEADCOMBO *)&wndPtr->wExtra[1]);
|
lphc = *((LPHEADCOMBO *)&wndPtr->wExtra[1]);
|
||||||
return lphc;
|
return lphc;
|
||||||
}
|
}
|
||||||
|
@ -246,6 +304,10 @@ int CreateComboStruct(HWND hwnd)
|
||||||
WND *wndPtr;
|
WND *wndPtr;
|
||||||
LPHEADCOMBO lphc;
|
LPHEADCOMBO lphc;
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
if (wndPtr == 0) {
|
||||||
|
printf("Bad Window handle on ComboBox !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
lphc = (LPHEADCOMBO)malloc(sizeof(HEADCOMBO));
|
lphc = (LPHEADCOMBO)malloc(sizeof(HEADCOMBO));
|
||||||
*((LPHEADCOMBO *)&wndPtr->wExtra[1]) = lphc;
|
*((LPHEADCOMBO *)&wndPtr->wExtra[1]) = lphc;
|
||||||
lphc->dwState = 0;
|
lphc->dwState = 0;
|
||||||
|
|
|
@ -107,6 +107,9 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message,
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
CreateListBoxStruct(hwnd);
|
CreateListBoxStruct(hwnd);
|
||||||
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
|
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
|
#ifdef DEBUG_LISTBOX
|
||||||
|
printf("ListBox WM_CREATE %lX !\n", lphl);
|
||||||
|
#endif
|
||||||
createStruct = (CREATESTRUCT *)lParam;
|
createStruct = (CREATESTRUCT *)lParam;
|
||||||
if (HIWORD(createStruct->lpCreateParams) != 0)
|
if (HIWORD(createStruct->lpCreateParams) != 0)
|
||||||
lphl->hWndLogicParent = (HWND)HIWORD(createStruct->lpCreateParams);
|
lphl->hWndLogicParent = (HWND)HIWORD(createStruct->lpCreateParams);
|
||||||
|
@ -122,10 +125,14 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message,
|
||||||
return 0;
|
return 0;
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
lphl = ListBoxGetStorageHeader(hwnd);
|
lphl = ListBoxGetStorageHeader(hwnd);
|
||||||
|
if (lphl == 0) return 0;
|
||||||
ListBoxResetContent(hwnd);
|
ListBoxResetContent(hwnd);
|
||||||
DestroyWindow(lphl->hWndScroll);
|
DestroyWindow(lphl->hWndScroll);
|
||||||
free(lphl);
|
free(lphl);
|
||||||
printf("ListBox WM_DESTROY !\n");
|
*((LPHEADLIST *)&wndPtr->wExtra[1]) = 0;
|
||||||
|
#ifdef DEBUG_LISTBOX
|
||||||
|
printf("ListBox WM_DESTROY %lX !\n", lphl);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case WM_VSCROLL:
|
case WM_VSCROLL:
|
||||||
|
@ -164,6 +171,10 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
|
/*
|
||||||
|
SetFocus(hwnd);
|
||||||
|
*/
|
||||||
|
SetCapture(hwnd);
|
||||||
lphl = ListBoxGetStorageHeader(hwnd);
|
lphl = ListBoxGetStorageHeader(hwnd);
|
||||||
if (lphl == NULL) return 0;
|
if (lphl == NULL) return 0;
|
||||||
lphl->PrevSelected = lphl->ItemSelected;
|
lphl->PrevSelected = lphl->ItemSelected;
|
||||||
|
@ -174,6 +185,7 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message,
|
||||||
UpdateWindow(hwnd);
|
UpdateWindow(hwnd);
|
||||||
return 0;
|
return 0;
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
|
ReleaseCapture();
|
||||||
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
|
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
if (lphl == NULL) return 0;
|
if (lphl == NULL) return 0;
|
||||||
if (lphl->PrevSelected != lphl->ItemSelected)
|
if (lphl->PrevSelected != lphl->ItemSelected)
|
||||||
|
@ -248,8 +260,10 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message,
|
||||||
case LB_DIR:
|
case LB_DIR:
|
||||||
printf("ListBox LB_DIR !\n");
|
printf("ListBox LB_DIR !\n");
|
||||||
wRet = ListBoxDirectory(hwnd, wParam, (LPSTR)lParam);
|
wRet = ListBoxDirectory(hwnd, wParam, (LPSTR)lParam);
|
||||||
InvalidateRect(hwnd, NULL, TRUE);
|
if (IsWindowVisible(hwnd)) {
|
||||||
UpdateWindow(hwnd);
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
|
UpdateWindow(hwnd);
|
||||||
|
}
|
||||||
return wRet;
|
return wRet;
|
||||||
case LB_ADDSTRING:
|
case LB_ADDSTRING:
|
||||||
wRet = ListBoxAddString(hwnd, (LPSTR)lParam);
|
wRet = ListBoxAddString(hwnd, (LPSTR)lParam);
|
||||||
|
@ -315,30 +329,38 @@ LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message,
|
||||||
printf("ListBox LB_SETCURSEL wParam=%x !\n", wParam);
|
printf("ListBox LB_SETCURSEL wParam=%x !\n", wParam);
|
||||||
#endif
|
#endif
|
||||||
wRet = ListBoxSetCurSel(hwnd, wParam);
|
wRet = ListBoxSetCurSel(hwnd, wParam);
|
||||||
InvalidateRect(hwnd, NULL, TRUE);
|
if (IsWindowVisible(hwnd)) {
|
||||||
UpdateWindow(hwnd);
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
|
UpdateWindow(hwnd);
|
||||||
|
}
|
||||||
return wRet;
|
return wRet;
|
||||||
case LB_SETSEL:
|
case LB_SETSEL:
|
||||||
printf("ListBox LB_SETSEL wParam=%x lParam=%lX !\n", wParam, lParam);
|
printf("ListBox LB_SETSEL wParam=%x lParam=%lX !\n", wParam, lParam);
|
||||||
wRet = ListBoxSetSel(hwnd, wParam);
|
wRet = ListBoxSetSel(hwnd, wParam);
|
||||||
InvalidateRect(hwnd, NULL, TRUE);
|
if (IsWindowVisible(hwnd)) {
|
||||||
UpdateWindow(hwnd);
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
|
UpdateWindow(hwnd);
|
||||||
|
}
|
||||||
return wRet;
|
return wRet;
|
||||||
case LB_SETTOPINDEX:
|
case LB_SETTOPINDEX:
|
||||||
printf("ListBox LB_SETTOPINDEX wParam=%x !\n", wParam);
|
printf("ListBox LB_SETTOPINDEX wParam=%x !\n", wParam);
|
||||||
lphl = ListBoxGetStorageHeader(hwnd);
|
lphl = ListBoxGetStorageHeader(hwnd);
|
||||||
lphl->FirstVisible = wParam;
|
lphl->FirstVisible = wParam;
|
||||||
SetScrollPos(lphl->hWndScroll, WM_VSCROLL, lphl->FirstVisible, TRUE);
|
SetScrollPos(lphl->hWndScroll, WM_VSCROLL, lphl->FirstVisible, TRUE);
|
||||||
InvalidateRect(hwnd, NULL, TRUE);
|
if (IsWindowVisible(hwnd)) {
|
||||||
UpdateWindow(hwnd);
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
|
UpdateWindow(hwnd);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case LB_SETITEMHEIGHT:
|
case LB_SETITEMHEIGHT:
|
||||||
#ifdef DEBUG_LISTBOX
|
#ifdef DEBUG_LISTBOX
|
||||||
printf("ListBox LB_SETITEMHEIGHT wParam=%x lParam=%lX !\n", wParam, lParam);
|
printf("ListBox LB_SETITEMHEIGHT wParam=%x lParam=%lX !\n", wParam, lParam);
|
||||||
#endif
|
#endif
|
||||||
wRet = ListBoxSetItemHeight(hwnd, wParam, lParam);
|
wRet = ListBoxSetItemHeight(hwnd, wParam, lParam);
|
||||||
InvalidateRect(hwnd, NULL, TRUE);
|
if (IsWindowVisible(hwnd)) {
|
||||||
UpdateWindow(hwnd);
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
|
UpdateWindow(hwnd);
|
||||||
|
}
|
||||||
return wRet;
|
return wRet;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -381,6 +403,10 @@ void StdDrawListBox(HWND hwnd)
|
||||||
char C[128];
|
char C[128];
|
||||||
h = 0;
|
h = 0;
|
||||||
hdc = BeginPaint( hwnd, &ps );
|
hdc = BeginPaint( hwnd, &ps );
|
||||||
|
if (!IsWindowVisible(hwnd)) {
|
||||||
|
EndPaint( hwnd, &ps );
|
||||||
|
return;
|
||||||
|
}
|
||||||
GetClientRect(hwnd, &rect);
|
GetClientRect(hwnd, &rect);
|
||||||
lphl = ListBoxGetStorageHeader(hwnd);
|
lphl = ListBoxGetStorageHeader(hwnd);
|
||||||
if (lphl == NULL) goto EndOfPaint;
|
if (lphl == NULL) goto EndOfPaint;
|
||||||
|
@ -425,7 +451,6 @@ void OwnerDrawListBox(HWND hwnd)
|
||||||
{
|
{
|
||||||
LPHEADLIST lphl;
|
LPHEADLIST lphl;
|
||||||
LPLISTSTRUCT lpls;
|
LPLISTSTRUCT lpls;
|
||||||
HANDLE hTemp;
|
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
HBRUSH hBrush;
|
HBRUSH hBrush;
|
||||||
HWND hWndParent;
|
HWND hWndParent;
|
||||||
|
@ -435,6 +460,10 @@ void OwnerDrawListBox(HWND hwnd)
|
||||||
char C[128];
|
char C[128];
|
||||||
h = 0;
|
h = 0;
|
||||||
hdc = BeginPaint( hwnd, &ps );
|
hdc = BeginPaint( hwnd, &ps );
|
||||||
|
if (!IsWindowVisible(hwnd)) {
|
||||||
|
EndPaint( hwnd, &ps );
|
||||||
|
return;
|
||||||
|
}
|
||||||
GetClientRect(hwnd, &rect);
|
GetClientRect(hwnd, &rect);
|
||||||
lphl = ListBoxGetStorageHeader(hwnd);
|
lphl = ListBoxGetStorageHeader(hwnd);
|
||||||
if (lphl == NULL) goto EndOfPaint;
|
if (lphl == NULL) goto EndOfPaint;
|
||||||
|
@ -465,11 +494,9 @@ void OwnerDrawListBox(HWND hwnd)
|
||||||
lpls->dis.rcItem.right, lpls->dis.rcItem.bottom);
|
lpls->dis.rcItem.right, lpls->dis.rcItem.bottom);
|
||||||
printf("LBOX WM_DRAWITEM Parent=%X &dis=%lX CtlID=%u !\n",
|
printf("LBOX WM_DRAWITEM Parent=%X &dis=%lX CtlID=%u !\n",
|
||||||
hWndParent, (LONG)&lpls->dis, lpls->dis.CtlID);
|
hWndParent, (LONG)&lpls->dis, lpls->dis.CtlID);
|
||||||
#endif
|
|
||||||
printf("LBOX WM_DRAWITEM '%s' !\n", lpls->dis.itemData);
|
printf("LBOX WM_DRAWITEM '%s' !\n", lpls->dis.itemData);
|
||||||
|
#endif
|
||||||
SendMessage(lphl->hWndLogicParent, WM_DRAWITEM, i, (LPARAM)&lpls->dis);
|
SendMessage(lphl->hWndLogicParent, WM_DRAWITEM, i, (LPARAM)&lpls->dis);
|
||||||
GlobalUnlock(hTemp);
|
|
||||||
GlobalFree(hTemp);
|
|
||||||
if (lpls->dis.itemState != 0) {
|
if (lpls->dis.itemState != 0) {
|
||||||
InvertRect(hdc, &lpls->dis.rcItem);
|
InvertRect(hdc, &lpls->dis.rcItem);
|
||||||
}
|
}
|
||||||
|
@ -575,7 +602,8 @@ int ListBoxAddString(HWND hwnd, LPSTR newstr)
|
||||||
lplsnew->dis.itemID = lphl->ItemsCount;
|
lplsnew->dis.itemID = lphl->ItemsCount;
|
||||||
lplsnew->dis.itemData = (DWORD)newstr;
|
lplsnew->dis.itemData = (DWORD)newstr;
|
||||||
lplsnew->hData = hTemp;
|
lplsnew->hData = hTemp;
|
||||||
SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE);
|
SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount,
|
||||||
|
(lphl->FirstVisible != 1));
|
||||||
if (lphl->FirstVisible >= (lphl->ItemsCount - lphl->ItemsVisible)) {
|
if (lphl->FirstVisible >= (lphl->ItemsCount - lphl->ItemsVisible)) {
|
||||||
InvalidateRect(hwnd, NULL, TRUE);
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
UpdateWindow(hwnd);
|
UpdateWindow(hwnd);
|
||||||
|
@ -625,7 +653,8 @@ int ListBoxInsertString(HWND hwnd, UINT uIndex, LPSTR newstr)
|
||||||
lplsnew->dis.itemID = lphl->ItemsCount;
|
lplsnew->dis.itemID = lphl->ItemsCount;
|
||||||
lplsnew->dis.itemData = (DWORD)newstr;
|
lplsnew->dis.itemData = (DWORD)newstr;
|
||||||
lplsnew->hData = hTemp;
|
lplsnew->hData = hTemp;
|
||||||
SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE);
|
SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount,
|
||||||
|
(lphl->FirstVisible != 1));
|
||||||
if (((lphl->ItemsCount - lphl->FirstVisible) == lphl->ItemsVisible) &&
|
if (((lphl->ItemsCount - lphl->FirstVisible) == lphl->ItemsVisible) &&
|
||||||
(lphl->ItemsVisible != 0))
|
(lphl->ItemsVisible != 0))
|
||||||
ShowWindow(lphl->hWndScroll, SW_NORMAL);
|
ShowWindow(lphl->hWndScroll, SW_NORMAL);
|
||||||
|
@ -768,10 +797,10 @@ int ListBoxSetCurSel(HWND hwnd, WORD wIndex)
|
||||||
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
|
lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
if (lphl == NULL) return LB_ERR;
|
if (lphl == NULL) return LB_ERR;
|
||||||
lphl->ItemSelected = LB_ERR;
|
lphl->ItemSelected = LB_ERR;
|
||||||
if (wIndex < 1 || wIndex > lphl->ItemsCount) return LB_ERR;
|
if (wIndex < 0 || wIndex >= lphl->ItemsCount) return LB_ERR;
|
||||||
lpls = lphl->lpFirst;
|
lpls = lphl->lpFirst;
|
||||||
if (lpls == NULL) return LB_ERR;
|
if (lpls == NULL) return LB_ERR;
|
||||||
for(i = 1; i <= lphl->ItemsCount; i++) {
|
for(i = 0; i < lphl->ItemsCount; i++) {
|
||||||
lpls2 = lpls;
|
lpls2 = lpls;
|
||||||
lpls = (LPLISTSTRUCT)lpls->lpNext;
|
lpls = (LPLISTSTRUCT)lpls->lpNext;
|
||||||
if (i == wIndex)
|
if (i == wIndex)
|
||||||
|
@ -797,10 +826,10 @@ int ListBoxSetSel(HWND hwnd, WORD wIndex)
|
||||||
UINT i;
|
UINT i;
|
||||||
lphl = ListBoxGetStorageHeader(hwnd);
|
lphl = ListBoxGetStorageHeader(hwnd);
|
||||||
if (lphl == NULL) return LB_ERR;
|
if (lphl == NULL) return LB_ERR;
|
||||||
if (wIndex < 1 || wIndex > lphl->ItemsCount) return LB_ERR;
|
if (wIndex < 0 || wIndex >= lphl->ItemsCount) return LB_ERR;
|
||||||
lpls = lphl->lpFirst;
|
lpls = lphl->lpFirst;
|
||||||
if (lpls == NULL) return LB_ERR;
|
if (lpls == NULL) return LB_ERR;
|
||||||
for(i = 1; i <= lphl->ItemsCount; i++) {
|
for(i = 0; i < lphl->ItemsCount; i++) {
|
||||||
lpls2 = lpls;
|
lpls2 = lpls;
|
||||||
lpls = (LPLISTSTRUCT)lpls->lpNext;
|
lpls = (LPLISTSTRUCT)lpls->lpNext;
|
||||||
if (i == wIndex) {
|
if (i == wIndex) {
|
||||||
|
|
|
@ -86,11 +86,15 @@ LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message,
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
lphs = ScrollBarGetStorageHeader(hwnd);
|
lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
|
if (lphs == 0) return 0;
|
||||||
|
#ifdef DEBUG_SCROLL
|
||||||
|
printf("ScrollBar WM_DESTROY %lX !\n", lphs);
|
||||||
|
#endif
|
||||||
DestroyWindow(lphs->hWndUp);
|
DestroyWindow(lphs->hWndUp);
|
||||||
DestroyWindow(lphs->hWndDown);
|
DestroyWindow(lphs->hWndDown);
|
||||||
free(lphs);
|
free(lphs);
|
||||||
printf("ScrollBar WM_DESTROY !\n");
|
*((LPHEADSCROLL *)&wndPtr->wExtra[1]) = 0;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
|
@ -105,10 +109,17 @@ LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message,
|
||||||
if (LOWORD(lParam) == lphs->hWndDown)
|
if (LOWORD(lParam) == lphs->hWndDown)
|
||||||
SendMessage(wndPtr->hwndParent, lphs->Direction,
|
SendMessage(wndPtr->hwndParent, lphs->Direction,
|
||||||
SB_LINEDOWN, MAKELONG(0, hwnd));
|
SB_LINEDOWN, MAKELONG(0, hwnd));
|
||||||
|
/*
|
||||||
|
SetFocus(hwnd);
|
||||||
|
*/
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
|
lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
|
/*
|
||||||
|
SetFocus(hwnd);
|
||||||
|
*/
|
||||||
|
SetCapture(hwnd);
|
||||||
GetClientRect(hwnd, &rect);
|
GetClientRect(hwnd, &rect);
|
||||||
if (lphs->Direction == WM_VSCROLL) {
|
if (lphs->Direction == WM_VSCROLL) {
|
||||||
y = HIWORD(lParam);
|
y = HIWORD(lParam);
|
||||||
|
@ -152,11 +163,13 @@ LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
|
lphs = ScrollBarGetStorageHeader(hwnd);
|
||||||
lphs->ThumbActive = FALSE;
|
lphs->ThumbActive = FALSE;
|
||||||
|
ReleaseCapture();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
printf("ScrollBar WM_KEYDOWN wParam %X!\n", wParam);
|
printf("ScrollBar WM_KEYDOWN wParam %X !\n", wParam);
|
||||||
break;
|
break;
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
StdDrawScrollBar(hwnd);
|
StdDrawScrollBar(hwnd);
|
||||||
|
@ -192,6 +205,10 @@ LPHEADSCROLL ScrollBarGetWindowAndStorage(HWND hwnd, WND **wndPtr)
|
||||||
WND *Ptr;
|
WND *Ptr;
|
||||||
LPHEADSCROLL lphs;
|
LPHEADSCROLL lphs;
|
||||||
*(wndPtr) = Ptr = WIN_FindWndPtr(hwnd);
|
*(wndPtr) = Ptr = WIN_FindWndPtr(hwnd);
|
||||||
|
if (Ptr == 0) {
|
||||||
|
printf("Bad Window handle on ScrollBar !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
lphs = *((LPHEADSCROLL *)&Ptr->wExtra[1]);
|
lphs = *((LPHEADSCROLL *)&Ptr->wExtra[1]);
|
||||||
return lphs;
|
return lphs;
|
||||||
}
|
}
|
||||||
|
@ -202,6 +219,10 @@ LPHEADSCROLL ScrollBarGetStorageHeader(HWND hwnd)
|
||||||
WND *wndPtr;
|
WND *wndPtr;
|
||||||
LPHEADSCROLL lphs;
|
LPHEADSCROLL lphs;
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
if (wndPtr == 0) {
|
||||||
|
printf("Bad Window handle on ScrollBar !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
lphs = *((LPHEADSCROLL *)&wndPtr->wExtra[1]);
|
lphs = *((LPHEADSCROLL *)&wndPtr->wExtra[1]);
|
||||||
return lphs;
|
return lphs;
|
||||||
}
|
}
|
||||||
|
@ -209,49 +230,53 @@ LPHEADSCROLL ScrollBarGetStorageHeader(HWND hwnd)
|
||||||
|
|
||||||
void StdDrawScrollBar(HWND hwnd)
|
void StdDrawScrollBar(HWND hwnd)
|
||||||
{
|
{
|
||||||
LPHEADSCROLL lphs;
|
LPHEADSCROLL lphs;
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
HBRUSH hBrush;
|
HBRUSH hBrush;
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
RECT rect;
|
RECT rect;
|
||||||
UINT i, w, h, siz;
|
UINT i, w, h, siz;
|
||||||
char C[128];
|
char C[128];
|
||||||
hdc = BeginPaint( hwnd, &ps );
|
hdc = BeginPaint( hwnd, &ps );
|
||||||
hBrush = SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc,
|
if (!IsWindowVisible(hwnd)) {
|
||||||
MAKELONG(hwnd, CTLCOLOR_SCROLLBAR));
|
|
||||||
if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(LTGRAY_BRUSH);
|
|
||||||
lphs = ScrollBarGetStorageHeader(hwnd);
|
|
||||||
if (lphs == NULL) goto EndOfPaint;
|
|
||||||
GetClientRect(hwnd, &rect);
|
|
||||||
w = rect.right - rect.left;
|
|
||||||
h = rect.bottom - rect.top;
|
|
||||||
if (lphs->Direction == WM_VSCROLL) {
|
|
||||||
rect.top += w;
|
|
||||||
rect.bottom -= w;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rect.left += h;
|
|
||||||
rect.right -= h;
|
|
||||||
}
|
|
||||||
FillRect(hdc, &rect, hBrush);
|
|
||||||
if (lphs->Direction == WM_VSCROLL)
|
|
||||||
SetRect(&rect, 0, lphs->CurPix + w,
|
|
||||||
w, lphs->CurPix + (w << 1));
|
|
||||||
else
|
|
||||||
SetRect(&rect, lphs->CurPix + h,
|
|
||||||
0, lphs->CurPix + (h << 1), h);
|
|
||||||
FrameRect(hdc, &rect, GetStockObject(BLACK_BRUSH));
|
|
||||||
InflateRect(&rect, -1, -1);
|
|
||||||
FillRect(hdc, &rect, GetStockObject(LTGRAY_BRUSH));
|
|
||||||
DrawReliefRect(hdc, rect, 2, 0);
|
|
||||||
InflateRect(&rect, -3, -3);
|
|
||||||
DrawReliefRect(hdc, rect, 1, 1);
|
|
||||||
EndOfPaint:
|
|
||||||
EndPaint( hwnd, &ps );
|
EndPaint( hwnd, &ps );
|
||||||
InvalidateRect(lphs->hWndUp, NULL, TRUE);
|
return;
|
||||||
UpdateWindow(lphs->hWndUp);
|
}
|
||||||
InvalidateRect(lphs->hWndDown, NULL, TRUE);
|
hBrush = SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc,
|
||||||
UpdateWindow(lphs->hWndDown);
|
MAKELONG(hwnd, CTLCOLOR_SCROLLBAR));
|
||||||
|
if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(LTGRAY_BRUSH);
|
||||||
|
lphs = ScrollBarGetStorageHeader(hwnd);
|
||||||
|
if (lphs == NULL) goto EndOfPaint;
|
||||||
|
GetClientRect(hwnd, &rect);
|
||||||
|
w = rect.right - rect.left;
|
||||||
|
h = rect.bottom - rect.top;
|
||||||
|
if (lphs->Direction == WM_VSCROLL) {
|
||||||
|
rect.top += w;
|
||||||
|
rect.bottom -= w;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rect.left += h;
|
||||||
|
rect.right -= h;
|
||||||
|
}
|
||||||
|
FillRect(hdc, &rect, hBrush);
|
||||||
|
if (lphs->Direction == WM_VSCROLL)
|
||||||
|
SetRect(&rect, 0, lphs->CurPix + w, w, lphs->CurPix + (w << 1));
|
||||||
|
else
|
||||||
|
SetRect(&rect, lphs->CurPix + h, 0, lphs->CurPix + (h << 1), h);
|
||||||
|
FrameRect(hdc, &rect, GetStockObject(BLACK_BRUSH));
|
||||||
|
InflateRect(&rect, -1, -1);
|
||||||
|
FillRect(hdc, &rect, GetStockObject(LTGRAY_BRUSH));
|
||||||
|
DrawReliefRect(hdc, rect, 2, 0);
|
||||||
|
InflateRect(&rect, -3, -3);
|
||||||
|
DrawReliefRect(hdc, rect, 1, 1);
|
||||||
|
if (!lphs->ThumbActive) {
|
||||||
|
InvalidateRect(lphs->hWndUp, NULL, TRUE);
|
||||||
|
UpdateWindow(lphs->hWndUp);
|
||||||
|
InvalidateRect(lphs->hWndDown, NULL, TRUE);
|
||||||
|
UpdateWindow(lphs->hWndDown);
|
||||||
|
}
|
||||||
|
EndOfPaint:
|
||||||
|
EndPaint( hwnd, &ps );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -264,16 +289,22 @@ int CreateScrollBarStruct(HWND hwnd)
|
||||||
LPHEADSCROLL lphs;
|
LPHEADSCROLL lphs;
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
lphs = (LPHEADSCROLL)malloc(sizeof(HEADSCROLL));
|
lphs = (LPHEADSCROLL)malloc(sizeof(HEADSCROLL));
|
||||||
|
if (lphs == 0) {
|
||||||
|
printf("Bad Memory Alloc on ScrollBar !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_SCROLL
|
||||||
|
printf("CreateScrollBarStruct %lX !\n", lphs);
|
||||||
|
#endif
|
||||||
*((LPHEADSCROLL *)&wndPtr->wExtra[1]) = lphs;
|
*((LPHEADSCROLL *)&wndPtr->wExtra[1]) = lphs;
|
||||||
lphs->ThumbActive;
|
lphs->ThumbActive = FALSE;
|
||||||
lphs->MinVal = 0;
|
lphs->MinVal = 0;
|
||||||
lphs->MaxVal = 100;
|
lphs->MaxVal = 100;
|
||||||
lphs->CurVal = 0;
|
lphs->CurVal = 0;
|
||||||
lphs->CurPix = 0;
|
lphs->CurPix = 0;
|
||||||
width = wndPtr->rectClient.right - wndPtr->rectClient.left;
|
width = wndPtr->rectClient.right - wndPtr->rectClient.left;
|
||||||
height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
|
height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
|
||||||
lphs = ScrollBarGetStorageHeader(hwnd);
|
|
||||||
if (lphs == NULL) return 0;
|
|
||||||
if (width <= height)
|
if (width <= height)
|
||||||
{
|
{
|
||||||
lphs->MaxPix = height - 3 * width;
|
lphs->MaxPix = height - 3 * width;
|
||||||
|
@ -308,7 +339,7 @@ int GetScrollPos(HWND hwnd, int nBar)
|
||||||
{
|
{
|
||||||
LPHEADSCROLL lphs;
|
LPHEADSCROLL lphs;
|
||||||
lphs = ScrollBarGetStorageHeader(hwnd);
|
lphs = ScrollBarGetStorageHeader(hwnd);
|
||||||
if (lphs == NULL) return;
|
if (lphs == NULL) return 0;
|
||||||
return lphs->CurVal;
|
return lphs->CurVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,7 +361,7 @@ int SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL bRedraw)
|
||||||
int nRet;
|
int nRet;
|
||||||
LPHEADSCROLL lphs;
|
LPHEADSCROLL lphs;
|
||||||
lphs = ScrollBarGetStorageHeader(hwnd);
|
lphs = ScrollBarGetStorageHeader(hwnd);
|
||||||
if (lphs == NULL) return;
|
if (lphs == NULL) return 0;
|
||||||
nRet = lphs->CurVal;
|
nRet = lphs->CurVal;
|
||||||
lphs->CurVal = (short)nPos;
|
lphs->CurVal = (short)nPos;
|
||||||
if (lphs->MaxVal != lphs->MinVal)
|
if (lphs->MaxVal != lphs->MinVal)
|
||||||
|
@ -343,7 +374,7 @@ int SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL bRedraw)
|
||||||
printf("SetScrollPos min=%d max=%d\n",
|
printf("SetScrollPos min=%d max=%d\n",
|
||||||
lphs->MinVal, lphs->MaxVal);
|
lphs->MinVal, lphs->MaxVal);
|
||||||
#endif
|
#endif
|
||||||
if (bRedraw) {
|
if ((bRedraw) && (IsWindowVisible(hwnd))) {
|
||||||
InvalidateRect(hwnd, NULL, TRUE);
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
UpdateWindow(hwnd);
|
UpdateWindow(hwnd);
|
||||||
}
|
}
|
||||||
|
@ -367,7 +398,7 @@ void SetScrollRange(HWND hwnd, int nBar, int MinPos, int MaxPos, BOOL bRedraw)
|
||||||
#ifdef DEBUG_SCROLL
|
#ifdef DEBUG_SCROLL
|
||||||
printf("SetScrollRange min=%d max=%d\n", lphs->MinVal, lphs->MaxVal);
|
printf("SetScrollRange min=%d max=%d\n", lphs->MinVal, lphs->MaxVal);
|
||||||
#endif
|
#endif
|
||||||
if (bRedraw) {
|
if ((bRedraw) && (IsWindowVisible(hwnd))) {
|
||||||
InvalidateRect(hwnd, NULL, TRUE);
|
InvalidateRect(hwnd, NULL, TRUE);
|
||||||
UpdateWindow(hwnd);
|
UpdateWindow(hwnd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,8 @@ LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam);
|
||||||
static LONG PaintTextfn(HWND hwnd);
|
static LONG PaintTextfn(HWND hwnd);
|
||||||
static LONG PaintRectfn(HWND hwnd);
|
static LONG PaintRectfn(HWND hwnd);
|
||||||
static LONG PaintFramefn(HWND hwnd);
|
static LONG PaintFramefn(HWND hwnd);
|
||||||
|
static LONG PaintIconfn(HWND hwnd);
|
||||||
|
|
||||||
|
|
||||||
static COLORREF color_windowframe, color_background, color_window,
|
static COLORREF color_windowframe, color_background, color_window,
|
||||||
color_windowtext;
|
color_windowtext;
|
||||||
|
@ -37,7 +39,7 @@ static STATICFN staticfn[MAX_STATIC_TYPE] =
|
||||||
{ (LONG(*)())PaintTextfn }, /* SS_LEFT */
|
{ (LONG(*)())PaintTextfn }, /* SS_LEFT */
|
||||||
{ (LONG(*)())PaintTextfn }, /* SS_CENTER */
|
{ (LONG(*)())PaintTextfn }, /* SS_CENTER */
|
||||||
{ (LONG(*)())PaintTextfn }, /* SS_RIGHT */
|
{ (LONG(*)())PaintTextfn }, /* SS_RIGHT */
|
||||||
{ (LONG(*)())NULL }, /* SS_ICON */
|
{ (LONG(*)())PaintIconfn }, /* SS_ICON */
|
||||||
{ (LONG(*)())PaintRectfn }, /* SS_BLACKRECT */
|
{ (LONG(*)())PaintRectfn }, /* SS_BLACKRECT */
|
||||||
{ (LONG(*)())PaintRectfn }, /* SS_GRAYRECT */
|
{ (LONG(*)())PaintRectfn }, /* SS_GRAYRECT */
|
||||||
{ (LONG(*)())PaintRectfn }, /* SS_WHITERECT */
|
{ (LONG(*)())PaintRectfn }, /* SS_WHITERECT */
|
||||||
|
@ -65,17 +67,22 @@ LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
if (style < 0L || style >= (LONG)DIM(staticfn))
|
if (style < 0L || style >= (LONG)DIM(staticfn)) {
|
||||||
lResult = -1L;
|
lResult = -1L;
|
||||||
else
|
break;
|
||||||
{
|
}
|
||||||
/* initialise colours */
|
/* initialise colours */
|
||||||
color_windowframe = GetSysColor(COLOR_WINDOWFRAME);
|
color_windowframe = GetSysColor(COLOR_WINDOWFRAME);
|
||||||
color_background = GetSysColor(COLOR_BACKGROUND);
|
color_background = GetSysColor(COLOR_BACKGROUND);
|
||||||
color_window = GetSysColor(COLOR_WINDOW);
|
color_window = GetSysColor(COLOR_WINDOW);
|
||||||
color_windowtext = GetSysColor(COLOR_WINDOWTEXT);
|
color_windowtext = GetSysColor(COLOR_WINDOWTEXT);
|
||||||
lResult = 0L;
|
lResult = 0L;
|
||||||
}
|
if (style == SS_ICON) {
|
||||||
|
/*
|
||||||
|
SetWindowPos(hWnd, (HWND)NULL, 0, 0, 32, 32,
|
||||||
|
SWP_NOZORDER | SWP_NOMOVE);
|
||||||
|
*/
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
|
@ -259,6 +266,35 @@ static LONG PaintFramefn(HWND hwnd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static LONG PaintIconfn(HWND hwnd)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
RECT rc;
|
||||||
|
HDC hdc;
|
||||||
|
LPSTR textPtr;
|
||||||
|
HICON hIcon;
|
||||||
|
|
||||||
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
hdc = BeginPaint(hwnd, &ps);
|
||||||
|
GetClientRect(hwnd, &rc);
|
||||||
|
FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH));
|
||||||
|
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
||||||
|
printf("SS_ICON : textPtr='%s' / left=%d top=%d right=%d bottom=%d \n",
|
||||||
|
textPtr, rc.left, rc.top, rc.right, rc.bottom);
|
||||||
|
/*
|
||||||
|
SetWindowPos(hwnd, (HWND)NULL, 0, 0, 32, 32,
|
||||||
|
SWP_NOZORDER | SWP_NOMOVE);
|
||||||
|
GetClientRect(hwnd, &rc);
|
||||||
|
printf("SS_ICON : textPtr='%s' / left=%d top=%d right=%d bottom=%d \n",
|
||||||
|
textPtr, rc.left, rc.top, rc.right, rc.bottom);
|
||||||
|
*/
|
||||||
|
hIcon = LoadIcon(wndPtr->hInstance, textPtr);
|
||||||
|
DrawIcon(hdc, rc.left, rc.top, hIcon);
|
||||||
|
EndPaint(hwnd, &ps);
|
||||||
|
GlobalUnlock(hwnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,12 @@ return_value:
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Places to keep info about the current 32-bit stack frame.
|
* Places to keep info about the current 32-bit stack frame.
|
||||||
*/
|
*/
|
||||||
saved_esp:
|
.globl _IF1632_Saved32_esp,_IF1632_Saved32_ebp,_IF1632_Saved32_ss
|
||||||
|
_IF1632_Saved32_esp:
|
||||||
.long 0
|
.long 0
|
||||||
saved_ebp:
|
_IF1632_Saved32_ebp:
|
||||||
.long 0
|
.long 0
|
||||||
saved_ss:
|
_IF1632_Saved32_ss:
|
||||||
.word 0
|
.word 0
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
@ -64,9 +65,9 @@ _CallToInit16:
|
||||||
* Save our registers
|
* Save our registers
|
||||||
*/
|
*/
|
||||||
pushal
|
pushal
|
||||||
pushl saved_esp
|
pushl _IF1632_Saved32_esp
|
||||||
pushl saved_ebp
|
pushl _IF1632_Saved32_ebp
|
||||||
pushw saved_ss
|
pushw _IF1632_Saved32_ss
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get target address.
|
* Get target address.
|
||||||
|
@ -78,9 +79,9 @@ _CallToInit16:
|
||||||
/*
|
/*
|
||||||
* Put stack registers where we can get them after stack switch.
|
* Put stack registers where we can get them after stack switch.
|
||||||
*/
|
*/
|
||||||
movw %ss,saved_ss
|
movw %ss,_IF1632_Saved32_ss
|
||||||
movl %esp,saved_esp
|
movl %esp,_IF1632_Saved32_esp
|
||||||
movl %ebp,saved_ebp
|
movl %ebp,_IF1632_Saved32_ebp
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load initial registers
|
* Load initial registers
|
||||||
|
@ -130,16 +131,16 @@ _CallToInit16:
|
||||||
movw %ax,%fs
|
movw %ax,%fs
|
||||||
movw %ax,%gs
|
movw %ax,%gs
|
||||||
popl %eax
|
popl %eax
|
||||||
movw saved_ss,%ss
|
movw _IF1632_Saved32_ss,%ss
|
||||||
movl saved_esp,%esp
|
movl _IF1632_Saved32_esp,%esp
|
||||||
movl saved_ebp,%ebp
|
movl _IF1632_Saved32_ebp,%ebp
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Restore registers, but do not destroy return value.
|
* Restore registers, but do not destroy return value.
|
||||||
*/
|
*/
|
||||||
popw saved_ss
|
popw _IF1632_Saved32_ss
|
||||||
popl saved_ebp
|
popl _IF1632_Saved32_ebp
|
||||||
popl saved_esp
|
popl _IF1632_Saved32_esp
|
||||||
movl %eax,return_value
|
movl %eax,return_value
|
||||||
popal
|
popal
|
||||||
movl return_value,%eax
|
movl return_value,%eax
|
||||||
|
@ -173,13 +174,13 @@ _CallTo16:
|
||||||
/*
|
/*
|
||||||
* Switch to 16-bit stack
|
* Switch to 16-bit stack
|
||||||
*/
|
*/
|
||||||
pushl saved_esp
|
pushl _IF1632_Saved32_esp
|
||||||
pushl saved_ebp
|
pushl _IF1632_Saved32_ebp
|
||||||
pushw saved_ss
|
pushw _IF1632_Saved32_ss
|
||||||
|
|
||||||
movw %ss,saved_ss
|
movw %ss,_IF1632_Saved32_ss
|
||||||
movl %esp,saved_esp
|
movl %esp,_IF1632_Saved32_esp
|
||||||
movl %ebp,saved_ebp
|
movl %ebp,_IF1632_Saved32_ebp
|
||||||
|
|
||||||
movw _IF1632_Saved16_ss,%ss
|
movw _IF1632_Saved16_ss,%ss
|
||||||
movl _IF1632_Saved16_esp,%esp
|
movl _IF1632_Saved16_esp,%esp
|
||||||
|
@ -215,13 +216,13 @@ _CallTo16:
|
||||||
movl %esp,_IF1632_Saved16_esp
|
movl %esp,_IF1632_Saved16_esp
|
||||||
movl %ebp,_IF1632_Saved16_ebp
|
movl %ebp,_IF1632_Saved16_ebp
|
||||||
|
|
||||||
movw saved_ss,%ss
|
movw _IF1632_Saved32_ss,%ss
|
||||||
movl saved_esp,%esp
|
movl _IF1632_Saved32_esp,%esp
|
||||||
movl saved_ebp,%ebp
|
movl _IF1632_Saved32_ebp,%ebp
|
||||||
|
|
||||||
popw saved_ss
|
popw _IF1632_Saved32_ss
|
||||||
popl saved_ebp
|
popl _IF1632_Saved32_ebp
|
||||||
popl saved_esp
|
popl _IF1632_Saved32_esp
|
||||||
|
|
||||||
movl %eax,return_value
|
movl %eax,return_value
|
||||||
movw return_value+2,%dx
|
movw return_value+2,%dx
|
||||||
|
@ -276,9 +277,9 @@ _CallTo32:
|
||||||
movl %esp,_IF1632_Saved16_esp
|
movl %esp,_IF1632_Saved16_esp
|
||||||
movl %ebp,_IF1632_Saved16_ebp
|
movl %ebp,_IF1632_Saved16_ebp
|
||||||
|
|
||||||
movw saved_ss,%ss
|
movw _IF1632_Saved32_ss,%ss
|
||||||
movl saved_esp,%esp
|
movl _IF1632_Saved32_esp,%esp
|
||||||
movl saved_ebp,%ebp
|
movl _IF1632_Saved32_ebp,%ebp
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call entry point
|
* Call entry point
|
||||||
|
|
|
@ -5,10 +5,16 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
#include "callback.h"
|
#include "callback.h"
|
||||||
#include "wine.h"
|
#include "wine.h"
|
||||||
#include "segmem.h"
|
#include "segmem.h"
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
extern unsigned short SelectorOwners[];
|
extern unsigned short SelectorOwners[];
|
||||||
extern unsigned short IF1632_Saved16_ss;
|
extern unsigned short IF1632_Saved16_ss;
|
||||||
|
extern unsigned long IF1632_Saved16_ebp;
|
||||||
extern unsigned long IF1632_Saved16_esp;
|
extern unsigned long IF1632_Saved16_esp;
|
||||||
|
extern unsigned short IF1632_Saved32_ss;
|
||||||
|
extern unsigned long IF1632_Saved32_ebp;
|
||||||
|
extern unsigned long IF1632_Saved32_esp;
|
||||||
|
|
||||||
extern struct segment_descriptor_s *MakeProcThunks;
|
extern struct segment_descriptor_s *MakeProcThunks;
|
||||||
|
|
||||||
struct thunk_s
|
struct thunk_s
|
||||||
|
@ -169,3 +175,77 @@ void CallLineDDAProc(FARPROC func, short xPos, short yPos, long lParam)
|
||||||
(*func)(xPos, yPos, lParam);
|
(*func)(xPos, yPos, lParam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
/*
|
||||||
|
* The following functions realize the Catch/Throw functionality.
|
||||||
|
* My thought is to use the setjmp, longjmp combination to do the
|
||||||
|
* major part of this one. All I have to remember, in addition to
|
||||||
|
* whatever the jmp_buf contains, is the contents of the 16-bit
|
||||||
|
* sp, bp and ss. I do this by storing them in the structure passed
|
||||||
|
* to me by the 16-bit program (including my own jmp_buf...).
|
||||||
|
* Hopefully there isn't any program that modifies the contents!
|
||||||
|
* Bad thing: I have to save part of the stack, since this will
|
||||||
|
* get reused on the next call after my return, leaving it in an
|
||||||
|
* undefined state.
|
||||||
|
*/
|
||||||
|
#define STACK_DEPTH_16 28
|
||||||
|
|
||||||
|
struct special_buffer {
|
||||||
|
jmp_buf buffer;
|
||||||
|
long regs [6];
|
||||||
|
char stack_part [STACK_DEPTH_16];
|
||||||
|
} *sb;
|
||||||
|
|
||||||
|
int Catch (LPCATCHBUF cbuf)
|
||||||
|
{
|
||||||
|
WORD retval;
|
||||||
|
jmp_buf *tmp_jmp;
|
||||||
|
char *stack16 = (char *) (((unsigned int)IF1632_Saved16_ss << 16) +
|
||||||
|
(IF1632_Saved16_esp & 0xffff));
|
||||||
|
|
||||||
|
sb = malloc (sizeof (struct special_buffer));
|
||||||
|
|
||||||
|
sb -> regs [0] = IF1632_Saved16_esp;
|
||||||
|
sb -> regs [1] = IF1632_Saved16_ebp;
|
||||||
|
sb -> regs [2] = IF1632_Saved16_ss & 0xffff;
|
||||||
|
sb -> regs [3] = IF1632_Saved32_esp;
|
||||||
|
sb -> regs [4] = IF1632_Saved32_ebp;
|
||||||
|
sb -> regs [5] = IF1632_Saved32_ss & 0xffff;
|
||||||
|
memcpy (sb -> stack_part, stack16, STACK_DEPTH_16);
|
||||||
|
tmp_jmp = &sb -> buffer;
|
||||||
|
*((struct special_buffer **)cbuf) = sb;
|
||||||
|
|
||||||
|
if ((retval = setjmp (*tmp_jmp)))
|
||||||
|
{
|
||||||
|
IF1632_Saved16_esp = sb -> regs [0];
|
||||||
|
IF1632_Saved16_ebp = sb -> regs [1];
|
||||||
|
IF1632_Saved16_ss = sb -> regs [2] & 0xffff;
|
||||||
|
IF1632_Saved32_esp = sb -> regs [3];
|
||||||
|
IF1632_Saved32_ebp = sb -> regs [4];
|
||||||
|
IF1632_Saved32_ss = sb -> regs [5] & 0xffff;
|
||||||
|
stack16 = (char *) (((unsigned int)IF1632_Saved16_ss << 16) +
|
||||||
|
(IF1632_Saved16_esp & 0xffff));
|
||||||
|
|
||||||
|
memcpy (stack16, sb -> stack_part, STACK_DEPTH_16);
|
||||||
|
#ifdef DEBUG_CATCH
|
||||||
|
printf ("Been thrown here: %d, retval = %d\n", sb, retval);
|
||||||
|
#endif
|
||||||
|
free ((void *) sb);
|
||||||
|
return (retval);
|
||||||
|
} else {
|
||||||
|
#ifdef DEBUG_CATCH
|
||||||
|
printf ("Will somtime get thrown here: %d\n", sb);
|
||||||
|
#endif
|
||||||
|
return (retval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Throw (LPCATCHBUF cbuf, int val)
|
||||||
|
{
|
||||||
|
sb = *((struct special_buffer **)cbuf);
|
||||||
|
#ifdef DEBUG_CATCH
|
||||||
|
printf ("Throwing to: %d\n", sb);
|
||||||
|
#endif
|
||||||
|
longjmp (sb -> buffer, val);
|
||||||
|
}
|
||||||
|
|
|
@ -32,11 +32,14 @@ length 415
|
||||||
50 pascal GetProcAddress(word ptr) GetProcAddress(1 2)
|
50 pascal GetProcAddress(word ptr) GetProcAddress(1 2)
|
||||||
51 pascal MakeProcInstance(ptr word) CALLBACK_MakeProcInstance(1 2)
|
51 pascal MakeProcInstance(ptr word) CALLBACK_MakeProcInstance(1 2)
|
||||||
52 pascal FreeProcInstance(ptr) FreeProcInstance(1)
|
52 pascal FreeProcInstance(ptr) FreeProcInstance(1)
|
||||||
|
55 pascal Catch(ptr) Catch (1)
|
||||||
|
56 pascal Throw(ptr word) Throw(1 2)
|
||||||
59 pascal WriteProfileString(ptr ptr ptr) WriteProfileString(1 2 3)
|
59 pascal WriteProfileString(ptr ptr ptr) WriteProfileString(1 2 3)
|
||||||
60 pascal FindResource(word ptr ptr) FindResource(1 2 3)
|
60 pascal FindResource(word ptr ptr) FindResource(1 2 3)
|
||||||
61 pascal LoadResource(word word) LoadResource(1 2)
|
61 pascal LoadResource(word word) LoadResource(1 2)
|
||||||
62 pascal LockResource(word) LockResource(1)
|
62 pascal LockResource(word) LockResource(1)
|
||||||
63 pascal FreeResource(word) FreeResource(1)
|
63 pascal FreeResource(word) FreeResource(1)
|
||||||
|
64 pascal AccessResource(word word) AccessResource(1 2)
|
||||||
74 pascal OpenFile(ptr ptr word) KERNEL_OpenFile(1 2 3)
|
74 pascal OpenFile(ptr ptr word) KERNEL_OpenFile(1 2 3)
|
||||||
81 pascal _lclose(word) KERNEL__lclose(1)
|
81 pascal _lclose(word) KERNEL__lclose(1)
|
||||||
82 pascal _lread(word ptr word) KERNEL__lread(1 2 3)
|
82 pascal _lread(word ptr word) KERNEL__lread(1 2 3)
|
||||||
|
@ -48,6 +51,8 @@ length 415
|
||||||
91 register InitTask(word word word word word
|
91 register InitTask(word word word word word
|
||||||
word word word word word)
|
word word word word word)
|
||||||
KERNEL_InitTask()
|
KERNEL_InitTask()
|
||||||
|
95 pascal LoadLibrary(ptr) LoadLibrary(1)
|
||||||
|
96 pascal FreeLibrary(word) FreeLibrary(1)
|
||||||
102 register DOS3Call(word word word word word
|
102 register DOS3Call(word word word word word
|
||||||
word word word word word)
|
word word word word word)
|
||||||
KERNEL_DOS3Call()
|
KERNEL_DOS3Call()
|
||||||
|
@ -67,6 +72,11 @@ length 415
|
||||||
163 pascal GlobalLRUOldest(word) ReturnArg(1)
|
163 pascal GlobalLRUOldest(word) ReturnArg(1)
|
||||||
164 pascal GlobalLRUNewest(word) ReturnArg(1)
|
164 pascal GlobalLRUNewest(word) ReturnArg(1)
|
||||||
166 pascal WinExec(ptr word) WinExec(1 2)
|
166 pascal WinExec(ptr word) WinExec(1 2)
|
||||||
|
170 pascal AllocCStoDSAlias(word) AllocDStoCSAlias(1)
|
||||||
|
171 pascal AllocDStoCSAlias(word) AllocDStoCSAlias(1)
|
||||||
|
175 pascal AllocSelector(word) AllocSelector(1)
|
||||||
|
176 pascal FreeSelector(word) FreeSelector(1)
|
||||||
|
177 pascal PrestoChangoSelector(word word) PrestoChangoSelector(1 2)
|
||||||
178 equate __WINFLAGS 0x413
|
178 equate __WINFLAGS 0x413
|
||||||
184 return GlobalDOSAlloc 4 0
|
184 return GlobalDOSAlloc 4 0
|
||||||
185 return GlobalDOSFree 2 0
|
185 return GlobalDOSFree 2 0
|
||||||
|
|
|
@ -166,10 +166,17 @@ DLLRelay(unsigned int func_num, unsigned int seg_off)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DLL_ARGTYPE_LONG:
|
case DLL_ARGTYPE_LONG:
|
||||||
case DLL_ARGTYPE_FARPTR:
|
|
||||||
ip = (int *) ((char *) arg_ptr + offset);
|
ip = (int *) ((char *) arg_ptr + offset);
|
||||||
arg_table[i] = *ip;
|
arg_table[i] = *ip;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DLL_ARGTYPE_FARPTR:
|
||||||
|
ip = (int *) ((char *) arg_ptr + offset);
|
||||||
|
if (*ip & 0xffff0000)
|
||||||
|
arg_table[i] = SAFEMAKEPTR((unsigned) *ip >> 16, *ip);
|
||||||
|
else
|
||||||
|
arg_table[i] = *ip;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@ length 540
|
||||||
15 pascal GetCurrentTime() GetTickCount()
|
15 pascal GetCurrentTime() GetTickCount()
|
||||||
18 pascal SetCapture(word) SetCapture(1)
|
18 pascal SetCapture(word) SetCapture(1)
|
||||||
19 pascal ReleaseCapture() ReleaseCapture()
|
19 pascal ReleaseCapture() ReleaseCapture()
|
||||||
|
20 pascal SetDoubleClickTime(word) SetDoubleClickTime(1)
|
||||||
|
21 pascal GetDoubleClickTime() GetDoubleClickTime()
|
||||||
22 pascal SetFocus(word) SetFocus(1)
|
22 pascal SetFocus(word) SetFocus(1)
|
||||||
23 pascal GetFocus() GetFocus()
|
23 pascal GetFocus() GetFocus()
|
||||||
31 pascal IsIconic(word) IsIconic(1)
|
31 pascal IsIconic(word) IsIconic(1)
|
||||||
|
@ -28,16 +30,24 @@ length 540
|
||||||
41 pascal CreateWindow(ptr ptr long s_word s_word s_word s_word word word word ptr)
|
41 pascal CreateWindow(ptr ptr long s_word s_word s_word s_word word word word ptr)
|
||||||
CreateWindow(1 2 3 4 5 6 7 8 9 10 11)
|
CreateWindow(1 2 3 4 5 6 7 8 9 10 11)
|
||||||
42 pascal ShowWindow(word word) ShowWindow(1 2)
|
42 pascal ShowWindow(word word) ShowWindow(1 2)
|
||||||
|
43 pascal CloseWindow(word) CloseWindow(1)
|
||||||
|
44 pascal OpenIcon(word) OpenIcon(1)
|
||||||
46 pascal GetParent(word) GetParent(1)
|
46 pascal GetParent(word) GetParent(1)
|
||||||
|
47 pascal IsWindow(word) IsWindow(1)
|
||||||
48 pascal IsChild(word word) IsChild(1 2)
|
48 pascal IsChild(word word) IsChild(1 2)
|
||||||
|
49 pascal IsWindowVisible(word) IsWindowVisible(1)
|
||||||
|
50 pascal FindWindow(ptr ptr) FindWindow(1 2)
|
||||||
53 pascal DestroyWindow(word) DestroyWindow(1)
|
53 pascal DestroyWindow(word) DestroyWindow(1)
|
||||||
56 pascal MoveWindow(word word word word word word)
|
56 pascal MoveWindow(word word word word word word)
|
||||||
MoveWindow(1 2 3 4 5 6)
|
MoveWindow(1 2 3 4 5 6)
|
||||||
57 pascal RegisterClass(ptr) RegisterClass(1)
|
57 pascal RegisterClass(ptr) RegisterClass(1)
|
||||||
|
61 pascal ScrollWindow(word s_word s_word ptr ptr) ScrollWindow(1 2 3 4 5)
|
||||||
62 pascal SetScrollPos(word word word word) SetScrollPos(1 2 3 4)
|
62 pascal SetScrollPos(word word word word) SetScrollPos(1 2 3 4)
|
||||||
64 pascal SetScrollRange(word word word word word) SetScrollRange(1 2 3 4 5)
|
64 pascal SetScrollRange(word word word word word) SetScrollRange(1 2 3 4 5)
|
||||||
66 pascal GetDC(word) GetDC(1)
|
66 pascal GetDC(word) GetDC(1)
|
||||||
68 pascal ReleaseDC(word word) ReleaseDC(1 2)
|
68 pascal ReleaseDC(word word) ReleaseDC(1 2)
|
||||||
|
69 pascal SetCursor(word word) SetCursor(1 2)
|
||||||
|
71 pascal ShowCursor(word word) ShowCursor(1 2)
|
||||||
72 pascal SetRect(ptr s_word s_word s_word s_word) SetRect(1 2 3 4 5)
|
72 pascal SetRect(ptr s_word s_word s_word s_word) SetRect(1 2 3 4 5)
|
||||||
73 pascal SetRectEmpty(ptr) SetRectEmpty(1)
|
73 pascal SetRectEmpty(ptr) SetRectEmpty(1)
|
||||||
74 pascal CopyRect(ptr ptr) CopyRect(1 2)
|
74 pascal CopyRect(ptr ptr) CopyRect(1 2)
|
||||||
|
@ -50,6 +60,7 @@ length 540
|
||||||
81 pascal FillRect(word ptr word) FillRect(1 2 3)
|
81 pascal FillRect(word ptr word) FillRect(1 2 3)
|
||||||
82 pascal InvertRect(word ptr) InvertRect(1 2)
|
82 pascal InvertRect(word ptr) InvertRect(1 2)
|
||||||
83 pascal FrameRect(word ptr word) FrameRect(1 2 3)
|
83 pascal FrameRect(word ptr word) FrameRect(1 2 3)
|
||||||
|
84 pascal DrawIcon(word s_word s_word word) DrawIcon(1 2 3 4)
|
||||||
85 pascal DrawText(word ptr s_word ptr word) DrawText(1 2 3 4 5)
|
85 pascal DrawText(word ptr s_word ptr word) DrawText(1 2 3 4 5)
|
||||||
87 pascal DialogBox(word ptr word ptr) DialogBox(1 2 3 4)
|
87 pascal DialogBox(word ptr word ptr) DialogBox(1 2 3 4)
|
||||||
88 pascal EndDialog(word s_word) EndDialog(1 2)
|
88 pascal EndDialog(word s_word) EndDialog(1 2)
|
||||||
|
@ -109,8 +120,11 @@ length 540
|
||||||
181 pascal SetSysColors(word ptr ptr) SetSysColors(1 2 3)
|
181 pascal SetSysColors(word ptr ptr) SetSysColors(1 2 3)
|
||||||
182 pascal KillSystemTimer(word word) KillSystemTimer(1 2)
|
182 pascal KillSystemTimer(word word) KillSystemTimer(1 2)
|
||||||
190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3)
|
190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3)
|
||||||
|
218 pascal DialogBoxIndirect(word word word ptr) DialogBoxIndirect(1 2 3 4)
|
||||||
219 pascal CreateDialogIndirect(word ptr word ptr)
|
219 pascal CreateDialogIndirect(word ptr word ptr)
|
||||||
CreateDialogIndirect(1 2 3 4)
|
CreateDialogIndirect(1 2 3 4)
|
||||||
|
221 pascal ScrollDC(word s_word s_word ptr ptr word ptr)
|
||||||
|
ScrollDC(1 2 3 4 5 6 7)
|
||||||
227 pascal GetNextDlgGroupItem(word word word) GetNextDlgGroupItem(1 2 3)
|
227 pascal GetNextDlgGroupItem(word word word) GetNextDlgGroupItem(1 2 3)
|
||||||
228 pascal GetNextDlgTabItem(word word word) GetNextDlgTabItem(1 2 3)
|
228 pascal GetNextDlgTabItem(word word word) GetNextDlgTabItem(1 2 3)
|
||||||
229 pascal GetTopWindow(word) GetTopWindow(1)
|
229 pascal GetTopWindow(word) GetTopWindow(1)
|
||||||
|
@ -118,6 +132,9 @@ length 540
|
||||||
232 pascal SetWindowPos(word word word word word word word)
|
232 pascal SetWindowPos(word word word word word word word)
|
||||||
SetWindowPos(1 2 3 4 5 6 7)
|
SetWindowPos(1 2 3 4 5 6 7)
|
||||||
237 pascal GetUpdateRgn(word word word) GetUpdateRgn(1 2 3)
|
237 pascal GetUpdateRgn(word word word) GetUpdateRgn(1 2 3)
|
||||||
|
239 pascal DialogBoxParam(word ptr word ptr long) DialogBoxParam(1 2 3 4 5)
|
||||||
|
240 pascal DialogBoxIndirectParam(word word word ptr long)
|
||||||
|
DialogBoxIndirectParam(1 2 3 4 5)
|
||||||
241 pascal CreateDialogParam(word ptr word ptr long)
|
241 pascal CreateDialogParam(word ptr word ptr long)
|
||||||
CreateDialogParam(1 2 3 4 5)
|
CreateDialogParam(1 2 3 4 5)
|
||||||
242 pascal CreateDialogIndirectParam(word ptr word ptr long)
|
242 pascal CreateDialogIndirectParam(word ptr word ptr long)
|
||||||
|
@ -128,6 +145,8 @@ length 540
|
||||||
277 pascal GetDlgCtrlID(word) GetDlgCtrlID(1)
|
277 pascal GetDlgCtrlID(word) GetDlgCtrlID(1)
|
||||||
286 pascal GetDesktopWindow() GetDesktopWindow()
|
286 pascal GetDesktopWindow() GetDesktopWindow()
|
||||||
288 pascal GetMessageExtraInfo() GetMessageExtraInfo()
|
288 pascal GetMessageExtraInfo() GetMessageExtraInfo()
|
||||||
|
319 pascal ScrollWindowEx(word s_word s_word ptr ptr word ptr word)
|
||||||
|
ScrollWindowEx(1 2 3 4 5 6 7 8)
|
||||||
324 pascal FillWindow(word word word word) FillWindow(1 2 3 4)
|
324 pascal FillWindow(word word word word) FillWindow(1 2 3 4)
|
||||||
325 pascal PaintRect(word word word word ptr) PaintRect(1 2 3 4 5)
|
325 pascal PaintRect(word word word word ptr) PaintRect(1 2 3 4 5)
|
||||||
334 pascal GetQueueStatus(word) GetQueueStatus(1)
|
334 pascal GetQueueStatus(word) GetQueueStatus(1)
|
||||||
|
@ -149,6 +168,8 @@ length 540
|
||||||
452 pascal CreateWindowEx(long ptr ptr long s_word s_word s_word s_word
|
452 pascal CreateWindowEx(long ptr ptr long s_word s_word s_word s_word
|
||||||
word word word ptr)
|
word word word ptr)
|
||||||
CreateWindowEx(1 2 3 4 5 6 7 8 9 10 11 12)
|
CreateWindowEx(1 2 3 4 5 6 7 8 9 10 11 12)
|
||||||
|
457 pascal DestroyIcon(word) DestroyIcon(1)
|
||||||
|
458 pascal DestroyCursor(word) DestroyCursor(1)
|
||||||
471 pascal lstrcmpi(ptr ptr) lstrcmpi(1 2)
|
471 pascal lstrcmpi(ptr ptr) lstrcmpi(1 2)
|
||||||
472 pascal AnsiNext(ptr) AnsiNext(1 )
|
472 pascal AnsiNext(ptr) AnsiNext(1 )
|
||||||
473 pascal AnsiPrev(ptr ptr) AnsiPrev(1 2)
|
473 pascal AnsiPrev(ptr ptr) AnsiPrev(1 2)
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* structure definitions for CURSOR
|
||||||
|
*
|
||||||
|
* Copyright Martin Ayotte, 1993
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE Width;
|
||||||
|
BYTE Reserved1;
|
||||||
|
BYTE Height;
|
||||||
|
BYTE Reserved2;
|
||||||
|
WORD curXHotspot;
|
||||||
|
WORD curYHotspot;
|
||||||
|
DWORD curDIBSize;
|
||||||
|
DWORD curDIBOffset;
|
||||||
|
} CURSORDESCRIP;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
CURSORDESCRIP descriptor;
|
||||||
|
HBITMAP hBitmap;
|
||||||
|
Display *display;
|
||||||
|
Pixmap pixshape;
|
||||||
|
Pixmap pixmask;
|
||||||
|
Cursor xcursor;
|
||||||
|
} CURSORALLOC;
|
||||||
|
|
|
@ -54,15 +54,6 @@ typedef struct
|
||||||
} DLGCONTROLHEADER;
|
} DLGCONTROLHEADER;
|
||||||
|
|
||||||
|
|
||||||
/* Dialog control data */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
DLGCONTROLHEADER * header;
|
|
||||||
LPSTR class;
|
|
||||||
LPSTR text;
|
|
||||||
} DLGCONTROL;
|
|
||||||
|
|
||||||
|
|
||||||
/* Dialog template */
|
/* Dialog template */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -72,7 +63,6 @@ typedef struct
|
||||||
LPSTR caption;
|
LPSTR caption;
|
||||||
WORD pointSize;
|
WORD pointSize;
|
||||||
LPSTR faceName;
|
LPSTR faceName;
|
||||||
DLGCONTROL * controls;
|
|
||||||
} DLGTEMPLATE;
|
} DLGTEMPLATE;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* structure definitions for ICON
|
||||||
|
*
|
||||||
|
* Copyright Martin Ayotte, 1993
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE Width;
|
||||||
|
BYTE Height;
|
||||||
|
BYTE ColorCount;
|
||||||
|
BYTE Reserved1;
|
||||||
|
WORD Reserved2;
|
||||||
|
WORD Reserved3;
|
||||||
|
DWORD icoDIBSize;
|
||||||
|
DWORD icoDIBOffset;
|
||||||
|
} ICONDESCRIP;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ICONDESCRIP descriptor;
|
||||||
|
HBITMAP hBitmap;
|
||||||
|
HBITMAP hBitMask;
|
||||||
|
} ICONALLOC;
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,19 @@
|
||||||
#ifndef SEGMEM_H
|
#ifndef SEGMEM_H
|
||||||
#define SEGMEM_H
|
#define SEGMEM_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Array to track selector allocation.
|
||||||
|
*/
|
||||||
|
#define MAX_SELECTORS 512
|
||||||
|
#define SELECTOR_ISFREE 0x8000
|
||||||
|
#define SELECTOR_INDEXMASK 0x0fff
|
||||||
|
|
||||||
|
extern unsigned short SelectorMap[MAX_SELECTORS];
|
||||||
|
|
||||||
|
#define SAFEMAKEPTR(s, o) \
|
||||||
|
(((int) SelectorMap[SelectorMap[(s) >> 3] & SELECTOR_INDEXMASK] << 19) \
|
||||||
|
| 0x70000 | ((o) & 0xffff))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Structure to hold info about each selector we create.
|
* Structure to hold info about each selector we create.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -66,6 +66,14 @@ typedef int *LPCATCHBUF;
|
||||||
|
|
||||||
#define MAKELONG(low, high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
|
#define MAKELONG(low, high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
|
||||||
|
|
||||||
|
#ifndef max
|
||||||
|
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef min
|
||||||
|
#define min(a,b) (((a) < (b)) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
typedef long LONG;
|
typedef long LONG;
|
||||||
typedef WORD HANDLE;
|
typedef WORD HANDLE;
|
||||||
|
@ -136,6 +144,8 @@ typedef struct {
|
||||||
LPSTR lpszClassName __attribute__ ((packed));
|
LPSTR lpszClassName __attribute__ ((packed));
|
||||||
} WNDCLASS, *LPWNDCLASS;
|
} WNDCLASS, *LPWNDCLASS;
|
||||||
|
|
||||||
|
typedef LONG (* WNDPROC)() __attribute__ ((packed));
|
||||||
|
|
||||||
#define CS_VREDRAW 0x0001
|
#define CS_VREDRAW 0x0001
|
||||||
#define CS_HREDRAW 0x0002
|
#define CS_HREDRAW 0x0002
|
||||||
#define CS_KEYCVTWINDOW 0x0004
|
#define CS_KEYCVTWINDOW 0x0004
|
||||||
|
@ -230,6 +240,15 @@ typedef struct {
|
||||||
#define DLGC_STATIC 0x0100
|
#define DLGC_STATIC 0x0100
|
||||||
#define DLGC_BUTTON 0x2000
|
#define DLGC_BUTTON 0x2000
|
||||||
|
|
||||||
|
/* Standard dialog button IDs */
|
||||||
|
#define IDOK 1
|
||||||
|
#define IDCANCEL 2
|
||||||
|
#define IDABORT 3
|
||||||
|
#define IDRETRY 4
|
||||||
|
#define IDIGNORE 5
|
||||||
|
#define IDYES 6
|
||||||
|
#define IDNO 7
|
||||||
|
|
||||||
|
|
||||||
typedef struct { short x, y; } POINT;
|
typedef struct { short x, y; } POINT;
|
||||||
typedef POINT *PPOINT;
|
typedef POINT *PPOINT;
|
||||||
|
@ -735,17 +754,17 @@ typedef struct { BYTE rgbtBlue, rgbtGreen, rgbtRed; } RGBTRIPLE;
|
||||||
|
|
||||||
typedef struct tagBITMAPINFOHEADER
|
typedef struct tagBITMAPINFOHEADER
|
||||||
{
|
{
|
||||||
unsigned long biSize;
|
DWORD biSize;
|
||||||
unsigned long biWidth;
|
DWORD biWidth;
|
||||||
unsigned long biHeight;
|
DWORD biHeight;
|
||||||
unsigned short biPlanes;
|
WORD biPlanes;
|
||||||
unsigned short biBitCount;
|
WORD biBitCount;
|
||||||
unsigned long biCompression;
|
DWORD biCompression;
|
||||||
unsigned long biSizeImage;
|
DWORD biSizeImage;
|
||||||
unsigned long biXPelsPerMeter;
|
DWORD biXPelsPerMeter;
|
||||||
unsigned long biYPelsPerMeter;
|
DWORD biYPelsPerMeter;
|
||||||
unsigned long biClrUsed;
|
DWORD biClrUsed;
|
||||||
unsigned long biClrImportant;
|
DWORD biClrImportant;
|
||||||
} BITMAPINFOHEADER;
|
} BITMAPINFOHEADER;
|
||||||
|
|
||||||
typedef BITMAPINFOHEADER * LPBITMAPINFOHEADER;
|
typedef BITMAPINFOHEADER * LPBITMAPINFOHEADER;
|
||||||
|
@ -1021,8 +1040,34 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED,
|
||||||
#define GCW_HBRBACKGROUND (-10)
|
#define GCW_HBRBACKGROUND (-10)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MB_OK 0
|
#define MB_OK 0x0000
|
||||||
#define MB_ICONINFORMATION 0x0040
|
#define MB_OKCANCEL 0x0001
|
||||||
|
#define MB_ABORTRETRYIGNORE 0x0002
|
||||||
|
#define MB_YESNOCANCEL 0x0003
|
||||||
|
#define MB_YESNO 0x0004
|
||||||
|
#define MB_RETRYCANCEL 0x0005
|
||||||
|
#define MB_TYPEMASK 0x000F
|
||||||
|
|
||||||
|
#define MB_ICONHAND 0x0010
|
||||||
|
#define MB_ICONQUESTION 0x0020
|
||||||
|
#define MB_ICONEXCLAMATION 0x0030
|
||||||
|
#define MB_ICONASTERISK 0x0040
|
||||||
|
#define MB_ICONMASK 0x00F0
|
||||||
|
|
||||||
|
#define MB_ICONINFORMATION MB_ICONASTERISK
|
||||||
|
#define MB_ICONSTOP MB_ICONHAND
|
||||||
|
|
||||||
|
#define MB_DEFBUTTON1 0x0000
|
||||||
|
#define MB_DEFBUTTON2 0x0100
|
||||||
|
#define MB_DEFBUTTON3 0x0200
|
||||||
|
#define MB_DEFMASK 0x0F00
|
||||||
|
|
||||||
|
#define MB_APPLMODAL 0x0000
|
||||||
|
#define MB_SYSTEMMODAL 0x1000
|
||||||
|
#define MB_TASKMODAL 0x2000
|
||||||
|
|
||||||
|
#define MB_NOFOCUS 0x8000
|
||||||
|
|
||||||
|
|
||||||
#define DT_TOP 0
|
#define DT_TOP 0
|
||||||
#define DT_LEFT 0
|
#define DT_LEFT 0
|
||||||
|
@ -1079,6 +1124,11 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED,
|
||||||
#define WS_EX_ACCEPTFILES 0x00000010L
|
#define WS_EX_ACCEPTFILES 0x00000010L
|
||||||
#define WS_EX_TRANSPARENT 0x00000020L
|
#define WS_EX_TRANSPARENT 0x00000020L
|
||||||
|
|
||||||
|
/* Window scrolling */
|
||||||
|
#define SW_SCROLLCHILDREN 0x0001
|
||||||
|
#define SW_INVALIDATE 0x0002
|
||||||
|
#define SW_ERASE 0x0003
|
||||||
|
|
||||||
/* Button control styles */
|
/* Button control styles */
|
||||||
#define BS_PUSHBUTTON 0x00000000L
|
#define BS_PUSHBUTTON 0x00000000L
|
||||||
#define BS_DEFPUSHBUTTON 0x00000001L
|
#define BS_DEFPUSHBUTTON 0x00000001L
|
||||||
|
@ -1319,6 +1369,70 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED,
|
||||||
#define ODS_CHECKED 0x0008
|
#define ODS_CHECKED 0x0008
|
||||||
#define ODS_FOCUS 0x0010
|
#define ODS_FOCUS 0x0010
|
||||||
|
|
||||||
|
/* Edit control styles */
|
||||||
|
#define ES_LEFT 0x00000000L
|
||||||
|
#define ES_CENTER 0x00000001L
|
||||||
|
#define ES_RIGHT 0x00000002L
|
||||||
|
#define ES_MULTILINE 0x00000004L
|
||||||
|
#define ES_UPPERCASE 0x00000008L
|
||||||
|
#define ES_LOWERCASE 0x00000010L
|
||||||
|
#define ES_PASSWORD 0x00000020L
|
||||||
|
#define ES_AUTOVSCROLL 0x00000040L
|
||||||
|
#define ES_AUTOHSCROLL 0x00000080L
|
||||||
|
#define ES_NOHISESEL 0x00000100L
|
||||||
|
#define ES_OEMCONVERT 0x00000400L
|
||||||
|
#define ES_READONLY 0x00000800L
|
||||||
|
#define ES_WANTRETURN 0x00001000L
|
||||||
|
|
||||||
|
/* Edit control messages */
|
||||||
|
#define EM_GETSEL (WM_USER+0)
|
||||||
|
#define EM_SETSEL (WM_USER+1)
|
||||||
|
#define EM_GETRECT (WM_USER+2)
|
||||||
|
#define EM_SETRECT (WM_USER+3)
|
||||||
|
#define EM_SETRECTNP (WM_USER+4)
|
||||||
|
#define EM_LINESCROLL (WM_USER+6)
|
||||||
|
#define EM_GETMODIFY (WM_USER+8)
|
||||||
|
#define EM_SETMODIFY (WM_USER+9)
|
||||||
|
#define EM_GETLINECOUNT (WM_USER+10)
|
||||||
|
#define EM_LINEINDEX (WM_USER+11)
|
||||||
|
#define EM_SETHANDLE (WM_USER+12)
|
||||||
|
#define EM_GETHANDLE (WM_USER+13)
|
||||||
|
#define EM_LINELENGTH (WM_USER+17)
|
||||||
|
#define EM_REPLACESEL (WM_USER+18)
|
||||||
|
#define EM_GETLINE (WM_USER+20)
|
||||||
|
#define EM_LIMITTEXT (WM_USER+21)
|
||||||
|
#define EM_CANUNDO (WM_USER+22)
|
||||||
|
#define EM_UNDO (WM_USER+23)
|
||||||
|
#define EM_FMTLINES (WM_USER+24)
|
||||||
|
#define EM_LINEFROMCHAR (WM_USER+25)
|
||||||
|
#define EM_SETTABSTOPS (WM_USER+27)
|
||||||
|
#define EM_SETPASSWORDCHAR (WM_USER+28)
|
||||||
|
#define EM_EMPTYUNDOBUFFER (WM_USER+29)
|
||||||
|
#define EM_GETFIRSTVISIBLELINE (WM_USER+30)
|
||||||
|
#define EM_SETREADONLY (WM_USER+31)
|
||||||
|
#define EM_SETWORDBREAKPROC (WM_USER+32)
|
||||||
|
#define EM_GETWORDBREAKPROC (WM_USER+33)
|
||||||
|
#define EM_GETPASSWORDCHAR (WM_USER+34)
|
||||||
|
|
||||||
|
typedef int (CALLBACK *EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent,
|
||||||
|
int cch, int code);
|
||||||
|
|
||||||
|
/* EDITWORDBREAKPROC code values */
|
||||||
|
#define WB_LEFT 0
|
||||||
|
#define WB_RIGHT 1
|
||||||
|
#define WB_ISDELIMITER 2
|
||||||
|
|
||||||
|
/* Edit control notification codes */
|
||||||
|
#define EN_SETFOCUS 0x0100
|
||||||
|
#define EN_KILLFOCUS 0x0200
|
||||||
|
#define EN_CHANGE 0x0300
|
||||||
|
#define EN_UPDATE 0x0400
|
||||||
|
#define EN_ERRSPACE 0x0500
|
||||||
|
#define EN_MAXTEXT 0x0501
|
||||||
|
#define EN_HSCROLL 0x0601
|
||||||
|
#define EN_VSCROLL 0x0602
|
||||||
|
|
||||||
|
|
||||||
#define WM_DRAWITEM 0x002B
|
#define WM_DRAWITEM 0x002B
|
||||||
|
|
||||||
typedef struct tagDRAWITEMSTRUCT
|
typedef struct tagDRAWITEMSTRUCT
|
||||||
|
@ -1485,12 +1599,12 @@ Fb(int,_lopen,LPSTR,a,int,b)
|
||||||
Fa(int,lstrlen,LPCSTR,a)
|
Fa(int,lstrlen,LPCSTR,a)
|
||||||
Fa(LONG,DispatchMessage,LPMSG,msg)
|
Fa(LONG,DispatchMessage,LPMSG,msg)
|
||||||
Fa(void,UpdateWindow,HWND,a)
|
Fa(void,UpdateWindow,HWND,a)
|
||||||
Fa(ATOM,AddAtom,LPSTR,a)
|
Fa(ATOM,AddAtom,LPCSTR,a)
|
||||||
Fa(ATOM,DeleteAtom,ATOM,a)
|
Fa(ATOM,DeleteAtom,ATOM,a)
|
||||||
Fa(ATOM,FindAtom,LPSTR,a)
|
Fa(ATOM,FindAtom,LPCSTR,a)
|
||||||
Fa(ATOM,GlobalAddAtom,LPSTR,a)
|
Fa(ATOM,GlobalAddAtom,LPCSTR,a)
|
||||||
Fa(ATOM,GlobalDeleteAtom,ATOM,a)
|
Fa(ATOM,GlobalDeleteAtom,ATOM,a)
|
||||||
Fa(ATOM,GlobalFindAtom,LPSTR,a)
|
Fa(ATOM,GlobalFindAtom,LPCSTR,a)
|
||||||
Fa(BOOL,DeleteDC,HDC,a)
|
Fa(BOOL,DeleteDC,HDC,a)
|
||||||
Fa(BOOL,DeleteMetaFile,HANDLE,a)
|
Fa(BOOL,DeleteMetaFile,HANDLE,a)
|
||||||
Fa(BOOL,DeleteObject,HANDLE,a)
|
Fa(BOOL,DeleteObject,HANDLE,a)
|
||||||
|
@ -1504,7 +1618,7 @@ Fa(BOOL,FreeResource,HANDLE,a)
|
||||||
Fa(BOOL,GlobalUnWire,HANDLE,a)
|
Fa(BOOL,GlobalUnWire,HANDLE,a)
|
||||||
Fa(BOOL,GlobalUnfix,HANDLE,a)
|
Fa(BOOL,GlobalUnfix,HANDLE,a)
|
||||||
Fa(BOOL,GlobalUnlock,HANDLE,a)
|
Fa(BOOL,GlobalUnlock,HANDLE,a)
|
||||||
Fa(BOOL,InitAtomTable,int,a)
|
Fa(BOOL,InitAtomTable,WORD,a)
|
||||||
Fa(BOOL,IsClipboardFormatAvailable,WORD,a)
|
Fa(BOOL,IsClipboardFormatAvailable,WORD,a)
|
||||||
Fa(BOOL,IsIconic,HWND,a)
|
Fa(BOOL,IsIconic,HWND,a)
|
||||||
Fa(BOOL,IsRectEmpty,LPRECT,a)
|
Fa(BOOL,IsRectEmpty,LPRECT,a)
|
||||||
|
@ -1858,10 +1972,10 @@ Fc(LONG,GetBitmapBits,HBITMAP,a,LONG,b,LPSTR,c)
|
||||||
Fc(LONG,SetBitmapBits,HBITMAP,a,LONG,b,LPSTR,c)
|
Fc(LONG,SetBitmapBits,HBITMAP,a,LONG,b,LPSTR,c)
|
||||||
Fc(LONG,SetClassLong,HWND,a,short,b,LONG,c)
|
Fc(LONG,SetClassLong,HWND,a,short,b,LONG,c)
|
||||||
Fc(LONG,SetWindowLong,HWND,a,short,b,LONG,c)
|
Fc(LONG,SetWindowLong,HWND,a,short,b,LONG,c)
|
||||||
Fc(WORD,GetAtomName,ATOM,a,LPSTR,b,int,c)
|
Fc(WORD,GetAtomName,ATOM,a,LPSTR,b,short,c)
|
||||||
Fc(WORD,GetMenuState,HMENU,a,WORD,b,WORD,c)
|
Fc(WORD,GetMenuState,HMENU,a,WORD,b,WORD,c)
|
||||||
Fc(WORD,GetProfileInt,LPSTR,a,LPSTR,b,int,c)
|
Fc(WORD,GetProfileInt,LPSTR,a,LPSTR,b,int,c)
|
||||||
Fc(WORD,GlobalGetAtomName,ATOM,a,LPSTR,b,int,c)
|
Fc(WORD,GlobalGetAtomName,ATOM,a,LPSTR,b,short,c)
|
||||||
Fc(WORD,SetClassWord,HWND,a,short,b,WORD,c)
|
Fc(WORD,SetClassWord,HWND,a,short,b,WORD,c)
|
||||||
Fc(WORD,SetWindowWord,HWND,a,short,b,WORD,c)
|
Fc(WORD,SetWindowWord,HWND,a,short,b,WORD,c)
|
||||||
Fb(WORD,SetBkMode,HDC,a,WORD,b)
|
Fb(WORD,SetBkMode,HDC,a,WORD,b)
|
||||||
|
@ -1911,7 +2025,7 @@ Fd(BOOL,PostMessage,HWND,a,WORD,b,WORD,c,LONG,d)
|
||||||
Fd(LONG,SendMessage,HWND,a,WORD,b,WORD,c,LONG,d)
|
Fd(LONG,SendMessage,HWND,a,WORD,b,WORD,c,LONG,d)
|
||||||
Fd(BOOL,GetMessage,LPMSG,msg,HWND,b,WORD,c,WORD,d)
|
Fd(BOOL,GetMessage,LPMSG,msg,HWND,b,WORD,c,WORD,d)
|
||||||
Fd(BOOL,GetTextExtentPoint,HDC,a,LPSTR,b,short,c,LPSIZE,d)
|
Fd(BOOL,GetTextExtentPoint,HDC,a,LPSTR,b,short,c,LPSIZE,d)
|
||||||
Fd(BOOL,DrawIcon,HDC,a,int,b,int,c,HICON,d)
|
Fd(BOOL,DrawIcon,HDC,a,short,b,short,c,HICON,d)
|
||||||
Fd(BOOL,EnumMetaFile,HDC,a,LOCALHANDLE,b,FARPROC,c,BYTE FAR*,d)
|
Fd(BOOL,EnumMetaFile,HDC,a,LOCALHANDLE,b,FARPROC,c,BYTE FAR*,d)
|
||||||
Fd(BOOL,FloodFill,HDC,a,int,b,int,c,DWORD,d)
|
Fd(BOOL,FloodFill,HDC,a,int,b,int,c,DWORD,d)
|
||||||
Fd(BOOL,GetCharWidth,HDC,a,WORD,b,WORD,c,LPINT,d)
|
Fd(BOOL,GetCharWidth,HDC,a,WORD,b,WORD,c,LPINT,d)
|
||||||
|
@ -1986,7 +2100,7 @@ Fe(HWND,CreateDialogParam,HANDLE,a,LPCSTR,b,HWND,c,FARPROC,d,LPARAM,e)
|
||||||
Fe(LONG,DefFrameProc,HWND,a,HWND,b,WORD,c,WORD,d,LONG,e)
|
Fe(LONG,DefFrameProc,HWND,a,HWND,b,WORD,c,WORD,d,LONG,e)
|
||||||
Fe(LONG,SendDlgItemMessage,HWND,a,WORD,b,WORD,c,WORD,d,LONG,e)
|
Fe(LONG,SendDlgItemMessage,HWND,a,WORD,b,WORD,c,WORD,d,LONG,e)
|
||||||
Fe(int,DialogBoxIndirectParam,HANDLE,a,HANDLE,b,HWND,c,FARPROC,d,LONG,e)
|
Fe(int,DialogBoxIndirectParam,HANDLE,a,HANDLE,b,HWND,c,FARPROC,d,LONG,e)
|
||||||
Fe(int,DialogBoxParam,HANDLE,a,LPSTR,b,HWND,c,FARPROC,d,LONG,e)
|
Fe(int,DialogBoxParam,HANDLE,a,LPCSTR,b,HWND,c,FARPROC,d,LONG,e)
|
||||||
Fe(int,DlgDirList,HWND,a,LPSTR,b,int,c,int,d,WORD,e)
|
Fe(int,DlgDirList,HWND,a,LPSTR,b,int,c,int,d,WORD,e)
|
||||||
Fe(int,DlgDirListComboBox,HWND,a,LPSTR,b,int,c,int,d,WORD,e)
|
Fe(int,DlgDirListComboBox,HWND,a,LPSTR,b,int,c,int,d,WORD,e)
|
||||||
Fe(int,Escape,HDC,a,int,b,int,c,LPSTR,d,LPSTR,e)
|
Fe(int,Escape,HDC,a,int,b,int,c,LPSTR,d,LPSTR,e)
|
||||||
|
@ -1999,7 +2113,7 @@ Fe(int,IntersectVisRect,HDC,a,short,b,short,c,short,d,short,e)
|
||||||
Fe(int,SetVoiceAccent,int,a,int,b,int,c,int,d,int,e)
|
Fe(int,SetVoiceAccent,int,a,int,b,int,c,int,d,int,e)
|
||||||
Fe(int,ToAscii,WORD,wVirtKey,WORD,wScanCode,LPSTR,lpKeyState,LPVOID,lpChar,WORD,wFlags)
|
Fe(int,ToAscii,WORD,wVirtKey,WORD,wScanCode,LPSTR,lpKeyState,LPVOID,lpChar,WORD,wFlags)
|
||||||
Fe(void,PaintRect,HWND,a,HWND,b,HDC,c,HBRUSH,d,LPRECT,e)
|
Fe(void,PaintRect,HWND,a,HWND,b,HDC,c,HBRUSH,d,LPRECT,e)
|
||||||
Fe(void,ScrollWindow,HWND,a,int,b,int,c,LPRECT,d,LPRECT,e)
|
Fe(void,ScrollWindow,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e)
|
||||||
Fe(void,SetRect,LPRECT,a,short,b,short,c,short,d,short,e)
|
Fe(void,SetRect,LPRECT,a,short,b,short,c,short,d,short,e)
|
||||||
Fe(void,SetRectRgn,HRGN,a,short,b,short,c,short,d,short,e)
|
Fe(void,SetRectRgn,HRGN,a,short,b,short,c,short,d,short,e)
|
||||||
Fe(void,SetScrollRange,HWND,a,int,b,int,c,int,d,BOOL,e)
|
Fe(void,SetScrollRange,HWND,a,int,b,int,c,int,d,BOOL,e)
|
||||||
|
@ -2012,7 +2126,7 @@ Ff(void,MoveWindow,HWND,a,short,b,short,c,short,d,short,e,BOOL,f)
|
||||||
Ff(BOOL,ScaleViewportExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
|
Ff(BOOL,ScaleViewportExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
|
||||||
Ff(BOOL,ScaleWindowExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
|
Ff(BOOL,ScaleWindowExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
|
||||||
Fg(BOOL,RoundRect,HDC,a,short,b,short,c,short,d,short,e,short,f,short,g)
|
Fg(BOOL,RoundRect,HDC,a,short,b,short,c,short,d,short,e,short,f,short,g)
|
||||||
Fg(BOOL,ScrollDC,HDC,a,int,b,int,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g)
|
Fg(BOOL,ScrollDC,HDC,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g)
|
||||||
Fg(BOOL,TrackPopupMenu,HMENU,a,WORD,b,int,c,int,d,int,e,HWND,f,LPRECT,g)
|
Fg(BOOL,TrackPopupMenu,HMENU,a,WORD,b,int,c,int,d,int,e,HWND,f,LPRECT,g)
|
||||||
Fg(HCURSOR,CreateCursor,HANDLE,a,int,b,int,c,int,d,int,e,LPSTR,f,LPSTR,g)
|
Fg(HCURSOR,CreateCursor,HANDLE,a,int,b,int,c,int,d,int,e,LPSTR,f,LPSTR,g)
|
||||||
Fg(HICON,CreateIcon,HANDLE,a,int,b,int,c,BYTE,d,BYTE,e,LPSTR,f,LPSTR,g)
|
Fg(HICON,CreateIcon,HANDLE,a,int,b,int,c,BYTE,d,BYTE,e,LPSTR,f,LPSTR,g)
|
||||||
|
@ -2022,6 +2136,7 @@ Fg(void,SetWindowPos,HWND,a,HWND,b,short,c,short,d,short,e,short,f,WORD,g)
|
||||||
Fh(BOOL,ExtTextOut,HDC,a,int,b,int,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
|
Fh(BOOL,ExtTextOut,HDC,a,int,b,int,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
|
||||||
Fh(HANDLE,DeferWindowPos,HANDLE,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,int,x,int,y,int,cx,int,cy,WORD,wFlags)
|
Fh(HANDLE,DeferWindowPos,HANDLE,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,int,x,int,y,int,cx,int,cy,WORD,wFlags)
|
||||||
Fh(LONG,TabbedTextOut,HDC,a,int,b,int,c,LPSTR,d,int,e,int,f,LPINT,g,int,h)
|
Fh(LONG,TabbedTextOut,HDC,a,int,b,int,c,LPSTR,d,int,e,int,f,LPINT,g,int,h)
|
||||||
|
Fh(int,ScrollWindowEx,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g,WORD,h)
|
||||||
Fi(BOOL,Arc,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
|
Fi(BOOL,Arc,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
|
||||||
Fi(BOOL,Chord,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
|
Fi(BOOL,Chord,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
|
||||||
Fi(BOOL,BitBlt,HDC,a,short,b,short,c,short,d,short,e,HDC,f,short,g,short,h,DWORD,i)
|
Fi(BOOL,BitBlt,HDC,a,short,b,short,c,short,d,short,e,HDC,f,short,g,short,h,DWORD,i)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
|
CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
|
||||||
|
|
||||||
OBJS=dump.o files.o ldt.o ldtlib.o resource.o selector.o signal.o int1a.o \
|
OBJS=dump.o files.o ldt.o ldtlib.o resource.o selector.o signal.o int1a.o \
|
||||||
int21.o wine.o
|
int21.o wine.o library.o
|
||||||
|
|
||||||
default: loader.o
|
default: loader.o
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,7 @@ FindFileInPath(char *buffer, int buflen, char *rootname,
|
||||||
strncpy(buffer, dirname, buflen);
|
strncpy(buffer, dirname, buflen);
|
||||||
strncat(buffer, "/", buflen - strlen(buffer));
|
strncat(buffer, "/", buflen - strlen(buffer));
|
||||||
strncat(buffer, f->d_name, buflen - strlen(buffer));
|
strncat(buffer, f->d_name, buflen - strlen(buffer));
|
||||||
|
closedir(d);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -665,6 +665,7 @@ void GetFileDateTime(struct sigcontext_struct *context)
|
||||||
struct stat filestat;
|
struct stat filestat;
|
||||||
struct tm *now;
|
struct tm *now;
|
||||||
|
|
||||||
|
dirname = (char *) pointer(DS,DX);
|
||||||
ParseDOSFileName(unixname, dirname, &drive);
|
ParseDOSFileName(unixname, dirname, &drive);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -872,7 +873,7 @@ int do_int21(struct sigcontext_struct * context){
|
||||||
case 0x12: /* FIND NEXT MATCHING FILE USING FCB */
|
case 0x12: /* FIND NEXT MATCHING FILE USING FCB */
|
||||||
case 0x13: /* DELETE FILE USING FCB */
|
case 0x13: /* DELETE FILE USING FCB */
|
||||||
case 0x14: /* SEQUENTIAL READ FROM FCB FILE */
|
case 0x14: /* SEQUENTIAL READ FROM FCB FILE */
|
||||||
case 0x15: /* SEQUENTIAL WRITE TO FCB FILE
|
case 0x15: /* SEQUENTIAL WRITE TO FCB FILE */
|
||||||
case 0x16: /* CREATE OR TRUNCATE FILE USING FCB */
|
case 0x16: /* CREATE OR TRUNCATE FILE USING FCB */
|
||||||
case 0x17: /* RENAME FILE USING FCB */
|
case 0x17: /* RENAME FILE USING FCB */
|
||||||
case 0x1a: /* SET DISK TRANSFER AREA ADDRESS */
|
case 0x1a: /* SET DISK TRANSFER AREA ADDRESS */
|
||||||
|
@ -888,7 +889,7 @@ int do_int21(struct sigcontext_struct * context){
|
||||||
case 0x2e: /* SET VERIFY FLAG */
|
case 0x2e: /* SET VERIFY FLAG */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x18: /* NULL FUNCTIONS FOR CP/M COMPATIBILITY *
|
case 0x18: /* NULL FUNCTIONS FOR CP/M COMPATIBILITY */
|
||||||
case 0x1d:
|
case 0x1d:
|
||||||
case 0x1e:
|
case 0x1e:
|
||||||
case 0x20:
|
case 0x20:
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "prototypes.h"
|
||||||
|
#include "windows.h"
|
||||||
|
#include "win.h"
|
||||||
|
#include "gdi.h"
|
||||||
|
#include "wine.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* LoadLibrary [KERNEL.95]
|
||||||
|
*/
|
||||||
|
HANDLE LoadLibrary(LPSTR libname)
|
||||||
|
{
|
||||||
|
HANDLE hRet;
|
||||||
|
printf("LoadLibrary '%s'\n", libname);
|
||||||
|
hRet = LoadImage(libname, NULL);
|
||||||
|
printf("after LoadLibrary hRet=%04X\n", hRet);
|
||||||
|
return hRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* FreeLibrary [KERNEL.96]
|
||||||
|
*/
|
||||||
|
void FreeLibrary(HANDLE hLib)
|
||||||
|
{
|
||||||
|
printf("FreeLibrary(%04X);\n", hLib);
|
||||||
|
if (hLib != (HANDLE)NULL) GlobalFree(hLib);
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
static char RCSId[] = "$Id: resource.c,v 1.4 1993/07/04 04:04:21 root Exp root $";
|
static char RCSId[] = "$Id: resource.c,v 1.4 1993/07/04 04:04:21 root Exp root $";
|
||||||
static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
|
|
||||||
|
#include <X11/Intrinsic.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -8,16 +9,32 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "neexe.h"
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
#include "win.h"
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "wine.h"
|
#include "wine.h"
|
||||||
|
#include "icon.h"
|
||||||
|
#include "cursor.h"
|
||||||
|
|
||||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||||
|
|
||||||
|
typedef struct resource_s
|
||||||
|
{
|
||||||
|
struct resource_s *next;
|
||||||
|
HANDLE info_mem;
|
||||||
|
int size_shift;
|
||||||
|
struct resource_nameinfo_s nameinfo;
|
||||||
|
HANDLE rsc_mem;
|
||||||
|
} RESOURCE;
|
||||||
|
|
||||||
static int ResourceFd = -1;
|
static int ResourceFd = -1;
|
||||||
static HANDLE ResourceInst = 0;
|
static HANDLE ResourceInst = 0;
|
||||||
static struct w_files *ResourceFileInfo = NULL;
|
static struct w_files *ResourceFileInfo = NULL;
|
||||||
|
static RESOURCE *Top = NULL;
|
||||||
|
static HCURSOR hActiveCursor;
|
||||||
|
extern HINSTANCE hSysRes;
|
||||||
|
|
||||||
|
HANDLE RSC_LoadResource(int instance, char *rsc_name, int type, int *image_size_ret);
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
@ -227,6 +244,11 @@ FindResourceByName(struct resource_nameinfo_s *result_p,
|
||||||
printf("FindResourceByName (%s) bad typeinfo size !\n", resource_name);
|
printf("FindResourceByName (%s) bad typeinfo size !\n", resource_name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG_RESOURCE
|
||||||
|
printf("FindResourceByName typeinfo.type_id=%d type_id=%d\n",
|
||||||
|
typeinfo.type_id, type_id);
|
||||||
|
#endif
|
||||||
|
if (typeinfo.type_id == 0) break;
|
||||||
if (typeinfo.type_id == type_id || type_id == -1)
|
if (typeinfo.type_id == type_id || type_id == -1)
|
||||||
{
|
{
|
||||||
for (i = 0; i < typeinfo.count; i++)
|
for (i = 0; i < typeinfo.count; i++)
|
||||||
|
@ -248,6 +270,10 @@ FindResourceByName(struct resource_nameinfo_s *result_p,
|
||||||
read(ResourceFd, name, nbytes);
|
read(ResourceFd, name, nbytes);
|
||||||
lseek(ResourceFd, old_pos, SEEK_SET);
|
lseek(ResourceFd, old_pos, SEEK_SET);
|
||||||
name[nbytes] = '\0';
|
name[nbytes] = '\0';
|
||||||
|
#ifdef DEBUG_RESOURCE
|
||||||
|
printf("FindResourceByName type_id=%d name='%s' resource_name='%s'\n",
|
||||||
|
typeinfo.type_id, name, resource_name);
|
||||||
|
#endif
|
||||||
if (strcasecmp(name, resource_name) == 0)
|
if (strcasecmp(name, resource_name) == 0)
|
||||||
{
|
{
|
||||||
memcpy(result_p, &nameinfo, sizeof(nameinfo));
|
memcpy(result_p, &nameinfo, sizeof(nameinfo));
|
||||||
|
@ -255,31 +281,289 @@ FindResourceByName(struct resource_nameinfo_s *result_p,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
lseek(ResourceFd, (typeinfo.count * sizeof(nameinfo)), SEEK_CUR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
printf("FindResourceByName (%s) typeinfo.type_id = 0 !\n", resource_name);
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* LoadIcon
|
* LoadIcon [USER.174]
|
||||||
*/
|
*/
|
||||||
HICON
|
HICON LoadIcon(HANDLE instance, LPSTR icon_name)
|
||||||
LoadIcon(HANDLE instance, LPSTR icon_name)
|
|
||||||
{
|
{
|
||||||
fprintf(stderr,"LoadIcon: (%d),%d\n",instance,icon_name);
|
HICON hIcon;
|
||||||
|
HANDLE rsc_mem;
|
||||||
|
WORD *lp;
|
||||||
|
ICONDESCRIP *lpicodesc;
|
||||||
|
ICONALLOC *lpico;
|
||||||
|
int width, height;
|
||||||
|
BITMAPINFO *bmi;
|
||||||
|
BITMAPINFOHEADER *bih;
|
||||||
|
RGBQUAD *rgbq;
|
||||||
|
HBITMAP hBitMap;
|
||||||
|
HDC hMemDC;
|
||||||
|
HDC hMemDC2;
|
||||||
|
HDC hdc;
|
||||||
|
int i, j, image_size;
|
||||||
|
#ifdef DEBUG_RESOURCE
|
||||||
|
printf("LoadIcon: instance = %04x, name = %08x\n",
|
||||||
|
instance, icon_name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (instance == (HANDLE)NULL) instance = hSysRes;
|
||||||
|
if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
|
||||||
|
rsc_mem = RSC_LoadResource(instance, icon_name, NE_RSCTYPE_GROUP_ICON,
|
||||||
|
&image_size);
|
||||||
|
if (rsc_mem == (HANDLE)NULL) {
|
||||||
|
printf("LoadIcon / Icon %04X not Found !\n", icon_name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lp = (WORD *)GlobalLock(rsc_mem);
|
||||||
|
if (lp == NULL) {
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lpicodesc = (ICONDESCRIP *)(lp + 3);
|
||||||
|
hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
|
||||||
|
if (hIcon == (HICON)NULL) {
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf("LoadIcon Alloc hIcon=%X\n", hIcon);
|
||||||
|
lpico = (ICONALLOC *)GlobalLock(hIcon);
|
||||||
|
lpico->descriptor = *lpicodesc;
|
||||||
|
width = lpicodesc->Width;
|
||||||
|
height = lpicodesc->Height;
|
||||||
|
GlobalUnlock(rsc_mem);
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
rsc_mem = RSC_LoadResource(instance,
|
||||||
|
MAKEINTRESOURCE(lpicodesc->icoDIBOffset),
|
||||||
|
NE_RSCTYPE_ICON, &image_size);
|
||||||
|
if (rsc_mem == (HANDLE)NULL) {
|
||||||
|
printf("LoadIcon / Icon %04X Bitmaps not Found !\n", icon_name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lp = (WORD *)GlobalLock(rsc_mem);
|
||||||
|
if (lp == NULL) {
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
bmi = (BITMAPINFO *)lp;
|
||||||
|
bih = (BITMAPINFOHEADER *)lp;
|
||||||
|
rgbq = &bmi->bmiColors[0];
|
||||||
|
bih->biHeight = bih->biHeight / 2;
|
||||||
|
/*
|
||||||
|
printf("LoadIcon / image_size=%d width=%d height=%d bih->biBitCount=%d bih->biSizeImage=%ld\n",
|
||||||
|
image_size, width, height, bih->biBitCount, bih->biSizeImage);
|
||||||
|
*/
|
||||||
|
if (bih->biSize == sizeof(BITMAPINFOHEADER))
|
||||||
|
lpico->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)bih);
|
||||||
|
else
|
||||||
|
lpico->hBitmap = 0;
|
||||||
|
bih->biBitCount = 1;
|
||||||
|
bih->biClrUsed = bih->biClrImportant = 2;
|
||||||
|
rgbq[0].rgbBlue = 0xFF;
|
||||||
|
rgbq[0].rgbGreen = 0xFF;
|
||||||
|
rgbq[0].rgbRed = 0xFF;
|
||||||
|
rgbq[0].rgbReserved = 0x00;
|
||||||
|
rgbq[1].rgbBlue = 0x00;
|
||||||
|
rgbq[1].rgbGreen = 0x00;
|
||||||
|
rgbq[1].rgbRed = 0x00;
|
||||||
|
rgbq[1].rgbReserved = 0x00;
|
||||||
|
lpico->hBitMask = CreateDIBitmap(hdc, bih, CBM_INIT,
|
||||||
|
(LPSTR)lp + bih->biSizeImage - sizeof(BITMAPINFOHEADER) / 2 - 4,
|
||||||
|
(BITMAPINFO *)bih, DIB_RGB_COLORS );
|
||||||
|
GlobalUnlock(rsc_mem);
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
|
||||||
|
hMemDC = CreateCompatibleDC(hdc);
|
||||||
|
hMemDC2 = CreateCompatibleDC(hdc);
|
||||||
|
SelectObject(hMemDC, lpico->hBitmap);
|
||||||
|
SelectObject(hMemDC2, lpico->hBitMask);
|
||||||
|
BitBlt(hMemDC, 0, 0, bih->biWidth, bih->biHeight, hMemDC2, 0, 0, SRCINVERT);
|
||||||
|
DeleteDC(hMemDC);
|
||||||
|
DeleteDC(hMemDC2);
|
||||||
|
|
||||||
|
ReleaseDC(0, hdc);
|
||||||
|
return hIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* DestroyIcon [USER.457]
|
||||||
|
*/
|
||||||
|
BOOL DestroyIcon(HICON hIcon)
|
||||||
|
{
|
||||||
|
ICONALLOC *lpico;
|
||||||
|
if (hIcon == (HICON)NULL) return FALSE;
|
||||||
|
lpico = (ICONALLOC *)GlobalLock(hIcon);
|
||||||
|
if (lpico->hBitmap != (HBITMAP)NULL) DeleteObject(lpico->hBitmap);
|
||||||
|
GlobalFree(hIcon);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* LoadCursor [USER.173]
|
||||||
|
*/
|
||||||
|
HCURSOR LoadCursor(HANDLE instance, LPSTR cursor_name)
|
||||||
|
{
|
||||||
|
XColor bkcolor;
|
||||||
|
XColor fgcolor;
|
||||||
|
HCURSOR hCursor;
|
||||||
|
HANDLE rsc_mem;
|
||||||
|
WORD *lp;
|
||||||
|
CURSORDESCRIP *lpcurdesc;
|
||||||
|
CURSORALLOC *lpcur;
|
||||||
|
BITMAP BitMap;
|
||||||
|
HBITMAP hBitMap;
|
||||||
|
HDC hMemDC;
|
||||||
|
HDC hdc;
|
||||||
|
int i, j, image_size;
|
||||||
|
#ifdef DEBUG_RESOURCE
|
||||||
|
printf("LoadCursor: instance = %04x, name = %08x\n",
|
||||||
|
instance, cursor_name);
|
||||||
|
#endif
|
||||||
|
if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
|
||||||
|
if (instance == (HANDLE)NULL) instance = hSysRes;
|
||||||
|
rsc_mem = RSC_LoadResource(instance, cursor_name, NE_RSCTYPE_GROUP_CURSOR,
|
||||||
|
&image_size);
|
||||||
|
if (rsc_mem == (HANDLE)NULL) {
|
||||||
|
printf("LoadCursor / Cursor %08X not Found !\n", cursor_name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lp = (WORD *)GlobalLock(rsc_mem);
|
||||||
|
if (lp == NULL) {
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lpcurdesc = (CURSORDESCRIP *)(lp + 3);
|
||||||
|
#ifdef DEBUG_CURSOR
|
||||||
|
printf("LoadCursor / image_size=%d\n", image_size);
|
||||||
|
printf("LoadCursor / curReserved=%X\n", *lp);
|
||||||
|
printf("LoadCursor / curResourceType=%X\n", *(lp + 1));
|
||||||
|
printf("LoadCursor / curResourceCount=%X\n", *(lp + 2));
|
||||||
|
printf("LoadCursor / cursor Width=%d\n", (int)lpcurdesc->Width);
|
||||||
|
printf("LoadCursor / cursor Height=%d\n", (int)lpcurdesc->Height);
|
||||||
|
printf("LoadCursor / cursor curXHotspot=%d\n", (int)lpcurdesc->curXHotspot);
|
||||||
|
printf("LoadCursor / cursor curYHotspot=%d\n", (int)lpcurdesc->curYHotspot);
|
||||||
|
printf("LoadCursor / cursor curDIBSize=%lX\n", (DWORD)lpcurdesc->curDIBSize);
|
||||||
|
printf("LoadCursor / cursor curDIBOffset=%lX\n", (DWORD)lpcurdesc->curDIBOffset);
|
||||||
|
#endif
|
||||||
|
hCursor = GlobalAlloc(GMEM_MOVEABLE, sizeof(CURSORALLOC) + 1024L);
|
||||||
|
if (hCursor == (HCURSOR)NULL) {
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf("LoadCursor Alloc hCursor=%X\n", hCursor);
|
||||||
|
lpcur = (CURSORALLOC *)GlobalLock(hCursor);
|
||||||
|
lpcur->descriptor = *lpcurdesc;
|
||||||
|
GlobalUnlock(rsc_mem);
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
rsc_mem = RSC_LoadResource(instance,
|
||||||
|
MAKEINTRESOURCE(lpcurdesc->curDIBOffset),
|
||||||
|
NE_RSCTYPE_CURSOR, &image_size);
|
||||||
|
if (rsc_mem == (HANDLE)NULL) {
|
||||||
|
printf("LoadCursor / Cursor %08X Bitmap not Found !\n", cursor_name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lp = (WORD *)GlobalLock(rsc_mem);
|
||||||
|
if (lp == NULL) {
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lp += 2;
|
||||||
|
for (j = 0; j < 16; j++)
|
||||||
|
printf("%04X ", *(lp + j));
|
||||||
|
if (*lp == sizeof(BITMAPINFOHEADER))
|
||||||
|
lpcur->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)lp);
|
||||||
|
else
|
||||||
|
lpcur->hBitmap = 0;
|
||||||
|
lp += sizeof(BITMAP);
|
||||||
|
for (i = 0; i < 81; i++) {
|
||||||
|
char temp = *((char *)lp + 162 + i);
|
||||||
|
*((char *)lp + 162 + i) = *((char *)lp + 324 - i);
|
||||||
|
*((char *)lp + 324 - i) = temp;
|
||||||
|
}
|
||||||
|
printf("LoadCursor / before XCreatePixmapFromBitmapData !\n");
|
||||||
|
lpcur->pixshape = XCreatePixmapFromBitmapData(
|
||||||
|
XT_display, DefaultRootWindow(XT_display),
|
||||||
|
((char *)lp + 211), 32, 32,
|
||||||
|
/*
|
||||||
|
lpcurdesc->Width / 2, lpcurdesc->Height / 4,
|
||||||
|
*/
|
||||||
|
WhitePixel(XT_display, DefaultScreen(XT_display)),
|
||||||
|
BlackPixel(XT_display, DefaultScreen(XT_display)), 1);
|
||||||
|
lpcur->pixmask = lpcur->pixshape;
|
||||||
|
bkcolor.pixel = WhitePixel(XT_display, DefaultScreen(XT_display));
|
||||||
|
fgcolor.pixel = BlackPixel(XT_display, DefaultScreen(XT_display));
|
||||||
|
printf("LoadCursor / before XCreatePixmapCursor !\n");
|
||||||
|
lpcur->xcursor = XCreatePixmapCursor(XT_display,
|
||||||
|
lpcur->pixshape, lpcur->pixmask,
|
||||||
|
&fgcolor, &bkcolor, lpcur->descriptor.curXHotspot,
|
||||||
|
lpcur->descriptor.curYHotspot);
|
||||||
|
|
||||||
|
ReleaseDC(0, hdc);
|
||||||
|
GlobalUnlock(rsc_mem);
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
return hCursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* DestroyCursor [USER.458]
|
||||||
|
*/
|
||||||
|
BOOL DestroyCursor(HCURSOR hCursor)
|
||||||
|
{
|
||||||
|
CURSORALLOC *lpcur;
|
||||||
|
if (hCursor == (HCURSOR)NULL) return FALSE;
|
||||||
|
lpcur = (CURSORALLOC *)GlobalLock(hCursor);
|
||||||
|
if (lpcur->hBitmap != (HBITMAP)NULL) DeleteObject(lpcur->hBitmap);
|
||||||
|
GlobalUnlock(hCursor);
|
||||||
|
GlobalFree(hCursor);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* SetCursor [USER.69]
|
||||||
|
*/
|
||||||
|
HCURSOR SetCursor(HCURSOR hCursor)
|
||||||
|
{
|
||||||
|
HDC hDC;
|
||||||
|
HDC hMemDC;
|
||||||
|
BITMAP bm;
|
||||||
|
CURSORALLOC *lpcur;
|
||||||
|
HCURSOR hOldCursor;
|
||||||
|
#ifdef DEBUG_CURSOR
|
||||||
|
printf("SetCursor / hCursor=%04X !\n", hCursor);
|
||||||
|
#endif
|
||||||
|
if (hCursor == (HCURSOR)NULL) return FALSE;
|
||||||
|
lpcur = (CURSORALLOC *)GlobalLock(hCursor);
|
||||||
|
hOldCursor = hActiveCursor;
|
||||||
|
|
||||||
|
printf("SetCursor / before XDefineCursor !\n");
|
||||||
|
XDefineCursor(XT_display, DefaultRootWindow(XT_display), lpcur->xcursor);
|
||||||
|
GlobalUnlock(hCursor);
|
||||||
|
hActiveCursor = hCursor;
|
||||||
|
return hOldCursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* ShowCursor [USER.71]
|
||||||
|
*/
|
||||||
|
int ShowCursor(BOOL bShow)
|
||||||
|
{
|
||||||
|
if (bShow) {
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* LoadCursor
|
|
||||||
*/
|
|
||||||
HCURSOR
|
|
||||||
LoadCursor(HANDLE instance, LPSTR cursor_name)
|
|
||||||
{
|
|
||||||
fprintf(stderr,"LoadCursor: (%d),%d\n",instance,cursor_name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* LoadAccelerators
|
* LoadAccelerators
|
||||||
|
@ -296,8 +580,43 @@ LoadAccelerators(HANDLE instance, LPSTR lpTableName)
|
||||||
*/
|
*/
|
||||||
HANDLE FindResource(HANDLE instance, LPSTR resource_name, LPSTR type_name)
|
HANDLE FindResource(HANDLE instance, LPSTR resource_name, LPSTR type_name)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"FindResource: (%d),%d\n",instance, resource_name, type_name);
|
RESOURCE *r;
|
||||||
return 0;
|
HANDLE rh;
|
||||||
|
|
||||||
|
if (instance == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (OpenResourceFile(instance) < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
rh = GlobalAlloc(GMEM_MOVEABLE, sizeof(*r));
|
||||||
|
if (rh == 0)
|
||||||
|
return 0;
|
||||||
|
r = (RESOURCE *)GlobalLock(rh);
|
||||||
|
|
||||||
|
r->next = Top;
|
||||||
|
Top = r;
|
||||||
|
r->info_mem = rh;
|
||||||
|
r->rsc_mem = 0;
|
||||||
|
|
||||||
|
if (((int) resource_name & 0xffff0000) == 0)
|
||||||
|
{
|
||||||
|
r->size_shift = FindResourceByNumber(&r->nameinfo, type_name,
|
||||||
|
(int) resource_name | 0x8000);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r->size_shift = FindResourceByName(&r->nameinfo, type_name,
|
||||||
|
resource_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r->size_shift == -1)
|
||||||
|
{
|
||||||
|
GlobalFree(rh);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rh;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
@ -305,8 +624,36 @@ HANDLE FindResource(HANDLE instance, LPSTR resource_name, LPSTR type_name)
|
||||||
*/
|
*/
|
||||||
HANDLE LoadResource(HANDLE instance, HANDLE hResInfo)
|
HANDLE LoadResource(HANDLE instance, HANDLE hResInfo)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"LoadResource: (%d),%d\n",instance, hResInfo);
|
RESOURCE *r;
|
||||||
return ;
|
int image_size;
|
||||||
|
void *image;
|
||||||
|
HANDLE h;
|
||||||
|
|
||||||
|
if (instance == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (OpenResourceFile(instance) < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
r = (RESOURCE *)GlobalLock(hResInfo);
|
||||||
|
if (r == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
image_size = r->nameinfo.length << r->size_shift;
|
||||||
|
|
||||||
|
h = r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, image_size);
|
||||||
|
image = GlobalLock(h);
|
||||||
|
|
||||||
|
if (image == NULL || read(ResourceFd, image, image_size) != image_size)
|
||||||
|
{
|
||||||
|
GlobalFree(h);
|
||||||
|
GlobalUnlock(hResInfo);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GlobalUnlock(h);
|
||||||
|
GlobalUnlock(hResInfo);
|
||||||
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
@ -314,19 +661,51 @@ HANDLE LoadResource(HANDLE instance, HANDLE hResInfo)
|
||||||
*/
|
*/
|
||||||
LPSTR LockResource(HANDLE hResData)
|
LPSTR LockResource(HANDLE hResData)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"LockResource: %d\n", hResData);
|
return GlobalLock(hResData);
|
||||||
return ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* FreeResource [KERNEL.63]
|
* FreeResource [KERNEL.63]
|
||||||
*/
|
*/
|
||||||
BOOL FreeResource(HANDLE hResData)
|
HANDLE FreeResource(HANDLE hResData)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"FreeResource: %d\n", hResData);
|
RESOURCE *r, *rp;
|
||||||
return ;
|
|
||||||
|
for (r = rp = Top; r != NULL; r = r->next)
|
||||||
|
{
|
||||||
|
if (r->info_mem == hResData)
|
||||||
|
{
|
||||||
|
if (rp != NULL)
|
||||||
|
rp->next = r->next;
|
||||||
|
else
|
||||||
|
Top = r->next;
|
||||||
|
|
||||||
|
GlobalFree(r->rsc_mem);
|
||||||
|
GlobalFree(r->info_mem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hResData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* AccessResource [KERNEL.64]
|
||||||
|
*/
|
||||||
|
int AccessResource(HANDLE instance, HANDLE hResInfo)
|
||||||
|
{
|
||||||
|
int resfile;
|
||||||
|
#ifdef DEBUG_RESOURCE
|
||||||
|
printf("AccessResource(%04X, %04X);\n", instance, hResInfo);
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
resfile = OpenResourceFile(instance);
|
||||||
|
return resfile;
|
||||||
|
*/
|
||||||
|
return - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* RSC_LoadResource
|
* RSC_LoadResource
|
||||||
|
@ -365,9 +744,10 @@ RSC_LoadResource(int instance, char *rsc_name, int type, int *image_size_ret)
|
||||||
{
|
{
|
||||||
size_shift = FindResourceByName(&nameinfo, type, rsc_name);
|
size_shift = FindResourceByName(&nameinfo, type, rsc_name);
|
||||||
}
|
}
|
||||||
if (size_shift == -1)
|
if (size_shift == -1) {
|
||||||
|
printf("RSC_LoadResource / Resource '%X' not Found !\n", rsc_name);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Read resource.
|
* Read resource.
|
||||||
*/
|
*/
|
||||||
|
@ -406,15 +786,15 @@ LoadString(HANDLE instance, WORD resource_id, LPSTR buffer, int buflen)
|
||||||
instance, resource_id, buffer, buflen);
|
instance, resource_id, buffer, buflen);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
hmem = RSC_LoadResource(instance, (char *) (resource_id >> 4),
|
hmem = RSC_LoadResource(instance, (char *) ((resource_id >> 4) + 1),
|
||||||
NE_RSCTYPE_STRING, &rsc_size);
|
NE_RSCTYPE_STRING, &rsc_size);
|
||||||
if (hmem == 0)
|
if (hmem == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
p = GlobalLock(hmem);
|
p = GlobalLock(hmem);
|
||||||
string_num = resource_id & 0x000f;
|
string_num = resource_id & 0x000f;
|
||||||
for (i = 0; i < resource_id; i++)
|
for (i = 0; i < string_num; i++)
|
||||||
p += *p;
|
p += *p + 1;
|
||||||
|
|
||||||
i = MIN(buflen - 1, *p);
|
i = MIN(buflen - 1, *p);
|
||||||
memcpy(buffer, p + 1, i);
|
memcpy(buffer, p + 1, i);
|
||||||
|
@ -445,7 +825,6 @@ LoadBitmap(HANDLE instance, LPSTR bmp_name)
|
||||||
{
|
{
|
||||||
HBITMAP hbitmap;
|
HBITMAP hbitmap;
|
||||||
HANDLE rsc_mem;
|
HANDLE rsc_mem;
|
||||||
GDIOBJHDR * ptr;
|
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
long *lp;
|
long *lp;
|
||||||
int image_size;
|
int image_size;
|
||||||
|
@ -454,11 +833,20 @@ LoadBitmap(HANDLE instance, LPSTR bmp_name)
|
||||||
printf("LoadBitmap: instance = %04x, name = %08x\n",
|
printf("LoadBitmap: instance = %04x, name = %08x\n",
|
||||||
instance, bmp_name);
|
instance, bmp_name);
|
||||||
#endif
|
#endif
|
||||||
|
printf("LoadBitmap: instance = %04x, name = %08x\n",
|
||||||
|
instance, bmp_name);
|
||||||
|
|
||||||
if (!(hdc = GetDC( 0 ))) return 0;
|
if (instance == (HANDLE)NULL) instance = hSysRes;
|
||||||
|
if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
|
||||||
|
|
||||||
|
printf("before RSC_Load\n");
|
||||||
rsc_mem = RSC_LoadResource(instance, bmp_name, NE_RSCTYPE_BITMAP,
|
rsc_mem = RSC_LoadResource(instance, bmp_name, NE_RSCTYPE_BITMAP,
|
||||||
&image_size);
|
&image_size);
|
||||||
|
if (rsc_mem == (HANDLE)NULL) {
|
||||||
|
printf("LoadBitmap / BitMap %04X not Found !\n", bmp_name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf("before GlobalLock\n");
|
||||||
lp = (long *) GlobalLock(rsc_mem);
|
lp = (long *) GlobalLock(rsc_mem);
|
||||||
if (lp == NULL)
|
if (lp == NULL)
|
||||||
{
|
{
|
||||||
|
@ -470,7 +858,7 @@ LoadBitmap(HANDLE instance, LPSTR bmp_name)
|
||||||
else if (*lp == sizeof(BITMAPINFOHEADER))
|
else if (*lp == sizeof(BITMAPINFOHEADER))
|
||||||
hbitmap = ConvertInfoBitmap( hdc, (BITMAPINFO *) lp );
|
hbitmap = ConvertInfoBitmap( hdc, (BITMAPINFO *) lp );
|
||||||
else hbitmap = 0;
|
else hbitmap = 0;
|
||||||
|
printf("LoadBitmap %04X\n", hbitmap);
|
||||||
GlobalFree(rsc_mem);
|
GlobalFree(rsc_mem);
|
||||||
ReleaseDC( 0, hdc );
|
ReleaseDC( 0, hdc );
|
||||||
return hbitmap;
|
return hbitmap;
|
||||||
|
|
|
@ -38,52 +38,260 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
#define UTEXTSEL 0x1f
|
#define UTEXTSEL 0x1f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MAX_SELECTORS 512
|
|
||||||
|
|
||||||
static struct segment_descriptor_s * EnvironmentSelector = NULL;
|
static struct segment_descriptor_s * EnvironmentSelector = NULL;
|
||||||
static struct segment_descriptor_s * PSP_Selector = NULL;
|
static struct segment_descriptor_s * PSP_Selector = NULL;
|
||||||
struct segment_descriptor_s * MakeProcThunks = NULL;
|
struct segment_descriptor_s * MakeProcThunks = NULL;
|
||||||
unsigned short PSPSelector;
|
unsigned short PSPSelector;
|
||||||
unsigned char ran_out = 0;
|
unsigned char ran_out = 0;
|
||||||
unsigned short SelectorOwners[MAX_SELECTORS];
|
unsigned short SelectorOwners[MAX_SELECTORS];
|
||||||
|
unsigned short SelectorMap[MAX_SELECTORS];
|
||||||
|
unsigned short SelectorLimits[MAX_SELECTORS];
|
||||||
|
unsigned char SelectorTypes[MAX_SELECTORS];
|
||||||
|
int LastUsedSelector = FIRST_SELECTOR - 1;
|
||||||
|
|
||||||
|
#ifdef DEV_ZERO
|
||||||
|
static FILE *zfile = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
static int next_unused_selector = FIRST_SELECTOR;
|
|
||||||
extern void KERNEL_Ordinal_102();
|
extern void KERNEL_Ordinal_102();
|
||||||
extern void UNIXLIB_Ordinal_0();
|
extern void UNIXLIB_Ordinal_0();
|
||||||
|
|
||||||
extern char **Argv;
|
extern char **Argv;
|
||||||
extern int Argc;
|
extern int Argc;
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* GetNextSegment
|
* FindUnusedSelector
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
FindUnusedSelector(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = LastUsedSelector + 1; i != LastUsedSelector; i++)
|
||||||
|
{
|
||||||
|
if (i >= MAX_SELECTORS)
|
||||||
|
i = FIRST_SELECTOR;
|
||||||
|
|
||||||
|
if (!SelectorMap[i])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == LastUsedSelector)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
LastUsedSelector = i;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* AllocSelector
|
||||||
|
*
|
||||||
|
* This is very bad!!! This function is implemented for Windows
|
||||||
|
* compatibility only. Do not call this from the emulation library.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
AllocSelector(unsigned int old_selector)
|
||||||
|
{
|
||||||
|
int i_new, i_old;
|
||||||
|
long base;
|
||||||
|
|
||||||
|
i_new = FindUnusedSelector();
|
||||||
|
if (old_selector)
|
||||||
|
{
|
||||||
|
i_old = (old_selector >> 3);
|
||||||
|
SelectorMap[i_new] = i_old;
|
||||||
|
base = SAFEMAKEPTR(old_selector, 0);
|
||||||
|
if (set_ldt_entry(i_new, base,
|
||||||
|
SelectorLimits[i_old], 0,
|
||||||
|
SelectorTypes[i_old], 0, 0) < 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectorLimits[i_new] = SelectorLimits[i_old];
|
||||||
|
SelectorTypes[i_new] = SelectorTypes[i_old];
|
||||||
|
SelectorMap[i_new] = SelectorMap[i_old];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SelectorMap[i_new] = i_new;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i_new;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* PrestoChangoSelector
|
||||||
|
*
|
||||||
|
* This is very bad!!! This function is implemented for Windows
|
||||||
|
* compatibility only. Do not call this from the emulation library.
|
||||||
|
*/
|
||||||
|
unsigned int PrestoChangoSelector(unsigned src_selector, unsigned dst_selector)
|
||||||
|
{
|
||||||
|
long dst_base, src_base;
|
||||||
|
char *p;
|
||||||
|
int src_idx, dst_idx;
|
||||||
|
int alias_count;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
src_idx = (SelectorMap[src_selector >> 3]);
|
||||||
|
dst_idx = dst_selector >> 3;
|
||||||
|
src_base = (src_idx << 19) | 0x70000;
|
||||||
|
dst_base = (dst_idx << 19) | 0x70000;
|
||||||
|
|
||||||
|
alias_count = 0;
|
||||||
|
for (i = FIRST_SELECTOR; i < MAX_SELECTORS; i++)
|
||||||
|
if (SelectorMap[i] == src_idx)
|
||||||
|
alias_count++;
|
||||||
|
|
||||||
|
if (SelectorTypes[src_idx] == MODIFY_LDT_CONTENTS_DATA
|
||||||
|
|| alias_count > 1 || src_idx == dst_idx)
|
||||||
|
{
|
||||||
|
if (SelectorTypes[src_idx] == MODIFY_LDT_CONTENTS_DATA)
|
||||||
|
SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_CODE;
|
||||||
|
else
|
||||||
|
SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_DATA;
|
||||||
|
|
||||||
|
SelectorMap[dst_idx] = SelectorMap[src_idx];
|
||||||
|
SelectorLimits[dst_idx] = SelectorLimits[src_idx];
|
||||||
|
if (set_ldt_entry(dst_idx, src_base,
|
||||||
|
SelectorLimits[dst_idx], 0,
|
||||||
|
SelectorTypes[dst_idx], 0, 0) < 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We're changing an unaliased code segment into a data
|
||||||
|
* segment. The SAFEST (but ugliest) way to deal with
|
||||||
|
* this is to map the new segment and copy all the contents.
|
||||||
|
*/
|
||||||
|
SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_DATA;
|
||||||
|
SelectorMap[dst_idx] = SelectorMap[src_idx];
|
||||||
|
SelectorLimits[dst_idx] = SelectorLimits[src_idx];
|
||||||
|
#ifdef DEV_ZERO
|
||||||
|
if (zfile == NULL)
|
||||||
|
zfile = fopen("/dev/zero","r");
|
||||||
|
p = (void *) mmap((char *) dst_base,
|
||||||
|
((SelectorLimits[dst_idx] + PAGE_SIZE)
|
||||||
|
& ~(PAGE_SIZE - 1)),
|
||||||
|
PROT_EXEC | PROT_READ | PROT_WRITE,
|
||||||
|
MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
|
||||||
|
#else
|
||||||
|
p = (void *) mmap((char *) dst_base,
|
||||||
|
((SelectorLimits[dst_idx] + PAGE_SIZE)
|
||||||
|
& ~(PAGE_SIZE - 1)),
|
||||||
|
PROT_EXEC | PROT_READ | PROT_WRITE,
|
||||||
|
MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||||
|
#endif
|
||||||
|
if (p == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
memcpy((void *) dst_base, (void *) src_base,
|
||||||
|
SelectorLimits[dst_idx] + 1);
|
||||||
|
if (set_ldt_entry(src_idx, dst_base,
|
||||||
|
SelectorLimits[dst_idx], 0,
|
||||||
|
SelectorTypes[dst_idx], 0, 0) < 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (set_ldt_entry(dst_idx, dst_base,
|
||||||
|
SelectorLimits[dst_idx], 0,
|
||||||
|
SelectorTypes[dst_idx], 0, 0) < 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (dst_idx << 3) | 0x0007;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* AllocCStoDSAlias
|
||||||
|
*/
|
||||||
|
AllocDStoCSAlias(unsigned int ds_selector)
|
||||||
|
{
|
||||||
|
unsigned int cs_selector;
|
||||||
|
|
||||||
|
if (ds_selector == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cs_selector = AllocSelector(0);
|
||||||
|
return PrestoChangoSelector(ds_selector, cs_selector);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* FreeSelector
|
||||||
|
*/
|
||||||
|
unsigned int FreeSelector(unsigned int sel)
|
||||||
|
{
|
||||||
|
int sel_idx;
|
||||||
|
int alias_count;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
sel_idx = SelectorMap[sel >> 3];
|
||||||
|
|
||||||
|
if (sel_idx != (sel >> 3))
|
||||||
|
{
|
||||||
|
SelectorMap[sel >> 3] = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
alias_count = 0;
|
||||||
|
for (i = FIRST_SELECTOR; i < MAX_SELECTORS; i++)
|
||||||
|
if (SelectorMap[i] == sel_idx)
|
||||||
|
alias_count++;
|
||||||
|
|
||||||
|
if (alias_count == 1)
|
||||||
|
{
|
||||||
|
munmap((char *) (sel << 16),
|
||||||
|
((SelectorLimits[sel_idx] + PAGE_SIZE) & ~(PAGE_SIZE - 1)));
|
||||||
|
SelectorMap[sel >> 3] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* CreateNewSegment
|
||||||
*/
|
*/
|
||||||
struct segment_descriptor_s *
|
struct segment_descriptor_s *
|
||||||
GetNextSegment(unsigned int flags, unsigned int limit)
|
CreateNewSegment(int code_flag, int read_only, int length)
|
||||||
{
|
{
|
||||||
struct segment_descriptor_s *selectors, *s;
|
struct segment_descriptor_s *s;
|
||||||
int sel_idx;
|
int contents;
|
||||||
#ifdef DEV_ZERO
|
int i;
|
||||||
FILE *zfile;
|
|
||||||
#endif
|
i = FindUnusedSelector();
|
||||||
|
|
||||||
sel_idx = next_unused_selector++;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fill in selector info.
|
* Fill in selector info.
|
||||||
*/
|
*/
|
||||||
s = malloc(sizeof(*s));
|
s = malloc(sizeof(*s));
|
||||||
s->flags = NE_SEGFLAGS_DATA;
|
if (code_flag)
|
||||||
s->selector = (sel_idx << 3) | 0x0007;
|
{
|
||||||
s->length = limit;
|
contents = MODIFY_LDT_CONTENTS_CODE;
|
||||||
|
s->flags = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
contents = MODIFY_LDT_CONTENTS_DATA;
|
||||||
|
s->flags = NE_SEGFLAGS_DATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
s->selector = (i << 3) | 0x0007;
|
||||||
|
s->length = length;
|
||||||
#ifdef DEV_ZERO
|
#ifdef DEV_ZERO
|
||||||
zfile = fopen("/dev/zero","r");
|
if (zfile == NULL)
|
||||||
|
zfile = fopen("/dev/zero","r");
|
||||||
s->base_addr = (void *) mmap((char *) (s->selector << 16),
|
s->base_addr = (void *) mmap((char *) (s->selector << 16),
|
||||||
((s->length + PAGE_SIZE - 1) &
|
((s->length + PAGE_SIZE - 1) &
|
||||||
~(PAGE_SIZE - 1)),
|
~(PAGE_SIZE - 1)),
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
PROT_EXEC | PROT_READ | PROT_WRITE,
|
||||||
MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
|
MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
|
||||||
|
|
||||||
fclose(zfile);
|
|
||||||
#else
|
#else
|
||||||
s->base_addr = (void *) mmap((char *) (s->selector << 16),
|
s->base_addr = (void *) mmap((char *) (s->selector << 16),
|
||||||
((s->length + PAGE_SIZE - 1) &
|
((s->length + PAGE_SIZE - 1) &
|
||||||
|
@ -93,18 +301,30 @@ GetNextSegment(unsigned int flags, unsigned int limit)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr,
|
if (set_ldt_entry(i, (unsigned long) s->base_addr,
|
||||||
(s->length - 1) & 0xffff, 0,
|
(s->length - 1) & 0xffff, 0,
|
||||||
MODIFY_LDT_CONTENTS_DATA, 0, 0) < 0)
|
contents, read_only, 0) < 0)
|
||||||
{
|
{
|
||||||
next_unused_selector--;
|
|
||||||
free(s);
|
free(s);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SelectorMap[i] = (unsigned short) i;
|
||||||
|
SelectorLimits[i] = s->length - 1;
|
||||||
|
SelectorTypes[i] = contents;
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* GetNextSegment
|
||||||
|
*/
|
||||||
|
struct segment_descriptor_s *
|
||||||
|
GetNextSegment(unsigned int flags, unsigned int limit)
|
||||||
|
{
|
||||||
|
return CreateNewSegment(0, 0, limit);
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* GetEntryPointFromOrdinal
|
* GetEntryPointFromOrdinal
|
||||||
*/
|
*/
|
||||||
|
@ -275,37 +495,14 @@ GetDOSEnvironment()
|
||||||
* CreateEnvironment
|
* CreateEnvironment
|
||||||
*/
|
*/
|
||||||
static struct segment_descriptor_s *
|
static struct segment_descriptor_s *
|
||||||
#ifdef DEV_ZERO
|
|
||||||
CreateEnvironment(FILE *zfile)
|
|
||||||
#else
|
|
||||||
CreateEnvironment(void)
|
CreateEnvironment(void)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
int sel_idx;
|
|
||||||
struct segment_descriptor_s * s;
|
struct segment_descriptor_s * s;
|
||||||
|
|
||||||
s = (struct segment_descriptor_s *)
|
s = CreateNewSegment(0, 0, PAGE_SIZE);
|
||||||
malloc(sizeof(struct segment_descriptor_s));
|
if (s == NULL)
|
||||||
|
return NULL;
|
||||||
sel_idx = next_unused_selector++;
|
|
||||||
/*
|
|
||||||
* Create memory to hold environment.
|
|
||||||
*/
|
|
||||||
s->flags = NE_SEGFLAGS_DATA;
|
|
||||||
s->selector = (sel_idx << 3) | 0x0007;
|
|
||||||
s->length = PAGE_SIZE;
|
|
||||||
#ifdef DEV_ZERO
|
|
||||||
s->base_addr = (void *) mmap((char *) (s->selector << 16),
|
|
||||||
PAGE_SIZE,
|
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
|
||||||
MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
|
|
||||||
#else
|
|
||||||
s->base_addr = (void *) mmap((char *) (s->selector << 16),
|
|
||||||
PAGE_SIZE,
|
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
|
||||||
MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fill environment with meaningless babble.
|
* Fill environment with meaningless babble.
|
||||||
|
@ -318,63 +515,6 @@ CreateEnvironment(void)
|
||||||
*p++ = 0;
|
*p++ = 0;
|
||||||
strcpy(p, "C:\\TEST.EXE");
|
strcpy(p, "C:\\TEST.EXE");
|
||||||
|
|
||||||
/*
|
|
||||||
* Create entry in LDT for this segment.
|
|
||||||
*/
|
|
||||||
if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr,
|
|
||||||
(s->length - 1) & 0xffff, 0,
|
|
||||||
MODIFY_LDT_CONTENTS_DATA, 0, 0) < 0)
|
|
||||||
{
|
|
||||||
myerror("Could not create LDT entry for environment");
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* CreateThunks
|
|
||||||
*/
|
|
||||||
static struct segment_descriptor_s *
|
|
||||||
#ifdef DEV_ZERO
|
|
||||||
CreateThunks(FILE *zfile)
|
|
||||||
#else
|
|
||||||
CreateThunks(void)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int sel_idx;
|
|
||||||
struct segment_descriptor_s * s;
|
|
||||||
|
|
||||||
s = (struct segment_descriptor_s *)
|
|
||||||
malloc(sizeof(struct segment_descriptor_s));
|
|
||||||
|
|
||||||
sel_idx = next_unused_selector++;
|
|
||||||
/*
|
|
||||||
* Create memory to hold environment.
|
|
||||||
*/
|
|
||||||
s->flags = 0;
|
|
||||||
s->selector = (sel_idx << 3) | 0x0007;
|
|
||||||
s->length = 0x10000;
|
|
||||||
#ifdef DEV_ZERO
|
|
||||||
s->base_addr = (void *) mmap((char *) (s->selector << 16),
|
|
||||||
s->length,
|
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
|
||||||
MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
|
|
||||||
#else
|
|
||||||
s->base_addr = (void *) mmap((char *) (s->selector << 16),
|
|
||||||
s->length,
|
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
|
||||||
MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create entry in LDT for this segment.
|
|
||||||
*/
|
|
||||||
if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr,
|
|
||||||
(s->length - 1) & 0xffff, 0,
|
|
||||||
MODIFY_LDT_CONTENTS_CODE, 0, 0) < 0)
|
|
||||||
{
|
|
||||||
myerror("Could not create LDT entry for thunks");
|
|
||||||
}
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,40 +522,15 @@ CreateThunks(void)
|
||||||
* CreatePSP
|
* CreatePSP
|
||||||
*/
|
*/
|
||||||
static struct segment_descriptor_s *
|
static struct segment_descriptor_s *
|
||||||
#ifdef DEV_ZERO
|
|
||||||
CreatePSP(FILE *zfile)
|
|
||||||
#else
|
|
||||||
CreatePSP(void)
|
CreatePSP(void)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct dos_psp_s *psp;
|
struct dos_psp_s *psp;
|
||||||
unsigned short *usp;
|
unsigned short *usp;
|
||||||
int sel_idx;
|
|
||||||
struct segment_descriptor_s * s;
|
struct segment_descriptor_s * s;
|
||||||
char *p1, *p2;
|
char *p1, *p2;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
s = (struct segment_descriptor_s *)
|
s = CreateNewSegment(0, 0, PAGE_SIZE);
|
||||||
malloc(sizeof(struct segment_descriptor_s));
|
|
||||||
|
|
||||||
sel_idx = next_unused_selector++;
|
|
||||||
/*
|
|
||||||
* Create memory to hold PSP.
|
|
||||||
*/
|
|
||||||
s->flags = NE_SEGFLAGS_DATA;
|
|
||||||
s->selector = (sel_idx << 3) | 0x0007;
|
|
||||||
s->length = PAGE_SIZE;
|
|
||||||
#ifdef DEV_ZERO
|
|
||||||
s->base_addr = (void *) mmap((char *) (s->selector << 16),
|
|
||||||
PAGE_SIZE,
|
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
|
||||||
MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
|
|
||||||
#else
|
|
||||||
s->base_addr = (void *) mmap((char *) (s->selector << 16),
|
|
||||||
PAGE_SIZE,
|
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
|
||||||
MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fill PSP
|
* Fill PSP
|
||||||
|
@ -451,15 +566,6 @@ CreatePSP(void)
|
||||||
*p1 = '\0';
|
*p1 = '\0';
|
||||||
psp->pspCommandTailCount = strlen(psp->pspCommandTail);
|
psp->pspCommandTailCount = strlen(psp->pspCommandTail);
|
||||||
|
|
||||||
/*
|
|
||||||
* Create entry in LDT for this segment.
|
|
||||||
*/
|
|
||||||
if (set_ldt_entry(sel_idx, (unsigned long) s->base_addr,
|
|
||||||
(s->length - 1) & 0xffff, 0,
|
|
||||||
MODIFY_LDT_CONTENTS_DATA, 0, 0) < 0)
|
|
||||||
{
|
|
||||||
myerror("Could not create LDT entry for PSP");
|
|
||||||
}
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -472,15 +578,12 @@ CreateSelectors(struct w_files * wpnt)
|
||||||
int fd = wpnt->fd;
|
int fd = wpnt->fd;
|
||||||
struct ne_segment_table_entry_s *seg_table = wpnt->seg_table;
|
struct ne_segment_table_entry_s *seg_table = wpnt->seg_table;
|
||||||
struct ne_header_s *ne_header = wpnt->ne_header;
|
struct ne_header_s *ne_header = wpnt->ne_header;
|
||||||
struct segment_descriptor_s *selectors, *s;
|
struct segment_descriptor_s *selectors, *s, *stmp;
|
||||||
unsigned short *sp;
|
unsigned short auto_data_sel;
|
||||||
int contents, read_only;
|
int contents, read_only;
|
||||||
int SelectorTableLength;
|
int SelectorTableLength;
|
||||||
int i;
|
int i;
|
||||||
int status;
|
int status;
|
||||||
#ifdef DEV_ZERO
|
|
||||||
FILE * zfile;
|
|
||||||
#endif
|
|
||||||
int old_length, file_image_length;
|
int old_length, file_image_length;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -495,24 +598,12 @@ CreateSelectors(struct w_files * wpnt)
|
||||||
* Step through the segment table in the exe header.
|
* Step through the segment table in the exe header.
|
||||||
*/
|
*/
|
||||||
s = selectors;
|
s = selectors;
|
||||||
#ifdef DEV_ZERO
|
|
||||||
zfile = fopen("/dev/zero","r");
|
|
||||||
#endif
|
|
||||||
for (i = 0; i < ne_header->n_segment_tab; i++, s++)
|
for (i = 0; i < ne_header->n_segment_tab; i++, s++)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_SEGMENT
|
|
||||||
printf(" %2d: OFFSET %04.4x, LENGTH %04.4x, ",
|
|
||||||
i + 1, seg_table[i].seg_data_offset,
|
|
||||||
seg_table[i].seg_data_length);
|
|
||||||
printf("FLAGS %04.4x, MIN ALLOC %04.4x\n",
|
|
||||||
seg_table[i].seg_flags, seg_table[i].min_alloc);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Store the flags in our table.
|
* Store the flags in our table.
|
||||||
*/
|
*/
|
||||||
s->flags = seg_table[i].seg_flags;
|
s->flags = seg_table[i].seg_flags;
|
||||||
s->selector = ((next_unused_selector + i) << 3) | 0x0007;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Is there an image for this segment in the file?
|
* Is there an image for this segment in the file?
|
||||||
|
@ -570,19 +661,12 @@ CreateSelectors(struct w_files * wpnt)
|
||||||
if (s->flags & NE_SEGFLAGS_EXECUTEONLY)
|
if (s->flags & NE_SEGFLAGS_EXECUTEONLY)
|
||||||
read_only = 1;
|
read_only = 1;
|
||||||
}
|
}
|
||||||
#ifdef DEV_ZERO
|
|
||||||
s->base_addr =
|
stmp = CreateNewSegment(!(s->flags & NE_SEGFLAGS_DATA), read_only,
|
||||||
(void *) mmap((char *) (s->selector << 16),
|
s->length);
|
||||||
(s->length + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1),
|
s->base_addr = stmp->base_addr;
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
s->selector = stmp->selector;
|
||||||
MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
|
|
||||||
#else
|
|
||||||
s->base_addr =
|
|
||||||
(void *) mmap((char *) (s->selector << 16),
|
|
||||||
(s->length + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1),
|
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
|
||||||
MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
|
|
||||||
#endif
|
|
||||||
if (seg_table[i].seg_data_offset != 0)
|
if (seg_table[i].seg_data_offset != 0)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -593,56 +677,28 @@ CreateSelectors(struct w_files * wpnt)
|
||||||
if(read(fd, s->base_addr, file_image_length) != file_image_length)
|
if(read(fd, s->base_addr, file_image_length) != file_image_length)
|
||||||
myerror("Unable to read segment from file");
|
myerror("Unable to read segment from file");
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Create entry in LDT for this segment.
|
|
||||||
*/
|
|
||||||
if (set_ldt_entry(s->selector >> 3, (unsigned long) s->base_addr,
|
|
||||||
(s->length - 1) & 0xffff, 0,
|
|
||||||
contents, read_only, 0) < 0)
|
|
||||||
{
|
|
||||||
free(selectors);
|
|
||||||
fprintf(stderr,"Ran out of ldt entries.\n");
|
|
||||||
ran_out++;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG_SEGMENT
|
|
||||||
printf(" SELECTOR %04.4x, %s\n",
|
|
||||||
s->selector,
|
|
||||||
contents == MODIFY_LDT_CONTENTS_CODE ? "CODE" : "DATA");
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* If this is the automatic data segment, then we must initialize
|
* If this is the automatic data segment, then we must initialize
|
||||||
* the local heap.
|
* the local heap.
|
||||||
*/
|
*/
|
||||||
if (i + 1 == ne_header->auto_data_seg)
|
if (i + 1 == ne_header->auto_data_seg)
|
||||||
{
|
{
|
||||||
|
auto_data_sel = s->selector;
|
||||||
HEAP_LocalInit(s->base_addr + old_length,
|
HEAP_LocalInit(s->base_addr + old_length,
|
||||||
ne_header->local_heap_length);
|
ne_header->local_heap_length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sp = &SelectorOwners[next_unused_selector];
|
s = selectors;
|
||||||
for (i = 0; i < ne_header->n_segment_tab; i++)
|
for (i = 0; i < ne_header->n_segment_tab; i++, s++)
|
||||||
*sp++ = (((next_unused_selector + ne_header->auto_data_seg - 1) << 3)
|
SelectorOwners[s->selector >> 3] = auto_data_sel;
|
||||||
| 0x0007);
|
|
||||||
|
|
||||||
next_unused_selector += ne_header->n_segment_tab;
|
|
||||||
|
|
||||||
if(!EnvironmentSelector) {
|
if(!EnvironmentSelector) {
|
||||||
#ifdef DEV_ZERO
|
|
||||||
EnvironmentSelector = CreateEnvironment(zfile);
|
|
||||||
PSP_Selector = CreatePSP(zfile);
|
|
||||||
MakeProcThunks = CreateThunks(zfile);
|
|
||||||
#else
|
|
||||||
EnvironmentSelector = CreateEnvironment();
|
EnvironmentSelector = CreateEnvironment();
|
||||||
PSP_Selector = CreatePSP();
|
PSP_Selector = CreatePSP();
|
||||||
MakeProcThunks = CreateThunks();
|
MakeProcThunks = CreateNewSegment(1, 0, 0x10000);
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef DEV_ZERO
|
|
||||||
fclose(zfile);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return selectors;
|
return selectors;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,8 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#endif
|
#endif
|
||||||
#include <wine.h>
|
#include "wine.h"
|
||||||
|
#include "segmem.h"
|
||||||
|
|
||||||
char * cstack[4096];
|
char * cstack[4096];
|
||||||
struct sigaction segv_act;
|
struct sigaction segv_act;
|
||||||
|
@ -64,7 +65,7 @@ static void win_fault(int signal, int code, struct sigcontext *scp){
|
||||||
|
|
||||||
/* Now take a look at the actual instruction where the program
|
/* Now take a look at the actual instruction where the program
|
||||||
bombed */
|
bombed */
|
||||||
instr = (char *) ((scp->sc_cs << 16) | (scp->sc_eip & 0xffff));
|
instr = (char *) SAFEMAKEPTR(scp->sc_cs, scp->sc_eip);
|
||||||
|
|
||||||
if(*instr != 0xcd) {
|
if(*instr != 0xcd) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
|
|
@ -38,11 +38,13 @@ int Argc;
|
||||||
struct mz_header_s *CurrentMZHeader;
|
struct mz_header_s *CurrentMZHeader;
|
||||||
struct ne_header_s *CurrentNEHeader;
|
struct ne_header_s *CurrentNEHeader;
|
||||||
int CurrentNEFile;
|
int CurrentNEFile;
|
||||||
|
HINSTANCE hSysRes;
|
||||||
|
|
||||||
static char *dllExtensions[] = { "dll", "exe", NULL };
|
static char *dllExtensions[] = { "dll", "exe", NULL };
|
||||||
static char *exeExtensions[] = { "exe", NULL };
|
static char *exeExtensions[] = { "exe", NULL };
|
||||||
static char *WinePath = NULL;
|
static char *WinePath = NULL;
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* DebugPrintString
|
* DebugPrintString
|
||||||
*/
|
*/
|
||||||
|
@ -99,7 +101,7 @@ GetFileInfo(unsigned short instance)
|
||||||
* LoadImage
|
* LoadImage
|
||||||
* Load one NE format executable into memory
|
* Load one NE format executable into memory
|
||||||
*/
|
*/
|
||||||
LoadImage(char * filename, char * modulename)
|
HINSTANCE LoadImage(char * filename, char * modulename)
|
||||||
{
|
{
|
||||||
unsigned int read_size;
|
unsigned int read_size;
|
||||||
int i;
|
int i;
|
||||||
|
@ -236,6 +238,7 @@ LoadImage(char * filename, char * modulename)
|
||||||
|
|
||||||
fprintf(stderr,"Unable to load:%s\n", buff);
|
fprintf(stderr,"Unable to load:%s\n", buff);
|
||||||
}
|
}
|
||||||
|
return(wpnt->hinstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -278,6 +281,7 @@ _WinMain(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadImage(exe_path, NULL);
|
LoadImage(exe_path, NULL);
|
||||||
|
hSysRes = LoadImage("sysres.dll", NULL);
|
||||||
|
|
||||||
if(ran_out) exit(1);
|
if(ran_out) exit(1);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
|
@ -555,7 +555,7 @@ GlobalReAlloc(unsigned int block, unsigned int new_size, unsigned int flags)
|
||||||
* reallocate the block. If this fails, call GlobalAlloc() to get
|
* reallocate the block. If this fails, call GlobalAlloc() to get
|
||||||
* a new block.
|
* a new block.
|
||||||
*/
|
*/
|
||||||
if (g->sequence = 0)
|
if (g->sequence == 0)
|
||||||
{
|
{
|
||||||
MDESC **free_list;
|
MDESC **free_list;
|
||||||
void *p;
|
void *p;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
|
CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
|
||||||
|
|
||||||
OBJS=dos.o kernel.o user.o xt.o rect.o file.o sound.o emulate.o \
|
OBJS=dos.o kernel.o user.o xt.o rect.o file.o sound.o emulate.o \
|
||||||
keyboard.o profile.o lstr.o exec.o
|
keyboard.o profile.o lstr.o exec.o message.o
|
||||||
|
|
||||||
default: misc.o
|
default: misc.o
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ WORD WinExec(LPSTR lpCmdLine, WORD nCmdShow)
|
||||||
}
|
}
|
||||||
switch(fork()) {
|
switch(fork()) {
|
||||||
case -1:
|
case -1:
|
||||||
printf("Can'k 'fork' process !\n");
|
printf("Can't 'fork' process !\n");
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
printf("New process started !\n");
|
printf("New process started !\n");
|
||||||
|
@ -68,7 +68,7 @@ BOOL WinHelp(HWND hWnd, LPSTR lpHelpFile, WORD wCommand, DWORD dwData)
|
||||||
printf("WinHelp(%s, %u, %lu)\n", lpHelpFile, wCommand, dwData);
|
printf("WinHelp(%s, %u, %lu)\n", lpHelpFile, wCommand, dwData);
|
||||||
switch(fork()) {
|
switch(fork()) {
|
||||||
case -1:
|
case -1:
|
||||||
printf("Can'k 'fork' process !\n");
|
printf("Can't 'fork' process !\n");
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
printf("New process started !\n");
|
printf("New process started !\n");
|
||||||
|
|
|
@ -0,0 +1,264 @@
|
||||||
|
/*
|
||||||
|
* 'Wine' MessageBox function handling
|
||||||
|
*
|
||||||
|
* Copyright 1993 Martin Ayotte
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char Copyright[] = "Copyright Martin Ayotte, 1993";
|
||||||
|
|
||||||
|
#include "windows.h"
|
||||||
|
#include "heap.h"
|
||||||
|
#include "win.h"
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct tagMSGBOX {
|
||||||
|
LPSTR Title;
|
||||||
|
LPSTR Str;
|
||||||
|
WORD wType;
|
||||||
|
WORD wRetVal;
|
||||||
|
BOOL ActiveFlg;
|
||||||
|
HWND hWndYes;
|
||||||
|
HWND hWndNo;
|
||||||
|
HWND hWndCancel;
|
||||||
|
HICON hIcon;
|
||||||
|
} MSGBOX;
|
||||||
|
typedef MSGBOX FAR* LPMSGBOX;
|
||||||
|
|
||||||
|
|
||||||
|
LONG SystemMessageBoxProc(HWND hwnd, WORD message, WORD wParam, LONG lParam);
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* MessageBox [USER.1]
|
||||||
|
*/
|
||||||
|
|
||||||
|
int MessageBox( HWND hWnd, LPSTR str, LPSTR title, WORD type )
|
||||||
|
{
|
||||||
|
HWND hDlg;
|
||||||
|
WND *wndPtr;
|
||||||
|
WNDCLASS wndClass;
|
||||||
|
MSG msg;
|
||||||
|
MSGBOX mb;
|
||||||
|
wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
printf( "MessageBox: '%s'\n", str );
|
||||||
|
wndClass.style = CS_HREDRAW | CS_VREDRAW ;
|
||||||
|
wndClass.lpfnWndProc = (WNDPROC)SystemMessageBoxProc;
|
||||||
|
wndClass.cbClsExtra = 0;
|
||||||
|
wndClass.cbWndExtra = 0;
|
||||||
|
wndClass.hInstance = wndPtr->hInstance;
|
||||||
|
wndClass.hIcon = (HICON)NULL;
|
||||||
|
wndClass.hCursor = LoadCursor((HANDLE)NULL, IDC_ARROW);
|
||||||
|
wndClass.hbrBackground = GetStockObject(WHITE_BRUSH);
|
||||||
|
wndClass.lpszMenuName = NULL;
|
||||||
|
wndClass.lpszClassName = "MESSAGEBOX";
|
||||||
|
if (!RegisterClass(&wndClass)) return 0;
|
||||||
|
memset(&mb, 0, sizeof(MSGBOX));
|
||||||
|
mb.Title = title;
|
||||||
|
mb.Str = str;
|
||||||
|
mb.wType = type;
|
||||||
|
mb.ActiveFlg = TRUE;
|
||||||
|
hDlg = CreateWindow("MESSAGEBOX", title,
|
||||||
|
WS_POPUP | WS_DLGFRAME | WS_VISIBLE, 100, 150, 320, 120,
|
||||||
|
(HWND)NULL, (HMENU)NULL, wndPtr->hInstance, (LPSTR)&mb);
|
||||||
|
if (hDlg == 0) return 0;
|
||||||
|
while(TRUE) {
|
||||||
|
if (!mb.ActiveFlg) break;
|
||||||
|
if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break;
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
printf( "after MessageBox !\n");
|
||||||
|
if (!UnregisterClass("MESSAGEBOX", wndPtr->hInstance)) return 0;
|
||||||
|
return(mb.wRetVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LPMSGBOX MsgBoxGetStorageHeader(HWND hwnd)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
LPMSGBOX lpmb;
|
||||||
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
if (wndPtr == 0) {
|
||||||
|
printf("Bad Window handle on MessageBox !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lpmb = *((LPMSGBOX *)&wndPtr->wExtra[1]);
|
||||||
|
return lpmb;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
CREATESTRUCT *createStruct;
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
HDC hDC;
|
||||||
|
RECT rect;
|
||||||
|
LPMSGBOX lpmb;
|
||||||
|
LPMSGBOX lpmbInit;
|
||||||
|
BITMAP bm;
|
||||||
|
HBITMAP hBitMap;
|
||||||
|
HDC hMemDC;
|
||||||
|
HICON hIcon;
|
||||||
|
HINSTANCE hInst2;
|
||||||
|
int x;
|
||||||
|
switch(message) {
|
||||||
|
case WM_CREATE:
|
||||||
|
wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
createStruct = (CREATESTRUCT *)lParam;
|
||||||
|
lpmbInit = (LPMSGBOX)createStruct->lpCreateParams;
|
||||||
|
if (lpmbInit == 0) break;
|
||||||
|
*((LPMSGBOX *)&wndPtr->wExtra[1]) = lpmbInit;
|
||||||
|
lpmb = MsgBoxGetStorageHeader(hWnd);
|
||||||
|
GetClientRect(hWnd, &rect);
|
||||||
|
switch(lpmb->wType & MB_TYPEMASK) {
|
||||||
|
case MB_OK :
|
||||||
|
lpmb->hWndYes = CreateWindow("BUTTON", "&Ok",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 - 70, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
||||||
|
break;
|
||||||
|
case MB_OKCANCEL :
|
||||||
|
lpmb->hWndYes = CreateWindow("BUTTON", "&Ok",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 - 70, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
||||||
|
lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 + 10, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 2, wndPtr->hInstance, 0L);
|
||||||
|
break;
|
||||||
|
case MB_ABORTRETRYIGNORE :
|
||||||
|
lpmb->hWndYes = CreateWindow("BUTTON", "&Retry",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 - 70, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
||||||
|
lpmb->hWndNo = CreateWindow("BUTTON", "&Ignore",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 + 10, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 2, wndPtr->hInstance, 0L);
|
||||||
|
lpmb->hWndCancel = CreateWindow("BUTTON", "&Abort",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 + 80, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 3, wndPtr->hInstance, 0L);
|
||||||
|
break;
|
||||||
|
case MB_YESNO :
|
||||||
|
lpmb->hWndYes = CreateWindow("BUTTON", "&Yes",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 - 70, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
||||||
|
lpmb->hWndNo = CreateWindow("BUTTON", "&No",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 + 10, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 2, wndPtr->hInstance, 0L);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch(lpmb->wType & MB_ICONMASK) {
|
||||||
|
case MB_ICONEXCLAMATION:
|
||||||
|
printf("MsgBox LoadIcon Exclamation !\n");
|
||||||
|
lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION);
|
||||||
|
break;
|
||||||
|
case MB_ICONQUESTION:
|
||||||
|
printf("MsgBox LoadIcon Question !\n");
|
||||||
|
lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_QUESTION);
|
||||||
|
break;
|
||||||
|
case MB_ICONASTERISK:
|
||||||
|
printf("MsgBox LoadIcon Asterisk !\n");
|
||||||
|
lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_ASTERISK);
|
||||||
|
break;
|
||||||
|
case MB_ICONHAND:
|
||||||
|
printf("MsgBox LoadIcon Hand !\n");
|
||||||
|
lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_HAND);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_PAINT:
|
||||||
|
lpmb = MsgBoxGetStorageHeader(hWnd);
|
||||||
|
GetClientRect(hWnd, &rect);
|
||||||
|
hDC = BeginPaint(hWnd, &ps);
|
||||||
|
if (lpmb->hIcon) DrawIcon(hDC, 30, 20, lpmb->hIcon);
|
||||||
|
TextOut(hDC, rect.right / 2, 15,
|
||||||
|
lpmb->Title, strlen(lpmb->Title));
|
||||||
|
TextOut(hDC, rect.right / 2, 30,
|
||||||
|
lpmb->Str, strlen(lpmb->Str));
|
||||||
|
EndPaint(hWnd, &ps);
|
||||||
|
break;
|
||||||
|
case WM_DESTROY:
|
||||||
|
printf("MessageBox WM_DESTROY !\n");
|
||||||
|
ReleaseCapture();
|
||||||
|
lpmb = MsgBoxGetStorageHeader(hWnd);
|
||||||
|
lpmb->ActiveFlg = FALSE;
|
||||||
|
if (lpmb->hIcon) DestroyIcon(lpmb->hIcon);
|
||||||
|
if (lpmb->hWndYes) DestroyWindow(lpmb->hWndYes);
|
||||||
|
if (lpmb->hWndNo) DestroyWindow(lpmb->hWndNo);
|
||||||
|
if (lpmb->hWndCancel) DestroyWindow(lpmb->hWndCancel);
|
||||||
|
break;
|
||||||
|
case WM_COMMAND:
|
||||||
|
lpmb = MsgBoxGetStorageHeader(hWnd);
|
||||||
|
switch(wParam) {
|
||||||
|
case 1:
|
||||||
|
lpmb->wRetVal = IDOK;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
/*
|
||||||
|
for (x = 1; x < 50; x++) {
|
||||||
|
hBitMap = LoadBitmap(wndPtr->hInstance, MAKEINTRESOURCE(x));
|
||||||
|
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
|
||||||
|
hMemDC = CreateCompatibleDC(hDC);
|
||||||
|
SelectObject(hMemDC, hBitMap);
|
||||||
|
printf(" bm.bmWidth=%d bm.bmHeight=%d\n",
|
||||||
|
bm.bmWidth, bm.bmHeight);
|
||||||
|
BitBlt(hDC, x * 20, 30, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
||||||
|
DeleteDC(hMemDC);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
hBitMap = LoadBitmap((HINSTANCE)NULL, "SMILE");
|
||||||
|
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
|
||||||
|
printf("bm.bmWidth=%d bm.bmHeight=%d\n",
|
||||||
|
bm.bmWidth, bm.bmHeight);
|
||||||
|
hMemDC = CreateCompatibleDC(hDC);
|
||||||
|
SelectObject(hMemDC, hBitMap);
|
||||||
|
BitBlt(hDC, 100, 30, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
||||||
|
DeleteDC(hMemDC);
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
lpmb->wRetVal = IDCANCEL;
|
||||||
|
/*
|
||||||
|
SetWindowPos(lpmb->hWndNo, (HWND)NULL, 20, 20, 0, 0,
|
||||||
|
SWP_NOSIZE | SWP_NOZORDER);
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
hInst2 = LoadImage("ev3lite.exe", NULL);
|
||||||
|
hIcon = LoadIcon(hInst2, "EV3LITE");
|
||||||
|
DrawIcon(hDC, 20, 20, hIcon);
|
||||||
|
DestroyIcon(hIcon);
|
||||||
|
hInst2 = LoadImage("sysres.dll", NULL);
|
||||||
|
hIcon = LoadIcon(hInst2, "WINEICON");
|
||||||
|
DrawIcon(hDC, 60, 20, hIcon);
|
||||||
|
DestroyIcon(hIcon);
|
||||||
|
hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION);
|
||||||
|
DrawIcon(hDC, 1000, 20, hIcon);
|
||||||
|
DestroyIcon(hIcon);
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
lpmb->wRetVal = IDIGNORE;
|
||||||
|
return(0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
CloseWindow(hWnd);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return DefWindowProc(hWnd, message, wParam, lParam );
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
11
misc/xt.c
11
misc/xt.c
|
@ -53,11 +53,6 @@ void main(int argc, char **argv)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
int MessageBox( HWND hwnd, LPSTR str, LPSTR title, WORD type )
|
|
||||||
{
|
|
||||||
printf( "MessageBox: '%s'\n", str );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessageBeep( WORD i )
|
void MessageBeep( WORD i )
|
||||||
{
|
{
|
||||||
XBell(XT_display, 100);
|
XBell(XT_display, 100);
|
||||||
|
@ -102,12 +97,6 @@ void AdjustWindowRect( LPRECT rect, DWORD style, BOOL menu )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOL IsIconic( HWND hwnd )
|
|
||||||
{
|
|
||||||
printf( "IsIconic: returning FALSE\n" );
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
HMENU CreateMenu() { return 0; }
|
HMENU CreateMenu() { return 0; }
|
||||||
|
|
||||||
BOOL AppendMenu( HMENU hmenu, WORD flags, WORD id, LPSTR text ) { return TRUE;}
|
BOOL AppendMenu( HMENU hmenu, WORD flags, WORD id, LPSTR text ) { return TRUE;}
|
||||||
|
|
|
@ -19,7 +19,7 @@ extern Screen * XT_screen;
|
||||||
* We try to use a private color map if possible, because Windows programs
|
* We try to use a private color map if possible, because Windows programs
|
||||||
* assume that palette(0) == Black and palette(max-1) == White.
|
* assume that palette(0) == Black and palette(max-1) == White.
|
||||||
*/
|
*/
|
||||||
#define USE_PRIVATE_MAP
|
#undef USE_PRIVATE_MAP
|
||||||
|
|
||||||
Colormap COLOR_WinColormap = 0;
|
Colormap COLOR_WinColormap = 0;
|
||||||
|
|
||||||
|
|
|
@ -6,9 +6,11 @@
|
||||||
|
|
||||||
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
|
#include "icon.h"
|
||||||
|
|
||||||
|
|
||||||
extern XImage * BITMAP_BmpToImage( BITMAP *, void * );
|
extern XImage * BITMAP_BmpToImage( BITMAP *, void * );
|
||||||
|
@ -201,3 +203,45 @@ HBITMAP CreateDIBitmap( HDC hdc, BITMAPINFOHEADER * header, DWORD init,
|
||||||
bits, data, coloruse );
|
bits, data, coloruse );
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DrawIcon (USER.84)
|
||||||
|
*/
|
||||||
|
BOOL DrawIcon(HDC hDC, short x, short y, HICON hIcon)
|
||||||
|
{
|
||||||
|
ICONALLOC *lpico;
|
||||||
|
BITMAP bm;
|
||||||
|
HBITMAP hBitTemp;
|
||||||
|
HDC hMemDC;
|
||||||
|
HDC hMemDC2;
|
||||||
|
#ifdef DEBUG_ICON
|
||||||
|
printf("DrawIcon(%04X, %d, %d, %04X) \n", hDC, x, y, hIcon);
|
||||||
|
#endif
|
||||||
|
if (hIcon == (HICON)NULL) return FALSE;
|
||||||
|
lpico = (ICONALLOC *)GlobalLock(hIcon);
|
||||||
|
GetObject(lpico->hBitmap, sizeof(BITMAP), (LPSTR)&bm);
|
||||||
|
#ifdef DEBUG_ICON
|
||||||
|
printf("DrawIcon / x=%d y=%d\n", x, y);
|
||||||
|
printf("DrawIcon / icon Width=%d\n", (int)lpico->descriptor.Width);
|
||||||
|
printf("DrawIcon / icon Height=%d\n", (int)lpico->descriptor.Height);
|
||||||
|
printf("DrawIcon / icon ColorCount=%d\n", (int)lpico->descriptor.ColorCount);
|
||||||
|
printf("DrawIcon / icon icoDIBSize=%lX\n", (DWORD)lpico->descriptor.icoDIBSize);
|
||||||
|
printf("DrawIcon / icon icoDIBOffset=%lX\n", (DWORD)lpico->descriptor.icoDIBOffset);
|
||||||
|
printf("DrawIcon / bitmap bmWidth=%d bmHeight=%d\n", bm.bmWidth, bm.bmHeight);
|
||||||
|
#endif
|
||||||
|
hMemDC = CreateCompatibleDC(hDC);
|
||||||
|
#ifdef DEBUG_ICON
|
||||||
|
SelectObject(hMemDC, lpico->hBitmap);
|
||||||
|
BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
||||||
|
SelectObject(hMemDC, lpico->hBitMask);
|
||||||
|
BitBlt(hDC, x, y + bm.bmHeight, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
||||||
|
#else
|
||||||
|
SelectObject(hMemDC, lpico->hBitMask);
|
||||||
|
BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCAND);
|
||||||
|
SelectObject(hMemDC, lpico->hBitmap);
|
||||||
|
BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCPAINT);
|
||||||
|
#endif
|
||||||
|
DeleteDC(hMemDC);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
146
test/btnlook.c
146
test/btnlook.c
|
@ -1,146 +0,0 @@
|
||||||
/*------------------------------------------
|
|
||||||
BTNLOOK.C -- Button Look Program
|
|
||||||
------------------------------------------*/
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
long style;
|
|
||||||
char *text;
|
|
||||||
}
|
|
||||||
button[] =
|
|
||||||
{
|
|
||||||
BS_PUSHBUTTON, "PUSHBUTTON",
|
|
||||||
BS_DEFPUSHBUTTON, "DEFPUSHBUTTON",
|
|
||||||
BS_CHECKBOX, "CHECKBOX",
|
|
||||||
BS_AUTOCHECKBOX, "AUTOCHECKBOX",
|
|
||||||
BS_RADIOBUTTON, "RADIOBUTTON",
|
|
||||||
BS_3STATE, "3STATE",
|
|
||||||
BS_AUTO3STATE, "AUTO3STATE",
|
|
||||||
BS_GROUPBOX, "GROUPBOX",
|
|
||||||
BS_USERBUTTON, "USERBUTTON",
|
|
||||||
BS_AUTORADIOBUTTON, "AUTORADIOBUTTON"
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NUM (sizeof button / sizeof button[0])
|
|
||||||
|
|
||||||
long FAR PASCAL _export WndProc(HWND, WORD, WORD, LONG);
|
|
||||||
|
|
||||||
int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
|
|
||||||
LPSTR lpszCmdParam, int nCmdShow)
|
|
||||||
{
|
|
||||||
static char szAppName[] = "BtnLook";
|
|
||||||
HWND hwnd;
|
|
||||||
MSG msg;
|
|
||||||
WNDCLASS wndclass;
|
|
||||||
|
|
||||||
if (!hPrevInstance)
|
|
||||||
{
|
|
||||||
wndclass.style = CS_HREDRAW | CS_VREDRAW;
|
|
||||||
wndclass.lpfnWndProc = WndProc;
|
|
||||||
wndclass.cbClsExtra = 0;
|
|
||||||
wndclass.cbWndExtra = 0;
|
|
||||||
wndclass.hInstance = hInstance;
|
|
||||||
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
|
||||||
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
||||||
wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
|
|
||||||
wndclass.lpszMenuName = NULL;
|
|
||||||
wndclass.lpszClassName = szAppName;
|
|
||||||
|
|
||||||
RegisterClass(&wndclass);
|
|
||||||
}
|
|
||||||
|
|
||||||
hwnd = CreateWindow(szAppName, "Button Look",
|
|
||||||
WS_OVERLAPPEDWINDOW,
|
|
||||||
CW_USEDEFAULT, CW_USEDEFAULT,
|
|
||||||
CW_USEDEFAULT, CW_USEDEFAULT,
|
|
||||||
NULL, NULL, hInstance, NULL);
|
|
||||||
|
|
||||||
ShowWindow(hwnd, nCmdShow);
|
|
||||||
UpdateWindow(hwnd);
|
|
||||||
|
|
||||||
while (GetMessage(&msg, NULL, 0, 0))
|
|
||||||
{
|
|
||||||
TranslateMessage(&msg);
|
|
||||||
DispatchMessage(&msg);
|
|
||||||
}
|
|
||||||
return msg.wParam;
|
|
||||||
}
|
|
||||||
|
|
||||||
long FAR PASCAL _export WndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
|
|
||||||
{
|
|
||||||
static char szPrm[] = "wParam LOWORD(lParam) HIWORD(lParam)",
|
|
||||||
szTop[] = "Control ID Window Handle Notification",
|
|
||||||
szUnd[] = "__________ _____________ ____________",
|
|
||||||
szFormat[] = " %5u %4X %5u",
|
|
||||||
szBuffer[50];
|
|
||||||
static HWND hwndButton[NUM];
|
|
||||||
static RECT rect;
|
|
||||||
static int cxChar, cyChar;
|
|
||||||
HDC hdc;
|
|
||||||
PAINTSTRUCT ps;
|
|
||||||
int i;
|
|
||||||
TEXTMETRIC tm;
|
|
||||||
|
|
||||||
switch (message)
|
|
||||||
{
|
|
||||||
case WM_CREATE:
|
|
||||||
hdc = GetDC(hwnd);
|
|
||||||
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
|
|
||||||
GetTextMetrics(hdc, &tm);
|
|
||||||
cxChar = tm.tmAveCharWidth;
|
|
||||||
cyChar = tm.tmHeight + tm.tmExternalLeading;
|
|
||||||
ReleaseDC(hwnd, hdc);
|
|
||||||
|
|
||||||
for (i = 0; i < NUM; i++)
|
|
||||||
hwndButton[i] = CreateWindow("button", button[i].text,
|
|
||||||
WS_CHILD | WS_VISIBLE | button[i].style,
|
|
||||||
cxChar, cyChar * (1 + 2 * i),
|
|
||||||
20 * cxChar, 7 * cyChar / 4,
|
|
||||||
hwnd, i,
|
|
||||||
((LPCREATESTRUCT) lParam)->hInstance, NULL);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_SIZE:
|
|
||||||
rect.left = 24 * cxChar;
|
|
||||||
rect.top = 3 * cyChar;
|
|
||||||
rect.right = LOWORD(lParam);
|
|
||||||
rect.bottom = HIWORD(lParam);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_PAINT:
|
|
||||||
InvalidateRect(hwnd, &rect, TRUE);
|
|
||||||
|
|
||||||
hdc = BeginPaint(hwnd, &ps);
|
|
||||||
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
|
|
||||||
SetBkMode(hdc, TRANSPARENT);
|
|
||||||
TextOut(hdc, 24 * cxChar, 1 * cyChar, szPrm, sizeof szPrm - 1);
|
|
||||||
TextOut(hdc, 24 * cxChar, 2 * cyChar, szTop, sizeof szTop - 1);
|
|
||||||
TextOut(hdc, 24 * cxChar, 2 * cyChar, szUnd, sizeof szUnd - 1);
|
|
||||||
|
|
||||||
EndPaint(hwnd, &ps);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_COMMAND:
|
|
||||||
/* ScrollWindow(hwnd, 0, -cyChar, &rect, &rect); */
|
|
||||||
hdc = GetDC(hwnd);
|
|
||||||
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
|
|
||||||
|
|
||||||
TextOut(hdc, 24 * cxChar, cyChar * 5, /* (rect.bottom / cyChar - 1), */
|
|
||||||
szBuffer, sprintf(szBuffer, szFormat, wParam,
|
|
||||||
LOWORD(lParam), HIWORD(lParam)));
|
|
||||||
|
|
||||||
ReleaseDC(hwnd, hdc);
|
|
||||||
ValidateRect(hwnd, NULL);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case WM_DESTROY:
|
|
||||||
PostQuitMessage(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return DefWindowProc(hwnd, message, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
BIN
test/btnlook.exe
BIN
test/btnlook.exe
Binary file not shown.
|
@ -1,442 +0,0 @@
|
||||||
/**********************************************************************
|
|
||||||
* Copyright (c) 1991 by TRG ELECTRONIK *
|
|
||||||
* *
|
|
||||||
* widget.C *
|
|
||||||
* widget Inventory Controler PART # 1 *
|
|
||||||
* *
|
|
||||||
**********************************************************************/
|
|
||||||
|
|
||||||
#include <WINDOWS.H>
|
|
||||||
#include "STDIO.h"
|
|
||||||
#include "STDLIB.h"
|
|
||||||
#include "STDARG.h"
|
|
||||||
#include "STRING.H"
|
|
||||||
|
|
||||||
#include "widget.H"
|
|
||||||
#include "widget.VAR"
|
|
||||||
#include "widget.P"
|
|
||||||
|
|
||||||
#define NoREF(a) a=a
|
|
||||||
|
|
||||||
WORD wPlayDiskID;
|
|
||||||
|
|
||||||
HWND hWndBut;
|
|
||||||
HWND hWndChk;
|
|
||||||
HWND hWndRadio;
|
|
||||||
HWND hWndLBox;
|
|
||||||
HWND hWndScrol;
|
|
||||||
HWND hWndScro2;
|
|
||||||
HWND hWndStat;
|
|
||||||
HWND hWndEdit;
|
|
||||||
HWND hWndCBox;
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
/**********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,
|
|
||||||
LPSTR lpszCmdLine,int nCmdShow)
|
|
||||||
{
|
|
||||||
WNDCLASS wndClass;
|
|
||||||
MSG msg;
|
|
||||||
HWND hWnd;
|
|
||||||
HDC hDC;
|
|
||||||
char C[40];
|
|
||||||
int X;
|
|
||||||
NoREF(lpszCmdLine);
|
|
||||||
if ( !hPrevInstance )
|
|
||||||
{
|
|
||||||
wndClass.style = CS_HREDRAW | CS_VREDRAW ;
|
|
||||||
wndClass.lpfnWndProc = (WNDPROC)WndProc;
|
|
||||||
wndClass.cbClsExtra = 0;
|
|
||||||
wndClass.cbWndExtra = 0;
|
|
||||||
wndClass.hInstance = hInstance;
|
|
||||||
wndClass.hIcon = LoadIcon(hInstance,(LPSTR)"ICON_1");
|
|
||||||
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW );
|
|
||||||
wndClass.hbrBackground = GetStockObject(WHITE_BRUSH );
|
|
||||||
wndClass.lpszMenuName = szAppName;
|
|
||||||
wndClass.lpszClassName = szAppName;
|
|
||||||
if (!RegisterClass(&wndClass))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
hWnd = CreateWindow(szAppName, "widget test program",
|
|
||||||
WS_POPUP | WS_BORDER | WS_VISIBLE, 50, 50,
|
|
||||||
400, 400, NULL, NULL, hInstance, NULL);
|
|
||||||
hWndMain = hWnd;
|
|
||||||
hInst = hInstance;
|
|
||||||
hDCMain = GetDC(hWndMain);
|
|
||||||
|
|
||||||
InitWidgets();
|
|
||||||
|
|
||||||
while (GetMessage(&msg, NULL, 0, 0))
|
|
||||||
{
|
|
||||||
TranslateMessage(&msg );
|
|
||||||
DispatchMessage(&msg );
|
|
||||||
}
|
|
||||||
ReleaseDC(hWndMain, hDC);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InitWidgets()
|
|
||||||
{
|
|
||||||
hWndBut = CreateWindow("BUTTON", "Button #1",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_PUSHBUTTON,
|
|
||||||
230, 40, 80, 30, hWndMain, 1001, hInst, NULL);
|
|
||||||
hWndScrol = CreateWindow("SCROLLBAR", "Scroll #1",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT,
|
|
||||||
200, 140, 15, 100, hWndMain, 1004, hInst, NULL);
|
|
||||||
hWndScro2 = CreateWindow("SCROLLBAR", "Scroll #2",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ,
|
|
||||||
50, 140, 100, 15, hWndMain, 1005, hInst, NULL);
|
|
||||||
x = y = 25;
|
|
||||||
SetVertScroll(NULL, hWndScrol, 25, 0, 50);
|
|
||||||
SetScrollRange(hWndScro2, SB_CTL, 0, 50, TRUE);
|
|
||||||
SetScrollPos(hWndScro2, SB_CTL, 25, TRUE);
|
|
||||||
hWndLBox = CreateWindow("LISTBOX", "",
|
|
||||||
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,
|
|
||||||
230, 160, 150, 100, hWndMain, 1004, hInst, NULL);
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #1");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
long FAR PASCAL WndProc(HWND hWnd, unsigned Message, WORD wParam, LONG lParam)
|
|
||||||
{
|
|
||||||
int ShiftState;
|
|
||||||
char C[80];
|
|
||||||
ShiftState = GetKeyState(VK_SHIFT);
|
|
||||||
switch(Message)
|
|
||||||
{
|
|
||||||
case WM_COMMAND:
|
|
||||||
if (LOWORD(lParam) != 0)
|
|
||||||
{
|
|
||||||
sprintf(C, "MAIN WM_COMMAND wParam=%X lParam=%lX !!!", wParam, lParam);
|
|
||||||
TextOut(hDCMain, 25, 280, C, strlen(C));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
|
||||||
sprintf(C, "WM_KEYDOWN !!!");
|
|
||||||
TextOut(hDCMain, 25, 40, C, strlen(C));
|
|
||||||
KeyDown(hWnd, Message, wParam);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_CHAR:
|
|
||||||
sprintf(C, "WM_CHAR !!!");
|
|
||||||
TextOut(hDCMain, 25, 50, C, strlen(C));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_LBUTTONDOWN:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_RBUTTONDOWN:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_RBUTTONUP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_VSCROLL:
|
|
||||||
sprintf(C, "WM_VSCROLL %X %X %lX !!!", Message, wParam, lParam);
|
|
||||||
TextOut(hDCMain, 25, 370, C, strlen(C));
|
|
||||||
Do_Dlg_VertScroll(hWnd, wParam, lParam, &y, 0, 50);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_HSCROLL:
|
|
||||||
sprintf(C, "WM_HSCROLL %X %X %lX !!!", Message, wParam, lParam);
|
|
||||||
TextOut(hDCMain, 25, 370, C, strlen(C));
|
|
||||||
Do_Dlg_HorzScroll(hWnd, wParam, lParam, &x, 0, 50);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_PAINT:
|
|
||||||
DoPaint(hWnd);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_DESTROY:
|
|
||||||
PostQuitMessage(0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return DefWindowProc(hWnd, Message, wParam, lParam);
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BOOL KeyDown(HWND hWnd, unsigned Message, WORD wParam)
|
|
||||||
{
|
|
||||||
WORD wRet;
|
|
||||||
UINT uRet;
|
|
||||||
DWORD dwRet;
|
|
||||||
char C[128];
|
|
||||||
char C2[64];
|
|
||||||
NoREF(hWnd);
|
|
||||||
NoREF(Message);
|
|
||||||
sprintf(C, "KeyDown %x !!!", wParam);
|
|
||||||
TextOut(hDCMain, 25, 100, C, strlen(C));
|
|
||||||
switch (wParam)
|
|
||||||
{
|
|
||||||
case VK_HOME: /* 'HOME' KEY */
|
|
||||||
break;
|
|
||||||
case VK_LEFT: /* 'LEFT' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case VK_RIGHT: /* 'RIGHT' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case VK_UP: /* 'UP' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case VK_DOWN: /* 'DOWN' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case VK_PRIOR: /* 'PGUP' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case VK_NEXT: /* 'PGDN' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case '1':
|
|
||||||
break;
|
|
||||||
case '2':
|
|
||||||
break;
|
|
||||||
case '3':
|
|
||||||
break;
|
|
||||||
case '4':
|
|
||||||
break;
|
|
||||||
case '5':
|
|
||||||
break;
|
|
||||||
case 'A':
|
|
||||||
break;
|
|
||||||
case 'B':
|
|
||||||
break;
|
|
||||||
case 'C':
|
|
||||||
break;
|
|
||||||
case 'D':
|
|
||||||
break;
|
|
||||||
case 'E':
|
|
||||||
break;
|
|
||||||
case 'F':
|
|
||||||
break;
|
|
||||||
case 'G':
|
|
||||||
break;
|
|
||||||
case 'H':
|
|
||||||
WinHelp(hWndMain, "toto.hlp", HELP_INDEX, 0L);
|
|
||||||
break;
|
|
||||||
case 'J':
|
|
||||||
WinExec("/D:/wine/widget.exe arg1 arg2 arg3 arg4 arg5 arg6", SW_NORMAL);
|
|
||||||
break;
|
|
||||||
case 'K':
|
|
||||||
break;
|
|
||||||
case 'Q':
|
|
||||||
hWndStat = CreateWindow("STATIC", "Static #1",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_SIMPLE,
|
|
||||||
230, 20, 80, 20, hWndMain, 1000, hInst, NULL);
|
|
||||||
break;
|
|
||||||
case 'W':
|
|
||||||
hWndChk = CreateWindow("BUTTON", "CheckBox #1",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_CHECKBOX,
|
|
||||||
230, 90, 120, 20, hWndMain, 1002, hInst, NULL);
|
|
||||||
break;
|
|
||||||
case 'R':
|
|
||||||
hWndRadio = CreateWindow("BUTTON", "RadioBut #1",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_RADIOBUTTON,
|
|
||||||
230, 120, 120, 20, hWndMain, 1003, hInst, NULL);
|
|
||||||
SendMessage(hWndRadio, BM_SETCHECK, 0, 0L);
|
|
||||||
break;
|
|
||||||
case 'T':
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox Single item");
|
|
||||||
break;
|
|
||||||
case 'Y':
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #2");
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #3");
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #4");
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #5");
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #6");
|
|
||||||
SendMessage(hWndLBox, LB_SETCURSEL, 3, 0L);
|
|
||||||
SendMessage(hWndLBox, LB_INSERTSTRING, 5, (LPARAM)"Item between 5 & 6");
|
|
||||||
wRet = SendMessage(hWndLBox, LB_FINDSTRING, -1, (LPARAM)"Item between 5 & 6");
|
|
||||||
sprintf(C, "LB_FINDSTRING returned #%u ", wRet);
|
|
||||||
TextOut(hDCMain, 25, 300, C, strlen(C));
|
|
||||||
wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);
|
|
||||||
sprintf(C, "LB_GETCURSEL returned #%u ", wRet);
|
|
||||||
TextOut(hDCMain, 25, 320, C, strlen(C));
|
|
||||||
break;
|
|
||||||
case 'U':
|
|
||||||
SendMessage(hWndLBox, LB_DELETESTRING, 3, 0L);
|
|
||||||
break;
|
|
||||||
case 'I':
|
|
||||||
SendMessage(hWndLBox, LB_RESETCONTENT, 0, 0L);
|
|
||||||
break;
|
|
||||||
case 'O':
|
|
||||||
C2[0] = '\0';
|
|
||||||
SendMessage(hWndLBox, LB_GETTEXT, 2, (DWORD)C2);
|
|
||||||
sprintf(C, "LB_GETTEXT returned '%s' ", C2);
|
|
||||||
TextOut(hDCMain, 25, 320, C, strlen(C));
|
|
||||||
break;
|
|
||||||
case 'P':
|
|
||||||
SendMessage(hWndLBox, LB_DIR, 0, (DWORD)"*.*");
|
|
||||||
break;
|
|
||||||
case 'Z':
|
|
||||||
ShowWindow(hWndScrol, SW_HIDE);
|
|
||||||
break;
|
|
||||||
case 'X':
|
|
||||||
ShowWindow(hWndScrol, SW_SHOW);
|
|
||||||
break;
|
|
||||||
case 'V':
|
|
||||||
hWndCBox = CreateWindow("COMBOBOX", "Combo #1",
|
|
||||||
WS_CHILD | WS_VISIBLE | WS_BORDER | CBS_DROPDOWNLIST,
|
|
||||||
230, 270, 150, 100, hWndMain, 1006, hInst, NULL);
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");
|
|
||||||
break;
|
|
||||||
case 'N':
|
|
||||||
hWndCBox = CreateWindow("COMBOBOX", "Combo #2",
|
|
||||||
WS_CHILD | WS_VISIBLE | WS_BORDER | CBS_DROPDOWN,
|
|
||||||
30, 270, 150, 100, hWndMain, 1007, hInst, NULL);
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VK_F10: /* 'F10' FUNCTION KEY */
|
|
||||||
break;
|
|
||||||
case VK_F11: /* 'F11' FUNCTION KEY */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return(TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void DoPaint(HWND hWnd)
|
|
||||||
{
|
|
||||||
HDC hDC;
|
|
||||||
RECT rect;
|
|
||||||
PAINTSTRUCT ps;
|
|
||||||
char C[80];
|
|
||||||
GetClientRect(hWnd, &rect);
|
|
||||||
hDC = BeginPaint(hWnd, &ps);
|
|
||||||
FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH));
|
|
||||||
InflateRect(&rect, -3, -3);
|
|
||||||
FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
|
|
||||||
InflateRect(&rect, -10, -10);
|
|
||||||
FillRect(hDC, &rect, GetStockObject(WHITE_BRUSH));
|
|
||||||
sprintf(C, "Wine Testing !!!");
|
|
||||||
TextOut(hDC, 25, 25, C, strlen(C));
|
|
||||||
ReleaseDC(hWnd,hDC);
|
|
||||||
EndPaint(hWnd,&ps);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
void SetVertScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)
|
|
||||||
{
|
|
||||||
char C[12];
|
|
||||||
SetScrollRange(hWndSCROLL, SB_CTL, -MAX, -MIN, FALSE);
|
|
||||||
SetScrollPos(hWndSCROLL, SB_CTL, -VAL, TRUE);
|
|
||||||
itoa(VAL, C, 10);
|
|
||||||
//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void SetHorzScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)
|
|
||||||
{
|
|
||||||
char C[12];
|
|
||||||
SetScrollRange(hWndSCROLL, SB_CTL, MAX, MIN, FALSE);
|
|
||||||
SetScrollPos(hWndSCROLL, SB_CTL, VAL, TRUE);
|
|
||||||
itoa(VAL, C, 10);
|
|
||||||
//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Do_Dlg_VertScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)
|
|
||||||
{
|
|
||||||
char C[12];
|
|
||||||
int VAL;
|
|
||||||
int VAL2;
|
|
||||||
int Step = 100;
|
|
||||||
if (MAX < 1000) Step = 10;
|
|
||||||
if (MAX < 100) Step = MAX / 10;
|
|
||||||
VAL = *(V);
|
|
||||||
VAL2 = VAL;
|
|
||||||
switch (wParam)
|
|
||||||
{
|
|
||||||
case SB_LINEUP:
|
|
||||||
VAL++;
|
|
||||||
break;
|
|
||||||
case SB_LINEDOWN:
|
|
||||||
VAL--;
|
|
||||||
break;
|
|
||||||
case SB_PAGEUP:
|
|
||||||
VAL += Step;
|
|
||||||
break;
|
|
||||||
case SB_PAGEDOWN:
|
|
||||||
VAL -= Step;
|
|
||||||
break;
|
|
||||||
case SB_THUMBTRACK:
|
|
||||||
case SB_THUMBPOSITION:
|
|
||||||
VAL = -(LOWORD(lParam));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (VAL > MAX) VAL = MAX;
|
|
||||||
if (VAL < MIN) VAL = MIN;
|
|
||||||
if (VAL != VAL2)
|
|
||||||
{
|
|
||||||
SetScrollPos(HIWORD(lParam), SB_CTL, -VAL, TRUE);
|
|
||||||
ltoa(VAL, C, 10);
|
|
||||||
// SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);
|
|
||||||
}
|
|
||||||
*(V) = VAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Do_Dlg_HorzScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)
|
|
||||||
{
|
|
||||||
char C[12];
|
|
||||||
int VAL;
|
|
||||||
int VAL2;
|
|
||||||
int Step = 100;
|
|
||||||
if (MAX < 1000) Step = 10;
|
|
||||||
if (MAX < 100) Step = MAX / 10;
|
|
||||||
VAL = *(V);
|
|
||||||
VAL2 = VAL;
|
|
||||||
switch (wParam)
|
|
||||||
{
|
|
||||||
case SB_LINEUP:
|
|
||||||
VAL--;
|
|
||||||
break;
|
|
||||||
case SB_LINEDOWN:
|
|
||||||
VAL++;
|
|
||||||
break;
|
|
||||||
case SB_PAGEUP:
|
|
||||||
VAL -= Step;
|
|
||||||
break;
|
|
||||||
case SB_PAGEDOWN:
|
|
||||||
VAL += Step;
|
|
||||||
break;
|
|
||||||
case SB_THUMBTRACK:
|
|
||||||
case SB_THUMBPOSITION:
|
|
||||||
VAL = (LOWORD(lParam));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (VAL > MAX) VAL = MAX;
|
|
||||||
if (VAL < MIN) VAL = MIN;
|
|
||||||
if (VAL != VAL2)
|
|
||||||
{
|
|
||||||
SetScrollPos(HIWORD(lParam), SB_CTL, VAL, TRUE);
|
|
||||||
ltoa(VAL, C, 10);
|
|
||||||
// SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);
|
|
||||||
}
|
|
||||||
*(V) = VAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
;**********************************************************************
|
|
||||||
;* Copyright (c) 1991 by TRG ELECTRONIK *
|
|
||||||
;**********************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
NAME WineTest
|
|
||||||
DESCRIPTION 'Drink Inventry Controler'
|
|
||||||
STUB 'WINSTUB.EXE'
|
|
||||||
CODE PRELOAD MOVEABLE DISCARDABLE
|
|
||||||
DATA PRELOAD MOVEABLE MULTIPLE
|
|
||||||
EXETYPE WINDOWS
|
|
||||||
SEGMENTS
|
|
||||||
DRINK_TEXT PRELOAD MOVEABLE DISCARDABLE
|
|
||||||
|
|
||||||
HEAPSIZE 20000
|
|
||||||
STACKSIZE 8192
|
|
||||||
|
|
||||||
EXPORTS WndProc @1
|
|
||||||
About_Proc @3
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,250 +0,0 @@
|
||||||
/**********************************************************************
|
|
||||||
* Copyright (c) 1991 by TRG ELECTRONIK *
|
|
||||||
**********************************************************************/
|
|
||||||
|
|
||||||
#define szAppName "widgetClass"
|
|
||||||
|
|
||||||
#define IDNULL -1
|
|
||||||
|
|
||||||
#define IDSCLOSE 20
|
|
||||||
#define IDSOKCLOSE 21
|
|
||||||
#define IDSSAVE 22
|
|
||||||
#define IDSOKSAVE 23
|
|
||||||
#define IDINFO 24
|
|
||||||
#define IDSAVE 25
|
|
||||||
#define IDDELETE 26
|
|
||||||
#define IDNEW 27
|
|
||||||
|
|
||||||
|
|
||||||
#define IDBUSER 30
|
|
||||||
#define IDBUSER1 31
|
|
||||||
#define IDBUSER2 32
|
|
||||||
#define IDBUSER3 33
|
|
||||||
#define IDBUSER4 34
|
|
||||||
#define IDBUSER5 35
|
|
||||||
#define IDBUSER6 36
|
|
||||||
#define IDBUSER7 37
|
|
||||||
#define IDBUSER8 38
|
|
||||||
#define IDBUSER9 39
|
|
||||||
|
|
||||||
#define IDDJOBNAME 50
|
|
||||||
#define IDDPRINTER 51
|
|
||||||
|
|
||||||
#define IDSETUP 60
|
|
||||||
|
|
||||||
|
|
||||||
#define IDI_MKSICON 99
|
|
||||||
|
|
||||||
/******************************************/
|
|
||||||
|
|
||||||
#define MID_NEW 100
|
|
||||||
#define MID_OPEN 101
|
|
||||||
#define MID_SAVE 102
|
|
||||||
#define MID_SAVEAS 103
|
|
||||||
#define MID_PRINT 104
|
|
||||||
#define MID_PRSETUP 105
|
|
||||||
#define MID_STATUS 106
|
|
||||||
#define MID_QUIT 107
|
|
||||||
|
|
||||||
#define MID_CUT 121
|
|
||||||
#define MID_COPY 122
|
|
||||||
#define MID_PASTE 123
|
|
||||||
#define MID_CLEAR 124
|
|
||||||
#define MID_COPYTO 125
|
|
||||||
#define MID_PASTEFROM 126
|
|
||||||
|
|
||||||
#define MID_NEWPROD 140
|
|
||||||
#define MID_NEWBEER 141
|
|
||||||
#define MID_USERCFG 142
|
|
||||||
|
|
||||||
#define MID_POREGIE 151
|
|
||||||
#define MID_POBIERE 152
|
|
||||||
#define MID_DAYSTOCK 153
|
|
||||||
#define MID_RESERVE 154
|
|
||||||
#define MID_COCKSALE 155
|
|
||||||
#define MID_DRYSALE 156
|
|
||||||
#define MID_COMPILE 157
|
|
||||||
#define MID_RECETTES 158
|
|
||||||
#define MID_HD 159
|
|
||||||
#define MID_TESTPRN 160
|
|
||||||
#define MID_INFODSK 161
|
|
||||||
#define MID_SHARP 162
|
|
||||||
#define MID_PASSWORD 163
|
|
||||||
|
|
||||||
/******************************************/
|
|
||||||
|
|
||||||
#define IDDTEXT 200
|
|
||||||
#define IDDTXT1 201
|
|
||||||
#define IDDTXT2 202
|
|
||||||
#define IDDTXT3 203
|
|
||||||
#define IDDTXT4 204
|
|
||||||
#define IDDTXT5 205
|
|
||||||
#define IDDTXT6 206
|
|
||||||
#define IDDTXT7 207
|
|
||||||
#define IDDTXT8 208
|
|
||||||
#define IDDTXT9 209
|
|
||||||
#define IDDTXT10 210
|
|
||||||
#define IDDTXT11 211
|
|
||||||
#define IDDTXT12 212
|
|
||||||
#define IDDTXT13 213
|
|
||||||
#define IDDTXT14 214
|
|
||||||
#define IDDTXT15 215
|
|
||||||
#define IDDTXT16 216
|
|
||||||
#define IDDTXT17 217
|
|
||||||
#define IDDTXT18 218
|
|
||||||
#define IDDTXT19 219
|
|
||||||
|
|
||||||
#define IDDBUTTON1 220
|
|
||||||
#define IDDBUTTON2 221
|
|
||||||
#define IDDBUTTON3 222
|
|
||||||
#define IDDBUTTON4 223
|
|
||||||
#define IDDBUTTON5 224
|
|
||||||
#define IDDBUTTON6 225
|
|
||||||
#define IDDBUTTON7 226
|
|
||||||
#define IDDBUTTON8 227
|
|
||||||
#define IDDBUTTON9 228
|
|
||||||
#define IDDBUTTON10 229
|
|
||||||
|
|
||||||
#define IDDCHKBOX1 240
|
|
||||||
#define IDDCHKBOX2 241
|
|
||||||
#define IDDCHKBOX3 242
|
|
||||||
#define IDDCHKBOX4 243
|
|
||||||
#define IDDCHKBOX5 244
|
|
||||||
#define IDDCHKBOX6 245
|
|
||||||
#define IDDCHKBOX7 246
|
|
||||||
#define IDDCHKBOX8 247
|
|
||||||
#define IDDCHKBOX9 248
|
|
||||||
#define IDDCHKBOX10 249
|
|
||||||
|
|
||||||
#define IDDSCROLL1 250
|
|
||||||
#define IDDSCROLL2 251
|
|
||||||
#define IDDSCROLL3 252
|
|
||||||
#define IDDSCROLL4 253
|
|
||||||
#define IDDSCROLL5 254
|
|
||||||
#define IDDSCROLL6 255
|
|
||||||
#define IDDSCROLL7 256
|
|
||||||
#define IDDSCROLL8 257
|
|
||||||
|
|
||||||
#define IDDSTR1 2000
|
|
||||||
#define IDDSTR2 2001
|
|
||||||
#define IDDSTR3 2002
|
|
||||||
#define IDDSTR4 2003
|
|
||||||
#define IDDSTR5 2004
|
|
||||||
#define IDDSTR6 2005
|
|
||||||
#define IDDSTR7 2006
|
|
||||||
#define IDDSTR8 2007
|
|
||||||
#define IDDSTR9 2008
|
|
||||||
#define IDDSTR10 2009
|
|
||||||
#define IDDSTR11 2010
|
|
||||||
#define IDDSTR12 2011
|
|
||||||
#define IDDSTR13 2012
|
|
||||||
#define IDDSTR14 2013
|
|
||||||
#define IDDSTR15 2014
|
|
||||||
#define IDDSTR16 2015
|
|
||||||
#define IDDSTR17 2016
|
|
||||||
#define IDDSTR18 2017
|
|
||||||
#define IDDSTR19 2018
|
|
||||||
#define IDDSTR20 2019
|
|
||||||
#define IDDSTR21 2020
|
|
||||||
#define IDDSTR22 2021
|
|
||||||
#define IDDSTR23 2022
|
|
||||||
#define IDDSTR24 2023
|
|
||||||
#define IDDSTR25 2024
|
|
||||||
#define IDDSTR26 2025
|
|
||||||
#define IDDSTR27 2026
|
|
||||||
#define IDDSTR28 2027
|
|
||||||
#define IDDSTR29 2028
|
|
||||||
#define IDDSTR30 2029
|
|
||||||
#define IDDSTR31 2030
|
|
||||||
#define IDDSTR32 2031
|
|
||||||
#define IDDSTR33 2032
|
|
||||||
#define IDDSTR34 2033
|
|
||||||
#define IDDSTR35 2034
|
|
||||||
#define IDDSTR36 2035
|
|
||||||
#define IDDSTR37 2036
|
|
||||||
#define IDDSTR38 2037
|
|
||||||
#define IDDSTR39 2038
|
|
||||||
#define IDDSTR40 2039
|
|
||||||
#define IDDSTR41 2040
|
|
||||||
#define IDDSTR42 2041
|
|
||||||
#define IDDSTR43 2042
|
|
||||||
#define IDDSTR44 2043
|
|
||||||
#define IDDSTR45 2044
|
|
||||||
#define IDDSTR46 2045
|
|
||||||
#define IDDSTR47 2046
|
|
||||||
#define IDDSTR48 2047
|
|
||||||
#define IDDSTR49 2048
|
|
||||||
#define IDDSTR50 2049
|
|
||||||
#define IDDSTR51 2050
|
|
||||||
#define IDDSTR52 2051
|
|
||||||
#define IDDSTR53 2052
|
|
||||||
#define IDDSTR54 2053
|
|
||||||
#define IDDSTR55 2054
|
|
||||||
#define IDDSTR56 2055
|
|
||||||
#define IDDSTR57 2056
|
|
||||||
#define IDDSTR58 2057
|
|
||||||
#define IDDSTR59 2058
|
|
||||||
#define IDDSTR60 2059
|
|
||||||
#define IDDSTR61 2060
|
|
||||||
#define IDDSTR62 2061
|
|
||||||
#define IDDSTR63 2062
|
|
||||||
#define IDDSTR64 2063
|
|
||||||
#define IDDSTR65 2064
|
|
||||||
#define IDDSTR66 2065
|
|
||||||
#define IDDSTR67 2066
|
|
||||||
#define IDDSTR68 2067
|
|
||||||
#define IDDSTR69 2068
|
|
||||||
#define IDDSTR70 2069
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************/
|
|
||||||
|
|
||||||
#define IDDDEFAULTS 1001
|
|
||||||
#define IDDCHECKBOX 1002
|
|
||||||
#define IDDNULL 1003
|
|
||||||
#define IDDRBLEFT 1004
|
|
||||||
#define IDDRBRIGHT 1005
|
|
||||||
#define IDDRBCENTER 1006
|
|
||||||
#define IDDLISTBOX 1007
|
|
||||||
#define IDDSBH 1008
|
|
||||||
#define IDDSBV 1009
|
|
||||||
|
|
||||||
/******************************************/
|
|
||||||
|
|
||||||
#define ABOUT_Dlg 2001
|
|
||||||
#define NEW_Dlg 2002
|
|
||||||
#define OPEN_Dlg 2003
|
|
||||||
#define SAVE_Dlg 2004
|
|
||||||
#define SAVEAS_Dlg 2005
|
|
||||||
#define PRINT_Dlg 2006
|
|
||||||
#define ABORT_Dlg 2007
|
|
||||||
#define PRSETUP_Dlg 2008
|
|
||||||
#define QUIT_Dlg 2009
|
|
||||||
|
|
||||||
#define GETOBJ_Dlg 2020
|
|
||||||
#define NEWPROD_Dlg 2021
|
|
||||||
#define NEWBEER_Dlg 2022
|
|
||||||
#define USERCFG_Dlg 2023
|
|
||||||
#define POREGIE_Dlg 2024
|
|
||||||
#define POBIERE_Dlg 2025
|
|
||||||
#define PASSWORD_Dlg 2026
|
|
||||||
#define TVQ_Dlg 2027
|
|
||||||
|
|
||||||
#define LTEXTOK_Dlg 2070
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************/
|
|
||||||
|
|
||||||
#define RED 0x000000FF
|
|
||||||
#define GREEN 0x0000FF00
|
|
||||||
#define BLUE 0x00FF0000
|
|
||||||
#define CYAN 0x00FFFF00
|
|
||||||
#define MAGENTA 0x00FF00FF
|
|
||||||
#define BLACK 0x00000000
|
|
||||||
#define WHITE 0x00FFFFFF
|
|
||||||
#define GRAY 0x00808080
|
|
||||||
#define LTGRAY 0x00C0C0C0
|
|
||||||
#define DKGRAY 0x00404040
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 766 B |
Binary file not shown.
Before Width: | Height: | Size: 766 B |
|
@ -1,78 +0,0 @@
|
||||||
/**********************************************************************
|
|
||||||
* Copyright (c) 1991 by TRG ELECTRONIK *
|
|
||||||
* *
|
|
||||||
* widget.RC *
|
|
||||||
* widget RESSOURCES *
|
|
||||||
* *
|
|
||||||
**********************************************************************/
|
|
||||||
|
|
||||||
#include <\BC\INCLUDE\WINDOWS.H>
|
|
||||||
#include "widget.H"
|
|
||||||
|
|
||||||
#define TABGRP WS_TABSTOP | WS_GROUP
|
|
||||||
#define LBSTYLES WS_VSCROLL | WS_BORDER | WS_VISIBLE | LBS_SORT | TABGRP
|
|
||||||
#define HSCROLL WS_VISIBLE | SBS_HORZ | SBS_TOPALIGN | TABGRP
|
|
||||||
#define VSCROLL WS_VISIBLE | SBS_VERT | SBS_LEFTALIGN | TABGRP
|
|
||||||
#define BLACKRECT SS_BLACKRECT | WS_VISIBLE | WS_GROUP
|
|
||||||
#define WHITEFRAME SS_WHITEFRAME | WS_VISIBLE | WS_GROUP
|
|
||||||
|
|
||||||
|
|
||||||
ICON_1 ICON widget.ICO
|
|
||||||
ICON_2 ICON widget.IC2
|
|
||||||
ICON_3 ICON widget.IC3
|
|
||||||
|
|
||||||
MENU_1 MENU
|
|
||||||
BEGIN
|
|
||||||
POPUP "&File"
|
|
||||||
BEGIN
|
|
||||||
MENUITEM "&New", MID_NEW
|
|
||||||
MENUITEM "&Open", MID_OPEN
|
|
||||||
MENUITEM "&Save", MID_SAVE
|
|
||||||
MENUITEM "Save &As", MID_SAVEAS
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "&Quit!", MID_QUIT
|
|
||||||
END
|
|
||||||
END
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ABOUT_Dlg DIALOG 100, 100, 154, 75
|
|
||||||
STYLE WS_POPUP | WS_DLGFRAME
|
|
||||||
BEGIN
|
|
||||||
ICON "widget" -1, 9, 23, 0, 0
|
|
||||||
ICON "DKICON2" -1, 30, 23, 0, 0
|
|
||||||
ICON "DKICON3" -1, 50, 23, 0, 0
|
|
||||||
CTEXT "About widget Inventory Controler" -1, 0, 14,154, 8
|
|
||||||
CTEXT "Version 0.50" -1, 30, 34, 94, 8
|
|
||||||
CTEXT "Copyright © 1991, TRG Electronik" -1, 0, 47,154, 9
|
|
||||||
DEFPUSHBUTTON "Ok" IDOK, 61, 59, 32, 14, WS_GROUP
|
|
||||||
END
|
|
||||||
|
|
||||||
|
|
||||||
LTEXTOK_Dlg DIALOG 100, 100, 300, 120
|
|
||||||
STYLE WS_POPUP | WS_DLGFRAME
|
|
||||||
BEGIN
|
|
||||||
LTEXT "", IDDTXT1, 20, 15,118, 12
|
|
||||||
LTEXT "", IDDTXT2, 20, 30,118, 25
|
|
||||||
LTEXT "", IDDTXT3, 20, 45,118, 35
|
|
||||||
LTEXT "", IDDTXT3, 20, 60,118, 35
|
|
||||||
DEFPUSHBUTTON "OK", IDOK, 150, 85, 40, 14, TABGRP
|
|
||||||
END
|
|
||||||
|
|
||||||
|
|
||||||
STRINGTABLE
|
|
||||||
BEGIN
|
|
||||||
IDDSTR1, "Wine Test Program"
|
|
||||||
IDDSTR2, ""
|
|
||||||
IDDSTR3, ""
|
|
||||||
IDDSTR4, ""
|
|
||||||
IDDSTR5, ""
|
|
||||||
IDDSTR6, ""
|
|
||||||
IDDSTR7, ""
|
|
||||||
IDDSTR8, ""
|
|
||||||
IDDSTR9, ""
|
|
||||||
IDDSTR10, ""
|
|
||||||
END
|
|
||||||
|
|
||||||
|
|
|
@ -1,649 +0,0 @@
|
||||||
/**********************************************************************
|
|
||||||
* Copyright (c) 1991 by TRG ELECTRONIK *
|
|
||||||
* *
|
|
||||||
* widget.C *
|
|
||||||
* widget Inventory Controler PART # 1 *
|
|
||||||
* *
|
|
||||||
**********************************************************************/
|
|
||||||
|
|
||||||
#include <WINDOWS.H>
|
|
||||||
#include "STDIO.h"
|
|
||||||
#include "STDLIB.h"
|
|
||||||
#include "STDARG.h"
|
|
||||||
#include "STRING.H"
|
|
||||||
|
|
||||||
#include "widget.H"
|
|
||||||
#include "widget.VAR"
|
|
||||||
#include "widget.P"
|
|
||||||
|
|
||||||
#define NoREF(a) a=a
|
|
||||||
|
|
||||||
HWND hWndBut;
|
|
||||||
HWND hWndChk;
|
|
||||||
HWND hWndRadio;
|
|
||||||
HWND hWndLBox;
|
|
||||||
HWND hWndLBox2;
|
|
||||||
HWND hWndLBox3;
|
|
||||||
HWND hWndLBox4;
|
|
||||||
HWND hWndScrol;
|
|
||||||
HWND hWndScro2;
|
|
||||||
HWND hWndScro3;
|
|
||||||
HWND hWndStat;
|
|
||||||
HWND hWndEdit;
|
|
||||||
HWND hWndCBox;
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
HBRUSH hREDBrush;
|
|
||||||
HBRUSH hGREENBrush;
|
|
||||||
HBRUSH hBLUEBrush;
|
|
||||||
HBRUSH hGRAYBrush;
|
|
||||||
HBITMAP hBitMap;
|
|
||||||
HBITMAP hBitMap2;
|
|
||||||
HBITMAP hBitMap3;
|
|
||||||
BITMAP BitMap;
|
|
||||||
|
|
||||||
/**********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,
|
|
||||||
LPSTR lpszCmdLine,int nCmdShow)
|
|
||||||
{
|
|
||||||
WNDCLASS wndClass;
|
|
||||||
MSG msg;
|
|
||||||
HWND hWnd;
|
|
||||||
HDC hDC;
|
|
||||||
char C[40];
|
|
||||||
int X;
|
|
||||||
NoREF(lpszCmdLine);
|
|
||||||
if ( !hPrevInstance )
|
|
||||||
{
|
|
||||||
wndClass.style = CS_HREDRAW | CS_VREDRAW ;
|
|
||||||
wndClass.lpfnWndProc = (WNDPROC)WndProc;
|
|
||||||
wndClass.cbClsExtra = 0;
|
|
||||||
wndClass.cbWndExtra = 0;
|
|
||||||
wndClass.hInstance = hInstance;
|
|
||||||
wndClass.hIcon = LoadIcon(hInstance,(LPSTR)"ICON_1");
|
|
||||||
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW );
|
|
||||||
wndClass.hbrBackground = GetStockObject(WHITE_BRUSH );
|
|
||||||
wndClass.lpszMenuName = szAppName;
|
|
||||||
wndClass.lpszClassName = szAppName;
|
|
||||||
if (!RegisterClass(&wndClass))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
hWnd = CreateWindow(szAppName, "widget test program",
|
|
||||||
WS_POPUP | WS_CAPTION | WS_BORDER | WS_VISIBLE, 50, 50,
|
|
||||||
400, 500, NULL, NULL, hInstance, NULL);
|
|
||||||
hWndMain = hWnd;
|
|
||||||
hInst = hInstance;
|
|
||||||
hDCMain = GetDC(hWndMain);
|
|
||||||
hREDBrush = CreateSOLIDBrush(0x000000FF);
|
|
||||||
hGREENBrush = CreateSOLIDBrush(0x00007F00);
|
|
||||||
hBLUEBrush = CreateSOLIDBrush(0x00FF0000);
|
|
||||||
hGRAYBrush = CreateSOLIDBrush(0x00C0C0C0);
|
|
||||||
|
|
||||||
InitWidgets();
|
|
||||||
|
|
||||||
while (GetMessage(&msg, NULL, 0, 0))
|
|
||||||
{
|
|
||||||
TranslateMessage(&msg );
|
|
||||||
DispatchMessage(&msg );
|
|
||||||
}
|
|
||||||
DeleteObject(hREDBrush);
|
|
||||||
DeleteObject(hGREENBrush);
|
|
||||||
DeleteObject(hBLUEBrush);
|
|
||||||
DeleteObject(hGRAYBrush);
|
|
||||||
if (hBitMap != NULL) DeleteObject(hBitMap);
|
|
||||||
if (hBitMap2 != NULL) DeleteObject(hBitMap2);
|
|
||||||
if (hBitMap3 != NULL) DeleteObject(hBitMap3);
|
|
||||||
ReleaseDC(hWndMain, hDC);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InitWidgets()
|
|
||||||
{
|
|
||||||
hWndBut = CreateWindow("BUTTON", "Button #1",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_PUSHBUTTON,
|
|
||||||
230, 40, 80, 30, hWndMain, 1001, hInst, NULL);
|
|
||||||
hWndScrol = CreateWindow("SCROLLBAR", "Scroll #1",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT,
|
|
||||||
200, 150, 15, 100, hWndMain, 1004, hInst, NULL);
|
|
||||||
hWndScro2 = CreateWindow("SCROLLBAR", "Scroll #2",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ,
|
|
||||||
50, 150, 100, 15, hWndMain, 1005, hInst, NULL);
|
|
||||||
hWndScro3 = CreateWindow("SCROLLBAR", "Scroll #3",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_SIZEBOX,
|
|
||||||
50, 180, 25, 25, hWndMain, 1006, hInst, NULL);
|
|
||||||
x = y = 25;
|
|
||||||
SetVertScroll(NULL, hWndScrol, 25, 0, 50);
|
|
||||||
SetScrollRange(hWndScro2, SB_CTL, 0, 50, TRUE);
|
|
||||||
SetScrollPos(hWndScro2, SB_CTL, 25, TRUE);
|
|
||||||
hWndLBox = CreateWindow("LISTBOX", "",
|
|
||||||
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,
|
|
||||||
230, 160, 150, 100, hWndMain, 1004, hInst, NULL);
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #1");
|
|
||||||
hWndStat = CreateWindow("STATIC", "Static #1",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_LEFT,
|
|
||||||
30, 120, 150, 20, hWndMain, 1011, hInst, NULL);
|
|
||||||
SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Left Text");
|
|
||||||
hWndCBox = CreateWindow("COMBOBOX", "Combo #1",
|
|
||||||
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,
|
|
||||||
230, 270, 150, 100, hWndMain, 1060, hInst, NULL);
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #3");
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #4");
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #5");
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #6");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
long FAR PASCAL WndProc(HWND hWnd, unsigned Message, WORD wParam, LONG lParam)
|
|
||||||
{
|
|
||||||
int ShiftState;
|
|
||||||
LPDRAWITEMSTRUCT dis;
|
|
||||||
HDC hMemDC;
|
|
||||||
HBRUSH hBrush;
|
|
||||||
char C[128];
|
|
||||||
ShiftState = GetKeyState(VK_SHIFT);
|
|
||||||
switch(Message)
|
|
||||||
{
|
|
||||||
case WM_COMMAND:
|
|
||||||
if (LOWORD(lParam) != 0)
|
|
||||||
{
|
|
||||||
sprintf(C, "MAIN WM_COMMAND wParam=%X lParam=%lX !!!", wParam, lParam);
|
|
||||||
TextOut(hDCMain, 25, 280, C, strlen(C));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
|
||||||
sprintf(C, "WM_KEYDOWN !!!");
|
|
||||||
TextOut(hDCMain, 25, 40, C, strlen(C));
|
|
||||||
KeyDown(hWnd, Message, wParam);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_CHAR:
|
|
||||||
sprintf(C, "WM_CHAR !!!");
|
|
||||||
TextOut(hDCMain, 25, 50, C, strlen(C));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_CTLCOLOR:
|
|
||||||
switch(HIWORD(lParam))
|
|
||||||
{
|
|
||||||
case CTLCOLOR_SCROLLBAR:
|
|
||||||
return(hBLUEBrush);
|
|
||||||
case CTLCOLOR_LISTBOX:
|
|
||||||
SetBkColor((HDC)wParam, 0x00C0C000);
|
|
||||||
SetTextColor((HDC)wParam, 0x00FF0000);
|
|
||||||
return(hGREENBrush);
|
|
||||||
case CTLCOLOR_STATIC:
|
|
||||||
SetBkColor((HDC)wParam, 0x00C0C0C0);
|
|
||||||
SetTextColor((HDC)wParam, 0x0000FFFF);
|
|
||||||
return(hREDBrush);
|
|
||||||
}
|
|
||||||
return((HBRUSH)NULL);
|
|
||||||
|
|
||||||
case WM_LBUTTONDOWN:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_RBUTTONDOWN:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_RBUTTONUP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_VSCROLL:
|
|
||||||
sprintf(C, "WM_VSCROLL %X %lX !!!", wParam, lParam);
|
|
||||||
TextOut(hDCMain, 25, 380, C, strlen(C));
|
|
||||||
Do_Dlg_VertScroll(hWnd, wParam, lParam, &y, 0, 50);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_HSCROLL:
|
|
||||||
sprintf(C, "WM_HSCROLL %X %lX !!!", wParam, lParam);
|
|
||||||
TextOut(hDCMain, 25, 380, C, strlen(C));
|
|
||||||
Do_Dlg_HorzScroll(hWnd, wParam, lParam, &x, 0, 50);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_DRAWITEM:
|
|
||||||
sprintf(C, "WM_DRAWITEM %X %lX !!!", wParam, lParam);
|
|
||||||
TextOut(hDCMain, 25, 380, C, strlen(C));
|
|
||||||
if (lParam == 0L) break;
|
|
||||||
if (wParam == 0) break;
|
|
||||||
dis = (LPDRAWITEMSTRUCT)lParam;
|
|
||||||
if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1062)) {
|
|
||||||
hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH));
|
|
||||||
SelectObject(dis->hDC, hBrush);
|
|
||||||
FillRect(dis->hDC, &dis->rcItem, hBrush);
|
|
||||||
sprintf(C, "Item #%X", dis->itemID);
|
|
||||||
if (dis->itemData == NULL) break;
|
|
||||||
TextOut(dis->hDC, dis->rcItem.left,
|
|
||||||
dis->rcItem.top, C, strlen(C));
|
|
||||||
}
|
|
||||||
if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1063)) {
|
|
||||||
hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH));
|
|
||||||
SelectObject(dis->hDC, hBrush);
|
|
||||||
FillRect(dis->hDC, &dis->rcItem, hBrush);
|
|
||||||
if (dis->itemData == NULL) break;
|
|
||||||
TextOut(dis->hDC, dis->rcItem.left, dis->rcItem.top,
|
|
||||||
(LPSTR)dis->itemData, lstrlen((LPSTR)dis->itemData));
|
|
||||||
}
|
|
||||||
if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1064)) {
|
|
||||||
hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH));
|
|
||||||
SelectObject(dis->hDC, hBrush);
|
|
||||||
FillRect(dis->hDC, &dis->rcItem, hBrush);
|
|
||||||
hMemDC = CreateCompatibleDC(dis->hDC);
|
|
||||||
SelectObject(hMemDC,hBitMap);
|
|
||||||
BitBlt(dis->hDC, dis->rcItem.left, dis->rcItem.top,
|
|
||||||
BitMap.bmWidth, BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
|
||||||
DeleteDC(hMemDC);
|
|
||||||
sprintf(C, "Item #%X", dis->itemID);
|
|
||||||
TextOut(dis->hDC, dis->rcItem.left + BitMap.bmWidth,
|
|
||||||
dis->rcItem.top, C, strlen(C));
|
|
||||||
// if (dis->itemData == NULL) break;
|
|
||||||
// TextOut(dis->hDC, dis->rcItem.left + BitMap.bmWidth,
|
|
||||||
// dis->rcItem.top, (LPSTR)dis->itemData,
|
|
||||||
// lstrlen((LPSTR)dis->itemData));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_PAINT:
|
|
||||||
DoPaint(hWnd);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_DESTROY:
|
|
||||||
PostQuitMessage(0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return DefWindowProc(hWnd, Message, wParam, lParam);
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BOOL KeyDown(HWND hWnd, unsigned Message, WORD wParam)
|
|
||||||
{
|
|
||||||
WORD wRet;
|
|
||||||
UINT uRet;
|
|
||||||
DWORD dwRet;
|
|
||||||
HDC hMemDC;
|
|
||||||
char C[128];
|
|
||||||
char C2[64];
|
|
||||||
NoREF(hWnd);
|
|
||||||
NoREF(Message);
|
|
||||||
sprintf(C, "KeyDown %x !!!", wParam);
|
|
||||||
TextOut(hDCMain, 25, 100, C, strlen(C));
|
|
||||||
switch (wParam)
|
|
||||||
{
|
|
||||||
case VK_HOME: /* 'HOME' KEY */
|
|
||||||
break;
|
|
||||||
case VK_LEFT: /* 'LEFT' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case VK_RIGHT: /* 'RIGHT' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case VK_UP: /* 'UP' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case VK_DOWN: /* 'DOWN' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case VK_PRIOR: /* 'PGUP' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case VK_NEXT: /* 'PGDN' CURSOR KEY */
|
|
||||||
break;
|
|
||||||
case '1':
|
|
||||||
break;
|
|
||||||
case '2':
|
|
||||||
hWndStat = CreateWindow("STATIC", "Static #2",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_CENTER,
|
|
||||||
30, 150, 150, 20, hWndMain, 1012, hInst, NULL);
|
|
||||||
SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Center Text");
|
|
||||||
break;
|
|
||||||
case '3':
|
|
||||||
hWndStat = CreateWindow("STATIC", "Static #3",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT,
|
|
||||||
30, 180, 150, 20, hWndMain, 1013, hInst, NULL);
|
|
||||||
SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Right Text");
|
|
||||||
break;
|
|
||||||
case '4':
|
|
||||||
hWndStat = CreateWindow("STATIC", "Static #4",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_SIMPLE,
|
|
||||||
30, 210, 150, 20, hWndMain, 1014, hInst, NULL);
|
|
||||||
SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_SIMPLE");
|
|
||||||
break;
|
|
||||||
case '5':
|
|
||||||
hWndStat = CreateWindow("STATIC", "Static #5",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_GRAYRECT,
|
|
||||||
30, 240, 150, 20, hWndMain, 1015, hInst, NULL);
|
|
||||||
SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_GRAYRECT");
|
|
||||||
break;
|
|
||||||
case 'A':
|
|
||||||
hWndStat = CreateWindow("STATIC", "Static #6",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_BLACKRECT,
|
|
||||||
30, 240, 150, 20, hWndMain, 1016, hInst, NULL);
|
|
||||||
SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_BLACKRECT");
|
|
||||||
break;
|
|
||||||
case 'C':
|
|
||||||
if (hBitMap2 == NULL) {
|
|
||||||
hBitMap2 = LoadBitmap(hInst, "LBICON");
|
|
||||||
GetObject(hBitMap2, sizeof(BITMAP), (LPSTR)&BitMap);
|
|
||||||
}
|
|
||||||
hMemDC = CreateCompatibleDC(hDCMain);
|
|
||||||
SelectObject(hMemDC, hBitMap2);
|
|
||||||
BitBlt(hDCMain, 10, 10, BitMap.bmWidth,
|
|
||||||
BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
|
||||||
DeleteDC(hMemDC);
|
|
||||||
sprintf(C, "DrawBitmap");
|
|
||||||
TextOut(hDCMain, 25, 320, C, strlen(C));
|
|
||||||
break;
|
|
||||||
case 'D':
|
|
||||||
if (hBitMap3 == NULL) {
|
|
||||||
hBitMap3 = LoadBitmap(hInst, MAKEINTRESOURCE(3333));
|
|
||||||
GetObject(hBitMap3, sizeof(BITMAP), (LPSTR)&BitMap);
|
|
||||||
}
|
|
||||||
hMemDC = CreateCompatibleDC(hDCMain);
|
|
||||||
SelectObject(hMemDC, hBitMap3);
|
|
||||||
BitBlt(hDCMain, 80, 10, BitMap.bmWidth,
|
|
||||||
BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
|
||||||
DeleteDC(hMemDC);
|
|
||||||
sprintf(C, "DrawBitmap");
|
|
||||||
TextOut(hDCMain, 25, 320, C, strlen(C));
|
|
||||||
break;
|
|
||||||
case 'F':
|
|
||||||
MoveWindow(hWnd, 10, 10, 500, 600, TRUE);
|
|
||||||
break;
|
|
||||||
case 'G':
|
|
||||||
MoveWindow(hWndBut, 20, 20, 100, 20, TRUE);
|
|
||||||
break;
|
|
||||||
case 'H':
|
|
||||||
WinHelp(hWndMain, "toto.hlp", HELP_INDEX, 0L);
|
|
||||||
break;
|
|
||||||
case 'J':
|
|
||||||
WinExec("/D:/wine/widget.exe arg1 arg2 arg3 arg4 arg5 arg6", SW_NORMAL);
|
|
||||||
break;
|
|
||||||
case 'K':
|
|
||||||
break;
|
|
||||||
case 'Q':
|
|
||||||
hWndChk = CreateWindow("BUTTON", "CheckBox #1",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_CHECKBOX,
|
|
||||||
30, 300, 120, 20, hWndMain, 1020, hInst, NULL);
|
|
||||||
break;
|
|
||||||
case 'W':
|
|
||||||
wRet = SendMessage(hWndChk , BM_GETCHECK, 0, 0L);
|
|
||||||
SendMessage(hWndChk , BM_SETCHECK, wRet, 0L);
|
|
||||||
break;
|
|
||||||
case 'E':
|
|
||||||
break;
|
|
||||||
case 'R':
|
|
||||||
hWndRadio = CreateWindow("BUTTON", "RadioBut #1",
|
|
||||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_RADIOBUTTON,
|
|
||||||
230, 120, 120, 20, hWndMain, 1003, hInst, NULL);
|
|
||||||
SendMessage(hWndRadio, BM_SETCHECK, TRUE, 0L);
|
|
||||||
break;
|
|
||||||
case 'T':
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox Single item");
|
|
||||||
break;
|
|
||||||
case 'Y':
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #2");
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #3");
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #4");
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #5");
|
|
||||||
SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #6");
|
|
||||||
SendMessage(hWndLBox, LB_SETCURSEL, 3, 0L);
|
|
||||||
SendMessage(hWndLBox, LB_INSERTSTRING, 5, (LPARAM)"Item between 5 & 6");
|
|
||||||
wRet = SendMessage(hWndLBox, LB_FINDSTRING, -1, (LPARAM)"Item between 5 & 6");
|
|
||||||
sprintf(C, "LB_FINDSTRING returned #%u ", wRet);
|
|
||||||
TextOut(hDCMain, 25, 300, C, strlen(C));
|
|
||||||
wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);
|
|
||||||
sprintf(C, "LB_GETCURSEL returned #%u ", wRet);
|
|
||||||
TextOut(hDCMain, 25, 320, C, strlen(C));
|
|
||||||
break;
|
|
||||||
case 'U':
|
|
||||||
wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);
|
|
||||||
SendMessage(hWndLBox, LB_DELETESTRING, wRet, 0L);
|
|
||||||
SendMessage(hWndLBox, LB_SETCURSEL, wRet, 0L);
|
|
||||||
break;
|
|
||||||
case 'I':
|
|
||||||
SendMessage(hWndLBox, LB_RESETCONTENT, 0, 0L);
|
|
||||||
break;
|
|
||||||
case 'O':
|
|
||||||
C2[0] = '\0';
|
|
||||||
wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);
|
|
||||||
SendMessage(hWndLBox, LB_GETTEXT, wRet, (DWORD)C2);
|
|
||||||
sprintf(C, "LB_GETTEXT #%d returned '%s' ", wRet, C2);
|
|
||||||
TextOut(hDCMain, 25, 320, C, strlen(C));
|
|
||||||
break;
|
|
||||||
case 'P':
|
|
||||||
SendMessage(hWndLBox, LB_DIR, 0, (DWORD)"*.*");
|
|
||||||
break;
|
|
||||||
case 'Z':
|
|
||||||
ShowWindow(hWndScrol, SW_HIDE);
|
|
||||||
break;
|
|
||||||
case 'X':
|
|
||||||
ShowWindow(hWndScrol, SW_SHOW);
|
|
||||||
break;
|
|
||||||
case 'V':
|
|
||||||
MoveWindow(hWndScrol, 120, 150, 15, 60, TRUE);
|
|
||||||
break;
|
|
||||||
case 'B':
|
|
||||||
hWndCBox = CreateWindow("COMBOBOX", "Combo #2",
|
|
||||||
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | CBS_DROPDOWN,
|
|
||||||
30, 270, 150, 100, hWndMain, 1061, hInst, NULL);
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");
|
|
||||||
SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");
|
|
||||||
SendMessage(hWndCBox, CB_DIR, 0, (DWORD)"*.*");
|
|
||||||
break;
|
|
||||||
case 'N':
|
|
||||||
hWndLBox2 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE |
|
|
||||||
WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_NOTIFY,
|
|
||||||
// WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY,
|
|
||||||
30, 300, 150, 60, hWndMain, 1062, hInst, NULL);
|
|
||||||
SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #1");
|
|
||||||
SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #2");
|
|
||||||
SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #3");
|
|
||||||
SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #4");
|
|
||||||
SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #5");
|
|
||||||
SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #6");
|
|
||||||
break;
|
|
||||||
case 'M':
|
|
||||||
hWndLBox3 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE |
|
|
||||||
WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_NOTIFY,
|
|
||||||
// WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY,
|
|
||||||
230, 300, 150, 60, hWndMain, 1063, hInst, NULL);
|
|
||||||
SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #1");
|
|
||||||
SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #2");
|
|
||||||
SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #3");
|
|
||||||
SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #4");
|
|
||||||
SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #5");
|
|
||||||
SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #6");
|
|
||||||
SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #7");
|
|
||||||
SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 1, 10L);
|
|
||||||
SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 2, 20L);
|
|
||||||
SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 3, 30L);
|
|
||||||
SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 4, 40L);
|
|
||||||
SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 5, 50L);
|
|
||||||
break;
|
|
||||||
case 'L':
|
|
||||||
hBitMap = LoadBitmap(hInst, MAKEINTRESOURCE(3333));
|
|
||||||
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&BitMap);
|
|
||||||
hWndLBox4 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE |
|
|
||||||
WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY,
|
|
||||||
230, 380, 150, 60, hWndMain, 1064, hInst, NULL);
|
|
||||||
SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #1");
|
|
||||||
SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #2");
|
|
||||||
SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #3");
|
|
||||||
SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #4");
|
|
||||||
SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #5");
|
|
||||||
SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #6");
|
|
||||||
SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 1, 10L);
|
|
||||||
SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 2, 20L);
|
|
||||||
SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 3, 30L);
|
|
||||||
SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 4, 40L);
|
|
||||||
SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 5, 50L);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VK_F10: /* 'F10' FUNCTION KEY */
|
|
||||||
break;
|
|
||||||
case VK_F11: /* 'F11' FUNCTION KEY */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return(TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void DoPaint(HWND hWnd)
|
|
||||||
{
|
|
||||||
HDC hDC;
|
|
||||||
RECT rect;
|
|
||||||
PAINTSTRUCT ps;
|
|
||||||
char C[80];
|
|
||||||
GetClientRect(hWnd, &rect);
|
|
||||||
hDC = BeginPaint(hWnd, &ps);
|
|
||||||
FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH));
|
|
||||||
InflateRect(&rect, -3, -3);
|
|
||||||
FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
|
|
||||||
InflateRect(&rect, -10, -10);
|
|
||||||
FillRect(hDC, &rect, GetStockObject(WHITE_BRUSH));
|
|
||||||
sprintf(C, "Wine Testing !!!");
|
|
||||||
TextOut(hDC, 25, 25, C, strlen(C));
|
|
||||||
ReleaseDC(hWnd,hDC);
|
|
||||||
EndPaint(hWnd,&ps);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HBRUSH CreateLTGRAYBrush()
|
|
||||||
{
|
|
||||||
return(CreateSOLIDBrush(0x00C0C0C0));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
HBRUSH CreateSOLIDBrush(COLORREF Color)
|
|
||||||
{
|
|
||||||
LOGBRUSH logGRAYBrush;
|
|
||||||
logGRAYBrush.lbStyle = BS_SOLID;
|
|
||||||
logGRAYBrush.lbColor = Color;
|
|
||||||
logGRAYBrush.lbHatch = NULL;
|
|
||||||
return(CreateBrushIndirect(&logGRAYBrush));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
void SetVertScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)
|
|
||||||
{
|
|
||||||
char C[12];
|
|
||||||
SetScrollRange(hWndSCROLL, SB_CTL, -MAX, -MIN, FALSE);
|
|
||||||
SetScrollPos(hWndSCROLL, SB_CTL, -VAL, TRUE);
|
|
||||||
itoa(VAL, C, 10);
|
|
||||||
//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void SetHorzScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)
|
|
||||||
{
|
|
||||||
char C[12];
|
|
||||||
SetScrollRange(hWndSCROLL, SB_CTL, MAX, MIN, FALSE);
|
|
||||||
SetScrollPos(hWndSCROLL, SB_CTL, VAL, TRUE);
|
|
||||||
itoa(VAL, C, 10);
|
|
||||||
//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Do_Dlg_VertScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)
|
|
||||||
{
|
|
||||||
char C[12];
|
|
||||||
int VAL;
|
|
||||||
int VAL2;
|
|
||||||
int Step = 100;
|
|
||||||
if (MAX < 1000) Step = 10;
|
|
||||||
if (MAX < 100) Step = MAX / 10;
|
|
||||||
VAL = *(V);
|
|
||||||
VAL2 = VAL;
|
|
||||||
switch (wParam)
|
|
||||||
{
|
|
||||||
case SB_LINEUP:
|
|
||||||
VAL++;
|
|
||||||
break;
|
|
||||||
case SB_LINEDOWN:
|
|
||||||
VAL--;
|
|
||||||
break;
|
|
||||||
case SB_PAGEUP:
|
|
||||||
VAL += Step;
|
|
||||||
break;
|
|
||||||
case SB_PAGEDOWN:
|
|
||||||
VAL -= Step;
|
|
||||||
break;
|
|
||||||
case SB_THUMBTRACK:
|
|
||||||
case SB_THUMBPOSITION:
|
|
||||||
VAL = -(LOWORD(lParam));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (VAL > MAX) VAL = MAX;
|
|
||||||
if (VAL < MIN) VAL = MIN;
|
|
||||||
if (VAL != VAL2)
|
|
||||||
{
|
|
||||||
SetScrollPos(HIWORD(lParam), SB_CTL, -VAL, TRUE);
|
|
||||||
ltoa(VAL, C, 10);
|
|
||||||
// SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);
|
|
||||||
}
|
|
||||||
*(V) = VAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Do_Dlg_HorzScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)
|
|
||||||
{
|
|
||||||
char C[12];
|
|
||||||
int VAL;
|
|
||||||
int VAL2;
|
|
||||||
int Step = 100;
|
|
||||||
if (MAX < 1000) Step = 10;
|
|
||||||
if (MAX < 100) Step = MAX / 10;
|
|
||||||
VAL = *(V);
|
|
||||||
VAL2 = VAL;
|
|
||||||
switch (wParam)
|
|
||||||
{
|
|
||||||
case SB_LINEUP:
|
|
||||||
VAL--;
|
|
||||||
break;
|
|
||||||
case SB_LINEDOWN:
|
|
||||||
VAL++;
|
|
||||||
break;
|
|
||||||
case SB_PAGEUP:
|
|
||||||
VAL -= Step;
|
|
||||||
break;
|
|
||||||
case SB_PAGEDOWN:
|
|
||||||
VAL += Step;
|
|
||||||
break;
|
|
||||||
case SB_THUMBTRACK:
|
|
||||||
case SB_THUMBPOSITION:
|
|
||||||
VAL = (LOWORD(lParam));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (VAL > MAX) VAL = MAX;
|
|
||||||
if (VAL < MIN) VAL = MIN;
|
|
||||||
if (VAL != VAL2)
|
|
||||||
{
|
|
||||||
SetScrollPos(HIWORD(lParam), SB_CTL, VAL, TRUE);
|
|
||||||
ltoa(VAL, C, 10);
|
|
||||||
// SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);
|
|
||||||
}
|
|
||||||
*(V) = VAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
BIN
test/widget.exe
BIN
test/widget.exe
Binary file not shown.
|
@ -2,7 +2,7 @@ CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
|
||||||
|
|
||||||
OBJS=class.o dc.o dce.o event.o message.o win.o timer.o graphics.o \
|
OBJS=class.o dc.o dce.o event.o message.o win.o timer.o graphics.o \
|
||||||
clipping.o mapping.o painting.o keyboard.o utility.o syscolor.o \
|
clipping.o mapping.o painting.o keyboard.o utility.o syscolor.o \
|
||||||
defwnd.o defdlg.o dialog.o focus.o
|
defwnd.o defdlg.o dialog.o focus.o scroll.o
|
||||||
|
|
||||||
default: windows.o
|
default: windows.o
|
||||||
|
|
||||||
|
|
195
windows/dialog.c
195
windows/dialog.c
|
@ -6,10 +6,9 @@
|
||||||
|
|
||||||
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "dialog.h"
|
#include "dialog.h"
|
||||||
|
#include "prototypes.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,7 +28,7 @@ BOOL DIALOG_Init()
|
||||||
|
|
||||||
/* Calculate the dialog base units */
|
/* Calculate the dialog base units */
|
||||||
|
|
||||||
if (!(hdc = GetDC( 0 ))) return FALSE;
|
if (!(hdc = GetDC(GetDesktopWindow()))) return FALSE;
|
||||||
GetTextMetrics( hdc, &tm );
|
GetTextMetrics( hdc, &tm );
|
||||||
ReleaseDC( 0, hdc );
|
ReleaseDC( 0, hdc );
|
||||||
xBaseUnit = tm.tmAveCharWidth;
|
xBaseUnit = tm.tmAveCharWidth;
|
||||||
|
@ -79,15 +78,17 @@ static DLGCONTROLHEADER * DIALOG_GetControl( DLGCONTROLHEADER * ptr,
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DIALOG_ParseTemplate
|
* DIALOG_ParseTemplate
|
||||||
*
|
*
|
||||||
* Fill a DLGTEMPLATE structure from the dialog template.
|
* Fill a DLGTEMPLATE structure from the dialog template, and return
|
||||||
|
* a pointer to the first control.
|
||||||
*/
|
*/
|
||||||
static void DIALOG_ParseTemplate( LPCSTR template, DLGTEMPLATE * result )
|
static DLGCONTROLHEADER * DIALOG_ParseTemplate( LPCSTR template,
|
||||||
|
DLGTEMPLATE * result )
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
unsigned char * p = (unsigned char *)template;
|
unsigned char * p = (unsigned char *)template;
|
||||||
|
|
||||||
result->header = (DLGTEMPLATEHEADER *)p;
|
result->header = (DLGTEMPLATEHEADER *)p;
|
||||||
p += 13;
|
p += 13;
|
||||||
|
|
||||||
result->menuName = p;
|
result->menuName = p;
|
||||||
if (*p == 0xff) p += 3;
|
if (*p == 0xff) p += 3;
|
||||||
else p += strlen(p) + 1;
|
else p += strlen(p) + 1;
|
||||||
|
@ -104,18 +105,8 @@ static void DIALOG_ParseTemplate( LPCSTR template, DLGTEMPLATE * result )
|
||||||
result->pointSize = *(WORD *)p; p += sizeof(WORD);
|
result->pointSize = *(WORD *)p; p += sizeof(WORD);
|
||||||
result->faceName = p; p += strlen(p) + 1;
|
result->faceName = p; p += strlen(p) + 1;
|
||||||
}
|
}
|
||||||
result->controls = NULL;
|
|
||||||
if (!result->header->nbItems) return;
|
|
||||||
result->controls = (DLGCONTROL *) malloc( result->header->nbItems * sizeof(DLGCONTROL) );
|
|
||||||
if (!result->controls) return;
|
|
||||||
|
|
||||||
for (i = 0; i < result->header->nbItems; i++)
|
return (DLGCONTROLHEADER *)p;
|
||||||
{
|
|
||||||
result->controls[i].header = (DLGCONTROLHEADER *)p;
|
|
||||||
p = (char *)DIALOG_GetControl( result->controls[i].header,
|
|
||||||
&result->controls[i].class,
|
|
||||||
&result->controls[i].text );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -125,9 +116,6 @@ static void DIALOG_ParseTemplate( LPCSTR template, DLGTEMPLATE * result )
|
||||||
#ifdef DEBUG_DIALOG
|
#ifdef DEBUG_DIALOG
|
||||||
static void DIALOG_DisplayTemplate( DLGTEMPLATE * result )
|
static void DIALOG_DisplayTemplate( DLGTEMPLATE * result )
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
DLGCONTROL * ctrl = result->controls;
|
|
||||||
|
|
||||||
printf( "DIALOG %d, %d, %d, %d\n", result->header->x, result->header->y,
|
printf( "DIALOG %d, %d, %d, %d\n", result->header->x, result->header->y,
|
||||||
result->header->cx, result->header->cy );
|
result->header->cx, result->header->cy );
|
||||||
printf( " STYLE %08x\n", result->header->style );
|
printf( " STYLE %08x\n", result->header->style );
|
||||||
|
@ -138,18 +126,6 @@ static void DIALOG_DisplayTemplate( DLGTEMPLATE * result )
|
||||||
else printf( " MENU '%s'\n", result->menuName );
|
else printf( " MENU '%s'\n", result->menuName );
|
||||||
if (result->header->style & DS_SETFONT)
|
if (result->header->style & DS_SETFONT)
|
||||||
printf( " FONT %d,'%s'\n", result->pointSize, result->faceName );
|
printf( " FONT %d,'%s'\n", result->pointSize, result->faceName );
|
||||||
|
|
||||||
printf( " BEGIN\n" );
|
|
||||||
|
|
||||||
for (i = 0; i < result->header->nbItems; i++, ctrl++)
|
|
||||||
{
|
|
||||||
printf( " %s '%s' %d, %d, %d, %d, %d, %08x\n",
|
|
||||||
ctrl->class, ctrl->text, ctrl->header->id,
|
|
||||||
ctrl->header->x, ctrl->header->y, ctrl->header->cx,
|
|
||||||
ctrl->header->cy, ctrl->header->style );
|
|
||||||
}
|
|
||||||
|
|
||||||
printf( " END\n" );
|
|
||||||
}
|
}
|
||||||
#endif /* DEBUG_DIALOG */
|
#endif /* DEBUG_DIALOG */
|
||||||
|
|
||||||
|
@ -187,7 +163,7 @@ HWND CreateDialogParam( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
else hwnd = CreateDialogIndirectParam(hInst, data, owner, dlgProc, param);
|
else hwnd = CreateDialogIndirectParam(hInst, data, owner, dlgProc, param);
|
||||||
FreeResource( hmem );
|
FreeResource( hmem );
|
||||||
#else
|
#else
|
||||||
hmem = RSC_LoadResource( hInst, dlgTemplate, 0x8005, &size );
|
hmem = RSC_LoadResource( hInst, dlgTemplate, NE_RSCTYPE_DIALOG, &size );
|
||||||
data = (LPCSTR) GlobalLock( hmem );
|
data = (LPCSTR) GlobalLock( hmem );
|
||||||
hwnd = CreateDialogIndirectParam( hInst, data, owner, dlgProc, param );
|
hwnd = CreateDialogIndirectParam( hInst, data, owner, dlgProc, param );
|
||||||
GlobalFree( hmem );
|
GlobalFree( hmem );
|
||||||
|
@ -212,31 +188,39 @@ HWND CreateDialogIndirect( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate,
|
HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
HWND owner, FARPROC dlgProc, LPARAM param )
|
HWND owner, FARPROC dlgProc, LPARAM param )
|
||||||
{
|
{
|
||||||
HMENU hMenu = 0;
|
HMENU hMenu;
|
||||||
HFONT hFont = 0;
|
HFONT hFont = 0;
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
WND * wndPtr;
|
WND * wndPtr;
|
||||||
|
int i;
|
||||||
DLGTEMPLATE template;
|
DLGTEMPLATE template;
|
||||||
|
DLGCONTROLHEADER * header;
|
||||||
DIALOGINFO * dlgInfo;
|
DIALOGINFO * dlgInfo;
|
||||||
WORD xUnit = xBaseUnit;
|
WORD xUnit = xBaseUnit;
|
||||||
WORD yUnit = yBaseUnit;
|
WORD yUnit = yBaseUnit;
|
||||||
|
|
||||||
if (!dlgTemplate) return 0;
|
|
||||||
DIALOG_ParseTemplate( dlgTemplate, &template );
|
|
||||||
|
|
||||||
|
/* Parse dialog template */
|
||||||
|
|
||||||
|
if (!dlgTemplate) return 0;
|
||||||
|
header = DIALOG_ParseTemplate( dlgTemplate, &template );
|
||||||
#ifdef DEBUG_DIALOG
|
#ifdef DEBUG_DIALOG
|
||||||
DIALOG_DisplayTemplate( &template );
|
DIALOG_DisplayTemplate( &template );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Load menu */
|
/* Load menu */
|
||||||
|
|
||||||
if (template.menuName[0])
|
switch (template.menuName[0])
|
||||||
{
|
{
|
||||||
if (template.menuName[0] != 0xff)
|
case 0x00:
|
||||||
hMenu = LoadMenu( hInst, template.menuName );
|
hMenu = 0;
|
||||||
else
|
break;
|
||||||
hMenu = LoadMenu( hInst, MAKEINTRESOURCE( template.menuName[1] +
|
case 0xff:
|
||||||
|
hMenu = LoadMenu( hInst, MAKEINTRESOURCE( template.menuName[1] +
|
||||||
256*template.menuName[2] ));
|
256*template.menuName[2] ));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
hMenu = LoadMenu( hInst, template.menuName );
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create custom font if needed */
|
/* Create custom font if needed */
|
||||||
|
@ -252,7 +236,7 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
HFONT oldFont;
|
HFONT oldFont;
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
|
|
||||||
hdc = GetDC( 0 );
|
hdc = GetDC(GetDesktopWindow());
|
||||||
oldFont = SelectObject( hdc, hFont );
|
oldFont = SelectObject( hdc, hFont );
|
||||||
GetTextMetrics( hdc, &tm );
|
GetTextMetrics( hdc, &tm );
|
||||||
SelectObject( hdc, oldFont );
|
SelectObject( hdc, oldFont );
|
||||||
|
@ -261,11 +245,11 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
yUnit = tm.tmHeight;
|
yUnit = tm.tmHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create dialog main window */
|
/* Create dialog main window */
|
||||||
|
|
||||||
hwnd = CreateWindow( template.className, template.caption,
|
hwnd = CreateWindow( template.className, template.caption,
|
||||||
template.header->style & ~WS_VISIBLE,
|
template.header->style,
|
||||||
template.header->x * xUnit / 4,
|
template.header->x * xUnit / 4,
|
||||||
template.header->y * yUnit / 8,
|
template.header->y * yUnit / 8,
|
||||||
template.header->cx * xUnit / 4,
|
template.header->cx * xUnit / 4,
|
||||||
|
@ -276,27 +260,42 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
{
|
{
|
||||||
if (hFont) DeleteObject( hFont );
|
if (hFont) DeleteObject( hFont );
|
||||||
if (hMenu) DestroyMenu( hMenu );
|
if (hMenu) DestroyMenu( hMenu );
|
||||||
if (template.controls) free( template.controls );
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create control windows */
|
/* Create control windows */
|
||||||
|
|
||||||
if (hwnd && template.header->nbItems)
|
#ifdef DEBUG_DIALOG
|
||||||
|
printf( " BEGIN\n" );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (i = 0; i < template.header->nbItems; i++)
|
||||||
{
|
{
|
||||||
int i;
|
DLGCONTROLHEADER * next_header;
|
||||||
DLGCONTROL * ctrl = template.controls;
|
LPSTR class, text;
|
||||||
for (i = 0; i < template.header->nbItems; i++, ctrl++)
|
next_header = DIALOG_GetControl( header, &class, &text );
|
||||||
{
|
|
||||||
CreateWindowEx( WS_EX_NOPARENTNOTIFY,
|
#ifdef DEBUG_DIALOG
|
||||||
ctrl->class, ctrl->text, ctrl->header->style,
|
printf( " %s '%s' %d, %d, %d, %d, %d, %08x\n",
|
||||||
ctrl->header->x * xUnit / 4,
|
class, text, header->id, header->x, header->y, header->cx,
|
||||||
ctrl->header->y * yUnit / 8,
|
header->cy, header->style );
|
||||||
ctrl->header->cx * xUnit / 4,
|
#endif
|
||||||
ctrl->header->cy * yUnit / 8,
|
if ((strcmp(class, "STATIC") == 0) & ((header->style & SS_ICON) == SS_ICON)) {
|
||||||
hwnd, ctrl->header->id, hInst, NULL );
|
header->cx = 32;
|
||||||
}
|
header->cy = 32;
|
||||||
}
|
}
|
||||||
|
header->style |= WS_CHILD;
|
||||||
|
CreateWindowEx( WS_EX_NOPARENTNOTIFY,
|
||||||
|
class, text, header->style,
|
||||||
|
header->x * xUnit / 4, header->y * yUnit / 8,
|
||||||
|
header->cx * xUnit / 4, header->cy * yUnit / 8,
|
||||||
|
hwnd, header->id, hInst, NULL );
|
||||||
|
header = next_header;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_DIALOG
|
||||||
|
printf( " END\n" );
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialise dialog extra data */
|
/* Initialise dialog extra data */
|
||||||
|
|
||||||
|
@ -318,35 +317,24 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
if (SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param ))
|
if (SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param ))
|
||||||
SetFocus( dlgInfo->hwndFocus );
|
SetFocus( dlgInfo->hwndFocus );
|
||||||
|
|
||||||
/* Display dialog */
|
|
||||||
|
|
||||||
if (template.header->style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
|
|
||||||
|
|
||||||
if (template.controls) free( template.controls );
|
|
||||||
return hwnd;
|
return hwnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DialogBox (USER.87)
|
* DIALOG_DoDialogBox
|
||||||
*/
|
*/
|
||||||
int DialogBox( HINSTANCE hInst, LPCSTR dlgTemplate,
|
static int DIALOG_DoDialogBox( HWND hwnd )
|
||||||
HWND owner, FARPROC dlgProc )
|
|
||||||
{
|
{
|
||||||
HWND hwnd;
|
|
||||||
WND * wndPtr;
|
WND * wndPtr;
|
||||||
DIALOGINFO * dlgInfo;
|
DIALOGINFO * dlgInfo;
|
||||||
MSG msg;
|
MSG msg;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
#ifdef DEBUG_DIALOG
|
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return -1;
|
||||||
printf( "DialogBox: %d,'%s',%d,%p\n", hInst, dlgTemplate, owner, dlgProc );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
hwnd = CreateDialog( hInst, dlgTemplate, owner, dlgProc );
|
|
||||||
if (!hwnd) return -1;
|
|
||||||
wndPtr = WIN_FindWndPtr( hwnd );
|
|
||||||
dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
|
dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
|
||||||
|
ShowWindow( hwnd, SW_SHOW );
|
||||||
|
|
||||||
while (GetMessage (&msg, 0, 0, 0))
|
while (GetMessage (&msg, 0, 0, 0))
|
||||||
{
|
{
|
||||||
if (!IsDialogMessage( hwnd, &msg))
|
if (!IsDialogMessage( hwnd, &msg))
|
||||||
|
@ -362,6 +350,61 @@ int DialogBox( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DialogBox (USER.87)
|
||||||
|
*/
|
||||||
|
int DialogBox( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
|
HWND owner, FARPROC dlgProc )
|
||||||
|
{
|
||||||
|
return DialogBoxParam( hInst, dlgTemplate, owner, dlgProc, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DialogBoxParam (USER.239)
|
||||||
|
*/
|
||||||
|
int DialogBoxParam( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
|
HWND owner, FARPROC dlgProc, LPARAM param )
|
||||||
|
{
|
||||||
|
HWND hwnd;
|
||||||
|
|
||||||
|
#ifdef DEBUG_DIALOG
|
||||||
|
printf( "DialogBoxParam: %d,'%s',%d,%p,%d\n",
|
||||||
|
hInst, dlgTemplate, owner, dlgProc, param );
|
||||||
|
#endif
|
||||||
|
hwnd = CreateDialogParam( hInst, dlgTemplate, owner, dlgProc, param );
|
||||||
|
if (hwnd) return DIALOG_DoDialogBox( hwnd );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DialogBoxIndirect (USER.218)
|
||||||
|
*/
|
||||||
|
int DialogBoxIndirect( HINSTANCE hInst, HANDLE dlgTemplate,
|
||||||
|
HWND owner, FARPROC dlgProc )
|
||||||
|
{
|
||||||
|
return DialogBoxIndirectParam( hInst, dlgTemplate, owner, dlgProc, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DialogBoxIndirectParam (USER.240)
|
||||||
|
*/
|
||||||
|
int DialogBoxIndirectParam( HINSTANCE hInst, HANDLE dlgTemplate,
|
||||||
|
HWND owner, FARPROC dlgProc, LPARAM param )
|
||||||
|
{
|
||||||
|
HWND hwnd;
|
||||||
|
LPCSTR ptr;
|
||||||
|
|
||||||
|
if (!(ptr = GlobalLock( dlgTemplate ))) return -1;
|
||||||
|
hwnd = CreateDialogIndirectParam( hInst, ptr, owner, dlgProc, param );
|
||||||
|
GlobalUnlock( dlgTemplate );
|
||||||
|
if (hwnd) return DIALOG_DoDialogBox( hwnd );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* EndDialog (USER.88)
|
* EndDialog (USER.88)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -16,8 +16,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
|
|
||||||
#define NB_BUTTONS 3 /* Windows can handle 3 buttons */
|
#define NB_BUTTONS 3 /* Windows can handle 3 buttons */
|
||||||
#define DBLCLICK_TIME 300 /* Max. time for a double click (milliseconds) */
|
static WORD dblclick_time = 300; /* Max. time for a double click (milliseconds) */
|
||||||
|
|
||||||
|
|
||||||
/* Event handlers */
|
/* Event handlers */
|
||||||
static void EVENT_expose();
|
static void EVENT_expose();
|
||||||
|
@ -191,7 +190,7 @@ static void EVENT_mouse_button( Widget w, int hwnd, XButtonEvent *event,
|
||||||
{ /* Check if double-click */
|
{ /* Check if double-click */
|
||||||
prevTime = lastClickTime[buttonNum];
|
prevTime = lastClickTime[buttonNum];
|
||||||
lastClickTime[buttonNum] = event->time;
|
lastClickTime[buttonNum] = event->time;
|
||||||
if (event->time - prevTime < DBLCLICK_TIME)
|
if (event->time - prevTime < dblclick_time)
|
||||||
{
|
{
|
||||||
WND * wndPtr;
|
WND * wndPtr;
|
||||||
CLASS * classPtr;
|
CLASS * classPtr;
|
||||||
|
@ -329,3 +328,24 @@ void ReleaseCapture()
|
||||||
|
|
||||||
captureWnd = 0;
|
captureWnd = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* SetDoubleClickTime (USER.20)
|
||||||
|
*/
|
||||||
|
void SetDoubleClickTime (WORD interval)
|
||||||
|
{
|
||||||
|
if (interval == 0)
|
||||||
|
dblclick_time = 500;
|
||||||
|
else
|
||||||
|
dblclick_time = interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* GetDoubleClickTime (USER.21)
|
||||||
|
*/
|
||||||
|
WORD GetDoubleClickTime ()
|
||||||
|
{
|
||||||
|
return ((WORD)dblclick_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,171 @@
|
||||||
|
/*
|
||||||
|
* Scroll windows and DCs
|
||||||
|
*
|
||||||
|
* Copyright David W. Metcalfe, 1993
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char Copyright[] = "Copyright David W. Metcalfe, 1993";
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "windows.h"
|
||||||
|
#include "gdi.h"
|
||||||
|
|
||||||
|
static int RgnType;
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* ScrollWindow (USER.61)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect)
|
||||||
|
{
|
||||||
|
HDC hdc;
|
||||||
|
HRGN hrgnUpdate;
|
||||||
|
RECT rc, cliprc;
|
||||||
|
|
||||||
|
#ifdef DEBUG_SCROLL
|
||||||
|
printf("ScrollWindow: dx=%d, dy=%d, rect=%d,%d,%d,%d\n", dx, dy,
|
||||||
|
rect->left, rect->top, rect->right, rect->bottom);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
hdc = GetDC(hwnd);
|
||||||
|
|
||||||
|
if (rect == NULL)
|
||||||
|
GetWindowRect(hwnd, &rc);
|
||||||
|
else
|
||||||
|
CopyRect(&rc, rect);
|
||||||
|
if (clipRect == NULL)
|
||||||
|
GetWindowRect(hwnd, &cliprc);
|
||||||
|
else
|
||||||
|
CopyRect(&cliprc, clipRect);
|
||||||
|
|
||||||
|
hrgnUpdate = CreateRectRgn(0, 0, 0, 0);
|
||||||
|
ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, NULL);
|
||||||
|
InvalidateRgn(hwnd, hrgnUpdate, TRUE);
|
||||||
|
ReleaseDC(hwnd, hdc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* ScrollDC (USER.221)
|
||||||
|
*/
|
||||||
|
|
||||||
|
BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT rc, LPRECT cliprc,
|
||||||
|
HRGN hrgnUpdate, LPRECT rcUpdate)
|
||||||
|
{
|
||||||
|
HRGN hrgnClip, hrgn1, hrgn2;
|
||||||
|
POINT src, dest;
|
||||||
|
short width, height;
|
||||||
|
DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
|
||||||
|
|
||||||
|
#ifdef DEBUG_SCROLL
|
||||||
|
printf("ScrollDC: dx=%d, dy=%d, rc=%d,%d,%d,%d\n", dx, dy,
|
||||||
|
rc->left, rc->top, rc->right, rc->bottom);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (rc == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (cliprc)
|
||||||
|
{
|
||||||
|
hrgnClip = CreateRectRgnIndirect(cliprc);
|
||||||
|
SelectClipRgn(hdc, hrgnClip);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dx > 0)
|
||||||
|
{
|
||||||
|
src.x = XDPTOLP(dc, rc->left);
|
||||||
|
dest.x = XDPTOLP(dc, rc->left + abs(dx));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src.x = XDPTOLP(dc, rc->left + abs(dx));
|
||||||
|
dest.x = XDPTOLP(dc, rc->left);
|
||||||
|
}
|
||||||
|
if (dy > 0)
|
||||||
|
{
|
||||||
|
src.y = YDPTOLP(dc, rc->top);
|
||||||
|
dest.y = YDPTOLP(dc, rc->top + abs(dy));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src.y = YDPTOLP(dc, rc->top + abs(dy));
|
||||||
|
dest.y = YDPTOLP(dc, rc->top);
|
||||||
|
}
|
||||||
|
|
||||||
|
width = rc->right - rc->left - abs(dx);
|
||||||
|
height = rc->bottom - rc->top - abs(dy);
|
||||||
|
|
||||||
|
if (!BitBlt(hdc, dest.x, dest.y, width, height, hdc, src.x, src.y,
|
||||||
|
SRCCOPY))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (hrgnUpdate)
|
||||||
|
{
|
||||||
|
if (dx > 0)
|
||||||
|
hrgn1 = CreateRectRgn(rc->left, rc->top, rc->left+dx, rc->bottom);
|
||||||
|
else if (dx < 0)
|
||||||
|
hrgn1 = CreateRectRgn(rc->right+dx, rc->top, rc->right,
|
||||||
|
rc->bottom);
|
||||||
|
else
|
||||||
|
hrgn1 = CreateRectRgn(0, 0, 0, 0);
|
||||||
|
|
||||||
|
if (dy > 0)
|
||||||
|
hrgn2 = CreateRectRgn(rc->left, rc->top, rc->right, rc->top+dy);
|
||||||
|
else if (dy < 0)
|
||||||
|
hrgn2 = CreateRectRgn(rc->left, rc->bottom+dy, rc->right,
|
||||||
|
rc->bottom);
|
||||||
|
else
|
||||||
|
hrgn2 = CreateRectRgn(0, 0, 0, 0);
|
||||||
|
|
||||||
|
RgnType = CombineRgn(hrgnUpdate, hrgn1, hrgn2, RGN_OR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rcUpdate)
|
||||||
|
{
|
||||||
|
SelectClipRgn(hdc, hrgnUpdate);
|
||||||
|
GetClipBox(hdc, rcUpdate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* ScrollWindowEx (USER.319)
|
||||||
|
*/
|
||||||
|
|
||||||
|
int ScrollWindowEx(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect,
|
||||||
|
HRGN hrgnUpdate, LPRECT rcUpdate, WORD flags)
|
||||||
|
{
|
||||||
|
HDC hdc;
|
||||||
|
RECT rc, cliprc;
|
||||||
|
|
||||||
|
#ifdef DEBUG_SCROLL
|
||||||
|
printf("ScrollWindowEx: dx=%d, dy=%d, rect=%d,%d,%d,%d\n", dx, dy,
|
||||||
|
rect->left, rect->top, rect->right, rect->bottom);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
hdc = GetDC(hwnd);
|
||||||
|
|
||||||
|
if (rect == NULL)
|
||||||
|
GetWindowRect(hwnd, &rc);
|
||||||
|
else
|
||||||
|
CopyRect(&rc, rect);
|
||||||
|
if (clipRect == NULL)
|
||||||
|
GetWindowRect(hwnd, &cliprc);
|
||||||
|
else
|
||||||
|
CopyRect(&cliprc, clipRect);
|
||||||
|
|
||||||
|
ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate);
|
||||||
|
|
||||||
|
if (flags | SW_INVALIDATE)
|
||||||
|
{
|
||||||
|
InvalidateRgn(hwnd, hrgnUpdate, FALSE);
|
||||||
|
|
||||||
|
if (flags | SW_ERASE)
|
||||||
|
SendMessage(hwnd, WM_ERASEBKGND, (WORD)hdc, (LONG)NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReleaseDC(hwnd, hdc);
|
||||||
|
return RgnType;
|
||||||
|
}
|
147
windows/win.c
147
windows/win.c
|
@ -52,9 +52,11 @@ HWND WIN_FindWinToRepaint( HWND hwnd )
|
||||||
WND * wndPtr;
|
WND * wndPtr;
|
||||||
|
|
||||||
if (!hwnd) hwnd = firstWindow;
|
if (!hwnd) hwnd = firstWindow;
|
||||||
while (hwnd)
|
for ( ; hwnd != 0; hwnd = wndPtr->hwndNext )
|
||||||
{
|
{
|
||||||
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
|
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
|
||||||
|
if (!wndPtr || !wndPtr->winWidget) continue;
|
||||||
|
if (!XtIsRealized( wndPtr->winWidget )) continue;
|
||||||
if (wndPtr->hrgnUpdate) return hwnd;
|
if (wndPtr->hrgnUpdate) return hwnd;
|
||||||
if (wndPtr->hwndChild)
|
if (wndPtr->hwndChild)
|
||||||
{
|
{
|
||||||
|
@ -62,7 +64,6 @@ HWND WIN_FindWinToRepaint( HWND hwnd )
|
||||||
if ((child = WIN_FindWinToRepaint( wndPtr->hwndChild )))
|
if ((child = WIN_FindWinToRepaint( wndPtr->hwndChild )))
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
hwnd = wndPtr->hwndNext;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -122,8 +123,8 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
|
||||||
if (y == CW_USEDEFAULT) y = 0;
|
if (y == CW_USEDEFAULT) y = 0;
|
||||||
if (width == CW_USEDEFAULT) width = 600;
|
if (width == CW_USEDEFAULT) width = 600;
|
||||||
if (height == CW_USEDEFAULT) height = 400;
|
if (height == CW_USEDEFAULT) height = 400;
|
||||||
if (!width) width = 1;
|
if (width == 0) width = 1;
|
||||||
if (!height) height = 1;
|
if (height == 0) height = 1;
|
||||||
|
|
||||||
/* Find the parent and class */
|
/* Find the parent and class */
|
||||||
|
|
||||||
|
@ -135,9 +136,10 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
|
||||||
}
|
}
|
||||||
else if (style & WS_CHILD) return 0; /* WS_CHILD needs a parent */
|
else if (style & WS_CHILD) return 0; /* WS_CHILD needs a parent */
|
||||||
|
|
||||||
if (!(class = CLASS_FindClassByName( className, &classPtr )))
|
if (!(class = CLASS_FindClassByName( className, &classPtr ))) {
|
||||||
|
printf("CreateWindow BAD CLASSNAME '%s' !\n", className);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
/* Create the window structure */
|
/* Create the window structure */
|
||||||
|
|
||||||
hwnd = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(WND)+classPtr->wc.cbWndExtra);
|
hwnd = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(WND)+classPtr->wc.cbWndExtra);
|
||||||
|
@ -250,6 +252,8 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
|
||||||
formWidgetClass,
|
formWidgetClass,
|
||||||
wndPtr->shellWidget,
|
wndPtr->shellWidget,
|
||||||
NULL );
|
NULL );
|
||||||
|
/* wndPtr->winWidget = wndPtr->compositeWidget; */
|
||||||
|
wndPtr->winWidget = wndPtr->shellWidget;
|
||||||
if (wndPtr->wIDmenu == 0)
|
if (wndPtr->wIDmenu == 0)
|
||||||
{
|
{
|
||||||
wndPtr->menuBarPtr =
|
wndPtr->menuBarPtr =
|
||||||
|
@ -322,8 +326,13 @@ WinCreated:
|
||||||
if (wmcreate == -1)
|
if (wmcreate == -1)
|
||||||
{
|
{
|
||||||
/* Abort window creation */
|
/* Abort window creation */
|
||||||
|
|
||||||
|
if (parent) parentPtr->hwndChild = wndPtr->hwndNext;
|
||||||
|
else firstWindow = wndPtr->hwndNext;
|
||||||
if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
|
if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
|
||||||
else XtDestroyWidget( wndPtr->winWidget );
|
else XtDestroyWidget( wndPtr->winWidget );
|
||||||
|
if (wndPtr->hdc) DeleteDC( wndPtr->hdc );
|
||||||
|
classPtr->cWindows--;
|
||||||
USER_HEAP_FREE( hwnd );
|
USER_HEAP_FREE( hwnd );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -446,28 +455,32 @@ BOOL ShowWindow( HWND hwnd, int cmd )
|
||||||
XtNwidth, &width,
|
XtNwidth, &width,
|
||||||
XtNheight, &height,
|
XtNheight, &height,
|
||||||
NULL );
|
NULL );
|
||||||
SendMessage( hwnd, WM_SIZE, SIZE_RESTORED,
|
|
||||||
(width & 0xffff) | (height << 16) );
|
|
||||||
SendMessage( hwnd, WM_SHOWWINDOW, TRUE, 0 );
|
|
||||||
/*
|
|
||||||
printf("ShowWindow(%X, %X); !\n", hwnd, cmd);
|
|
||||||
*/
|
|
||||||
switch(cmd)
|
switch(cmd)
|
||||||
{
|
{
|
||||||
case SW_HIDE:
|
case SW_HIDE:
|
||||||
XtSetMappedWhenManaged(wndPtr->winWidget, FALSE);
|
XtSetMappedWhenManaged(wndPtr->winWidget, FALSE);
|
||||||
|
wndPtr->dwStyle &= (WS_VISIBLE ^ 0xFFFFFFFL);
|
||||||
|
SendMessage( hwnd, WM_SHOWWINDOW, FALSE, 0 );
|
||||||
break;
|
break;
|
||||||
case SW_SHOWNA:
|
|
||||||
case SW_SHOWMINNOACTIVE:
|
case SW_SHOWMINNOACTIVE:
|
||||||
case SW_SHOWNOACTIVATE:
|
case SW_SHOWMINIMIZED:
|
||||||
case SW_MINIMIZE:
|
case SW_MINIMIZE:
|
||||||
|
wndPtr->dwStyle |= WS_ICONIC;
|
||||||
|
goto WINVisible;
|
||||||
|
case SW_SHOWNA:
|
||||||
|
case SW_SHOWNOACTIVATE:
|
||||||
case SW_MAXIMIZE:
|
case SW_MAXIMIZE:
|
||||||
case SW_SHOWMAXIMIZED:
|
case SW_SHOWMAXIMIZED:
|
||||||
case SW_SHOWMINIMIZED:
|
|
||||||
case SW_SHOW:
|
case SW_SHOW:
|
||||||
case SW_NORMAL:
|
case SW_NORMAL:
|
||||||
case SW_SHOWNORMAL:
|
case SW_SHOWNORMAL:
|
||||||
|
wndPtr->dwStyle &= (WS_ICONIC ^ 0xFFFFFFFL);
|
||||||
|
WINVisible:
|
||||||
XtSetMappedWhenManaged(wndPtr->winWidget, TRUE);
|
XtSetMappedWhenManaged(wndPtr->winWidget, TRUE);
|
||||||
|
wndPtr->dwStyle |= WS_VISIBLE;
|
||||||
|
SendMessage( hwnd, WM_SIZE, SIZE_RESTORED,
|
||||||
|
(width & 0xffff) | (height << 16) );
|
||||||
|
SendMessage( hwnd, WM_SHOWWINDOW, TRUE, 0 );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -477,6 +490,42 @@ BOOL ShowWindow( HWND hwnd, int cmd )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* CloseWindow (USER.43)
|
||||||
|
*/
|
||||||
|
void CloseWindow(HWND hWnd)
|
||||||
|
{
|
||||||
|
WND * wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
if (wndPtr->dwStyle & WS_CHILD) return;
|
||||||
|
ShowWindow(hWnd, SW_MINIMIZE);
|
||||||
|
PostMessage(hWnd, WM_CLOSE, 0, 0L);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* OpenIcon (USER.44)
|
||||||
|
*/
|
||||||
|
BOOL OpenIcon(HWND hWnd)
|
||||||
|
{
|
||||||
|
WND * wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
if (!IsIconic(hWnd)) return FALSE;
|
||||||
|
ShowWindow(hWnd, SW_SHOWNORMAL);
|
||||||
|
return(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* FindWindow (USER.50)
|
||||||
|
*/
|
||||||
|
HWND FindWindow(LPSTR ClassMatch, LPSTR TitleMatch)
|
||||||
|
{
|
||||||
|
return((HWND)NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* MoveWindow (USER.56)
|
* MoveWindow (USER.56)
|
||||||
*/
|
*/
|
||||||
|
@ -508,7 +557,9 @@ void MoveWindow(HWND hWnd, short x, short y, short w, short h, BOOL bRepaint)
|
||||||
void UpdateWindow( HWND hwnd )
|
void UpdateWindow( HWND hwnd )
|
||||||
{
|
{
|
||||||
if (GetUpdateRect( hwnd, NULL, FALSE ))
|
if (GetUpdateRect( hwnd, NULL, FALSE ))
|
||||||
SendMessage( hwnd, WM_PAINT, 0, 0 );
|
{
|
||||||
|
if (IsWindowVisible( hwnd )) SendMessage( hwnd, WM_PAINT, 0, 0 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
@ -578,17 +629,17 @@ void SetWindowPos(HWND hWnd, HWND hWndInsertAfter, short x, short y, short w, sh
|
||||||
WND * wndPtr = WIN_FindWndPtr( hWnd );
|
WND * wndPtr = WIN_FindWndPtr( hWnd );
|
||||||
if (wndPtr)
|
if (wndPtr)
|
||||||
{
|
{
|
||||||
if ((wFlag & SWP_NOMOVE) == 0) {
|
if ((wFlag & SWP_NOMOVE) != SWP_NOMOVE) {
|
||||||
wndPtr->rectClient.left = x;
|
wndPtr->rectClient.left = x;
|
||||||
wndPtr->rectClient.top = y;
|
wndPtr->rectClient.top = y;
|
||||||
XtVaSetValues(wndPtr->winWidget, XtNx, x, XtNy, y, NULL );
|
XtVaSetValues(wndPtr->winWidget, XtNx, x, XtNy, y, NULL );
|
||||||
}
|
}
|
||||||
if ((wFlag & SWP_NOSIZE) == 0) {
|
if ((wFlag & SWP_NOSIZE) != SWP_NOSIZE) {
|
||||||
wndPtr->rectClient.right = x + w;
|
wndPtr->rectClient.right = x + w;
|
||||||
wndPtr->rectClient.bottom = y + h;
|
wndPtr->rectClient.bottom = y + h;
|
||||||
XtVaSetValues(wndPtr->winWidget, XtNwidth, w, XtNheight, h, NULL );
|
XtVaSetValues(wndPtr->winWidget, XtNwidth, w, XtNheight, h, NULL );
|
||||||
}
|
}
|
||||||
if ((wFlag & SWP_NOREDRAW) == 0) {
|
if ((wFlag & SWP_NOREDRAW) != SWP_NOREDRAW) {
|
||||||
InvalidateRect(hWnd, NULL, TRUE);
|
InvalidateRect(hWnd, NULL, TRUE);
|
||||||
UpdateWindow(hWnd);
|
UpdateWindow(hWnd);
|
||||||
}
|
}
|
||||||
|
@ -597,8 +648,10 @@ void SetWindowPos(HWND hWnd, HWND hWndInsertAfter, short x, short y, short w, sh
|
||||||
if ((wFlag & SWP_SHOWWINDOW) == SWP_SHOWWINDOW)
|
if ((wFlag & SWP_SHOWWINDOW) == SWP_SHOWWINDOW)
|
||||||
ShowWindow(hWnd, SW_SHOW);
|
ShowWindow(hWnd, SW_SHOW);
|
||||||
/*
|
/*
|
||||||
if ((wFlag & SWP_NOACTIVATE) == 0)
|
if ((wFlag & SWP_NOACTIVATE) != SWP_NOACTIVATE)
|
||||||
SetActiveWindow(hWnd);
|
SetActiveWindow(hWnd);
|
||||||
|
if ((wFlag & SWP_NOZORDER) != SWP_NOZORDER)
|
||||||
|
{ }
|
||||||
*/
|
*/
|
||||||
printf("SetWindowPos(%X, %X, %d, %d, %d, %d, %X); !\n",
|
printf("SetWindowPos(%X, %X, %d, %d, %d, %d, %X); !\n",
|
||||||
hWnd, hWndInsertAfter, x, y, w, h, wFlag);
|
hWnd, hWndInsertAfter, x, y, w, h, wFlag);
|
||||||
|
@ -695,16 +748,21 @@ LONG SetWindowLong( HWND hwnd, short offset, LONG newval )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************
|
/***********************************************************************
|
||||||
* GetParent (USER.46)
|
* IsIconic (USER.31)
|
||||||
*/
|
*/
|
||||||
HWND GetParent(HWND hwnd)
|
BOOL IsIconic(HWND hWnd)
|
||||||
{
|
{
|
||||||
WND *wndPtr = WIN_FindWndPtr(hwnd);
|
WND * wndPtr;
|
||||||
return wndPtr->hwndParent;
|
if (hWnd == 0) return(FALSE);
|
||||||
|
wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
if (wndPtr == 0) return(FALSE);
|
||||||
|
if (wndPtr->dwStyle & WS_ICONIC) return(TRUE);
|
||||||
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* GetWindowText (USER.36)
|
* GetWindowText (USER.36)
|
||||||
*/
|
*/
|
||||||
|
@ -732,6 +790,26 @@ int GetWindowTextLength(HWND hwnd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
* IsWindow (USER.47)
|
||||||
|
*/
|
||||||
|
BOOL IsWindow( HWND hwnd )
|
||||||
|
{
|
||||||
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
|
return (wndPtr->dwMagic == WND_MAGIC);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* GetParent (USER.46)
|
||||||
|
*/
|
||||||
|
HWND GetParent(HWND hwnd)
|
||||||
|
{
|
||||||
|
WND *wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
return wndPtr->hwndParent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* IsChild (USER.48)
|
* IsChild (USER.48)
|
||||||
*/
|
*/
|
||||||
|
@ -755,6 +833,23 @@ BOOL IsChild( HWND parent, HWND child )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* IsWindowVisible (USER.49)
|
||||||
|
*/
|
||||||
|
BOOL IsWindowVisible(HWND hWnd)
|
||||||
|
{
|
||||||
|
WND * wndPtr;
|
||||||
|
if (hWnd == 0) return(FALSE);
|
||||||
|
wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
if (wndPtr == 0) return(FALSE);
|
||||||
|
if (wndPtr->dwStyle & WS_VISIBLE) {
|
||||||
|
if (XtIsRealized(wndPtr->winWidget)) return(TRUE);
|
||||||
|
}
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* GetTopWindow (USER.229)
|
* GetTopWindow (USER.229)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue