Release 0.6
Tue Jan 4 13:01:33 1994 David Metcalfe <david@prism.demon.co.uk>
* [window/caret.c]
Modified code to use system timer.
Jan 9, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [windows/win.c]
Windows create if required new XLIB MenuBar & CaptionBar.
* [windows/defwnd.c]
WM_CALCSIZE Move & Resize caption, menubar & scrollbars.
(I'm not sure it's the good place for it, but it work...)
* [loader/resource.c]
optimize in FindResourceByNumber, make lseek() if next type ...
* [controls/scroll.c]
scrollbar buttons are now using system resources bitmaps.
* [controls/caption.c] - new file ...
captionbar showing title, close button with SysMenu,
and other buttons using system resources bitmaps.
* [controls/menu.c]
New functions: SetMenuItemBitmaps() with 'glues',
Make new version of LoadMenu() & ParseMenu(),
( put #define USE_POPUPMENU ).
Implementation of MenuBar functions.
* [sysres.dll]
New bitmaps for system such OBM_CLOSE, OBM_MINIMIZE, OBM_UPARROWI.
New SYSMENU menu, it don't work yet ! :-((
Tue Jan 11 05:27:45 1994 julliard@di.epfl.ch (Alexandre Julliard
* [memory/atom.c]
Fixed a bug that could cause atoms to be case-sensitive.
* [misc/rect.c]
Bug fix in SubtractRect().
* [objects/clipping.c]
Bug fix when setting the clip mask to an empty region.
* [windows/dce.c]
Bug fix in ReleaseDC().
* [windows/dialog.c]
Call AdjustWindowRectEx() before creating the dialog window.
Added support for DS_MODALFRAME style.
* [windows/event.c]
Cleaned up event handling and removed old Xt stuff.
Moved double-click handling to windows/message.c
* [windows/focus.c]
Bug fix: only set the X focus when the window is viewable.
* [windows/graphics.c]
Rewritten DrawReliefRect() to use brush instead of pen, and
to use the system colors.
* [windows/message.c]
Implemented WM_NCHITTEST message sending, and non-client
mouse messages.
Cleaned up double-click handling, and removed the Xt code.
* [windows/nonclient.c] (New file)
Implemented AdjustWindowRect().
Implemented WM_NCCALCSIZE, WM_NCHITTEST and WM_NCPAINT handling.
* [windows/painting.c]
Added sending of the WM_NCPAINT message in BeginPaint().
* [windows/sysmetrics.c] [include/sysmetrics.h] (New files)
Implemented system metrics.
* [windows/win.c]
Bug fix in setting the parent and owner in CreateWindow().
Removed the Xt code.
* [windows/winpos.c]
Added sending of the WM_NCPAINT message in SetWindowPos().
Removed the Xt code.
diff --git a/controls/scroll.c b/controls/scroll.c
index 9cfa550..439be8d 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -21,6 +21,15 @@
#include <dirent.h>
#include <sys/stat.h>
+HBITMAP hUpArrow = 0;
+HBITMAP hDnArrow = 0;
+HBITMAP hLfArrow = 0;
+HBITMAP hRgArrow = 0;
+HBITMAP hUpArrowD = 0;
+HBITMAP hDnArrowD = 0;
+HBITMAP hLfArrowD = 0;
+HBITMAP hRgArrowD = 0;
+
LPHEADSCROLL ScrollBarGetWindowAndStorage(HWND hwnd, WND **wndPtr);
LPHEADSCROLL ScrollBarGetStorageHeader(HWND hwnd);
void StdDrawScrollBar(HWND hwnd);
@@ -34,9 +43,13 @@
{
WORD wRet;
short x, y;
+ short width, height;
WND *wndPtr;
LPHEADSCROLL lphs;
- RECT rect;
+ LPDRAWITEMSTRUCT lpdis;
+ HDC hMemDC;
+ BITMAP bm;
+ RECT rect;
static RECT rectsel;
switch(message)
{
@@ -45,6 +58,22 @@
#ifdef DEBUG_SCROLL
printf("ScrollBar Creation up=%X down=%X!\n", lphs->hWndUp, lphs->hWndDown);
#endif
+ if (hUpArrow == (HBITMAP)NULL)
+ hUpArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWI));
+ if (hDnArrow == (HBITMAP)NULL)
+ hDnArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWI));
+ if (hLfArrow == (HBITMAP)NULL)
+ hLfArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWI));
+ if (hRgArrow == (HBITMAP)NULL)
+ hRgArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWI));
+ if (hUpArrowD == (HBITMAP)NULL)
+ hUpArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWD));
+ if (hDnArrowD == (HBITMAP)NULL)
+ hDnArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWD));
+ if (hLfArrowD == (HBITMAP)NULL)
+ hLfArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWD));
+ if (hRgArrowD == (HBITMAP)NULL)
+ hRgArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWD));
return 0;
case WM_DESTROY:
lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
@@ -129,15 +158,6 @@
ReleaseCapture();
break;
- case WM_KEYDOWN:
- case WM_KEYUP:
- case WM_CHAR:
- lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
- return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
-
- case WM_PAINT:
- StdDrawScrollBar(hwnd);
- break;
case WM_MOUSEMOVE:
if ((wParam & MK_LBUTTON) != 0) {
lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
@@ -150,12 +170,88 @@
x = (y * (lphs->MaxVal - lphs->MinVal) /
lphs->MaxPix) + lphs->MinVal;
#ifdef DEBUG_SCROLL
- printf("WM_MOUSEMOVE val=%d pix=%d\n", x, y);
+ printf("Scroll WM_MOUSEMOVE val=%d pix=%d\n", x, y);
#endif
SendMessage(wndPtr->hwndParent, lphs->Direction,
SB_THUMBTRACK, MAKELONG(x, hwnd));
}
break;
+ case WM_KEYDOWN:
+ case WM_KEYUP:
+ case WM_CHAR:
+ lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
+ return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
+
+ case WM_SIZE:
+ lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
+ width = LOWORD(lParam);
+ height = HIWORD(lParam);
+ if (lphs->Direction == WM_VSCROLL) {
+ MoveWindow(lphs->hWndUp, 0, 0, width, width, TRUE);
+ MoveWindow(lphs->hWndDown, 0, height - width, width, width, TRUE);
+ }
+ else {
+ MoveWindow(lphs->hWndUp, 0, 0, height, height, TRUE);
+ MoveWindow(lphs->hWndDown, width - height, 0, height, height, TRUE);
+ }
+ break;
+ case WM_DRAWITEM:
+#ifdef DEBUG_SCROLL
+ printf("Scroll WM_DRAWITEM w=%04X l=%08X\n", wParam, lParam);
+#endif
+ lpdis = (LPDRAWITEMSTRUCT)lParam;
+ if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_DRAWENTIRE) {
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ if (lpdis->CtlID == 1) {
+ GetObject(hUpArrow, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hUpArrow);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 2) {
+ GetObject(hDnArrow, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hDnArrow);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 3) {
+ GetObject(hLfArrow, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hLfArrow);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 4) {
+ GetObject(hRgArrow, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hRgArrow);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ DeleteDC(hMemDC);
+ }
+ if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_SELECT) {
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ if (lpdis->CtlID == 1) {
+ GetObject(hUpArrowD, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hUpArrowD);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 2) {
+ GetObject(hDnArrowD, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hDnArrowD);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 3) {
+ GetObject(hLfArrowD, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hLfArrowD);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ if (lpdis->CtlID == 4) {
+ GetObject(hRgArrowD, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hRgArrowD);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ }
+ DeleteDC(hMemDC);
+ }
+ break;
+ case WM_PAINT:
+ StdDrawScrollBar(hwnd);
+ break;
default:
return DefWindowProc( hwnd, message, wParam, lParam );
}
@@ -274,10 +370,10 @@
lphs->MaxPix = height - 3 * width;
lphs->Direction = WM_VSCROLL;
lphs->hWndUp = CreateWindow("BUTTON", "",
- WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
+ WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
0, 0, width, width, hwnd, 1, wndPtr->hInstance, 0L);
lphs->hWndDown = CreateWindow("BUTTON", "",
- WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
+ WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
0, height - width, width, width, hwnd, 2,
wndPtr->hInstance, 0L);
}
@@ -286,11 +382,11 @@
lphs->MaxPix = width - 3 * height;
lphs->Direction = WM_HSCROLL;
lphs->hWndUp = CreateWindow("BUTTON", "",
- WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
- 0, 0, height, height, hwnd, 0, wndPtr->hInstance, 0L);
+ WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
+ 0, 0, height, height, hwnd, 3, wndPtr->hInstance, 0L);
lphs->hWndDown = CreateWindow("BUTTON", "",
- WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
- width - height, 0, height, height, hwnd, 0,
+ WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
+ width - height, 0, height, height, hwnd, 4,
wndPtr->hInstance, 0L);
}
if (lphs->MaxPix < 1) lphs->MaxPix = 1;