388 lines
12 KiB
C
388 lines
12 KiB
C
/*
|
|
* Copyright Microsoft 1991
|
|
|
|
* Date Jan 09, 1991
|
|
|
|
* Project Asterix/Obelix
|
|
|
|
* History
|
|
* Date Initial Description
|
|
* ---- ------- -----------
|
|
* 01-09-91 ChauV Created for use with Tools and Status bars.
|
|
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
|
|
/*begin static function prototypes */
|
|
|
|
/* user defined Rectangular box */
|
|
|
|
void DrawBitmapButton (HWND, LPRECT) ;
|
|
|
|
/*begin variable definitions */
|
|
|
|
static BOOL bTrack = FALSE ; // mouse down flag
|
|
static WORD wOldState ; // preserve the control state just before
|
|
// a button is being pushed.
|
|
|
|
|
|
/*
|
|
** Synopsis:
|
|
** void = EnableQCQPCtrl(hWnd, id, fEnable)
|
|
|
|
** Entry:
|
|
** hWnd - parent's handle
|
|
** id - control's ID
|
|
** fEnable - FALSE for disable
|
|
|
|
** Returns:
|
|
** nothing
|
|
|
|
** Description:
|
|
** This function enable or disable a control identified by the the
|
|
** parent's handle and the control's ID. If enable is FALSE, the control
|
|
** is grayed, otherwise it is activated. This function is only valid to
|
|
** pushbutton style (QCQP_CS_PUSHBUTTON).
|
|
*/
|
|
void EnableQCQPCtrl(HWND hWnd, int id, BOOL enable)
|
|
{
|
|
HWND hwndControl;
|
|
|
|
hwndControl = GetDlgItem(hWnd, id);
|
|
InvalidateRect(hwndControl, (LPRECT)NULL, FALSE);
|
|
}/* EnableQCQPCtrl() */
|
|
|
|
|
|
/*
|
|
** Synopsis:
|
|
** word = GetBitmapIndex(state)
|
|
|
|
** Entry:
|
|
** state -
|
|
*/
|
|
WORD NEAR PASCAL GetBitmapIndex(WORD State)
|
|
{
|
|
switch (State) {
|
|
case STATE_NORMAL:
|
|
return CBWNDEXTRA_BMAP_NORMAL;
|
|
case STATE_PUSHED:
|
|
return CBWNDEXTRA_BMAP_PUSHED;
|
|
case STATE_GRAYED:
|
|
return CBWNDEXTRA_BMAP_GREYED;
|
|
default:
|
|
Assert(FALSE);
|
|
// Have to return something.
|
|
return CBWNDEXTRA_BMAP_NORMAL;
|
|
}
|
|
}/* GetBitmapIndex() */
|
|
|
|
|
|
/*
|
|
** Synopsis:
|
|
** hwnd = CreateQCQPWindow(lpszWindowName, dwStyle, x, y, dx, dy
|
|
** hParent, hMenu, hInstance, wMessage)
|
|
|
|
** Entry:
|
|
** lpszWindowName -
|
|
** dwStyle -
|
|
** x -
|
|
** y -
|
|
** dx -
|
|
** dy -
|
|
** hParent -
|
|
** hMenu -
|
|
** hInstance -
|
|
** wMessage -
|
|
*/
|
|
HWND CreateQCQPWindow(LPSTR lpWindowName,
|
|
DWORD dwStyle,
|
|
int x,
|
|
int y,
|
|
int dx,
|
|
int dy,
|
|
HWND hParent,
|
|
HMENU hMenu,
|
|
HINSTANCE hInstance,
|
|
WPARAM wMessage)
|
|
{
|
|
HWND hTemp ;
|
|
char szClass[MAX_MSG_TXT] ;
|
|
WORD BaseId = 0;
|
|
WORD State;
|
|
HBITMAP hBitmap;
|
|
|
|
Dbg(LoadString(hInstance, SYS_QCQPCtrl_wClass, szClass, MAX_MSG_TXT)) ;
|
|
hTemp = CreateWindow(
|
|
(LPSTR)szClass, // Window szClass name
|
|
lpWindowName, // Window's title
|
|
WS_CHILD | WS_VISIBLE, // window created visible
|
|
x, y, // X, Y
|
|
dx, dy, // Width, Height of window
|
|
hParent, // Parent window's handle
|
|
hMenu, // child's id
|
|
hInstance, // Instance of window
|
|
NULL); // Create struct for WM_CREATE
|
|
|
|
if (hTemp != NULL) {
|
|
SetWindowWord (hTemp, CBWNDEXTRA_STYLE, LOWORD(dwStyle)) ;
|
|
SetWindowWord (hTemp, CBWNDEXTRA_BITMAP, HIWORD(dwStyle)) ;
|
|
SetWindowWord (hTemp, CBWNDEXTRA_STATE, STATE_NORMAL) ;
|
|
SetWindowHandle (hTemp, CBWNDEXTRA_MESSAGE, wMessage) ;
|
|
|
|
if (LOWORD(dwStyle) == QCQP_CS_PUSHBUTTON) {
|
|
// Load the bitmaps and store the handles
|
|
switch (HIWORD(dwStyle)) {
|
|
case IDS_CTRL_TRACENORMAL:
|
|
case IDS_CTRL_TRACEPUSHED:
|
|
case IDS_CTRL_TRACEGRAYED:
|
|
BaseId = VGA_TRACE_NORMAL;
|
|
break;
|
|
case IDS_CTRL_STEPNORMAL:
|
|
case IDS_CTRL_STEPPUSHED:
|
|
case IDS_CTRL_STEPGRAYED:
|
|
BaseId = VGA_STEP_NORMAL;
|
|
break;
|
|
case IDS_CTRL_BREAKNORMAL:
|
|
case IDS_CTRL_BREAKPUSHED:
|
|
case IDS_CTRL_BREAKGRAYED:
|
|
BaseId = VGA_BREAK_NORMAL;
|
|
break;
|
|
case IDS_CTRL_GONORMAL:
|
|
case IDS_CTRL_GOPUSHED:
|
|
case IDS_CTRL_GOGRAYED:
|
|
BaseId = VGA_GO_NORMAL;
|
|
break;
|
|
case IDS_CTRL_HALTNORMAL:
|
|
case IDS_CTRL_HALTPUSHED:
|
|
case IDS_CTRL_HALTGRAYED:
|
|
BaseId = VGA_HALT_NORMAL;
|
|
break;
|
|
case IDS_CTRL_QWATCHNORMAL:
|
|
case IDS_CTRL_QWATCHPUSHED:
|
|
case IDS_CTRL_QWATCHGRAYED:
|
|
BaseId = VGA_QWATCH_NORMAL;
|
|
break;
|
|
case IDS_CTRL_SMODENORMAL:
|
|
case IDS_CTRL_SMODEPUSHED:
|
|
case IDS_CTRL_SMODEGRAYED:
|
|
BaseId = VGA_SMODE_NORMAL;
|
|
break;
|
|
case IDS_CTRL_AMODENORMAL:
|
|
case IDS_CTRL_AMODEPUSHED:
|
|
case IDS_CTRL_AMODEGRAYED:
|
|
BaseId = VGA_AMODE_NORMAL;
|
|
break;
|
|
case IDS_CTRL_FORMATNORMAL:
|
|
case IDS_CTRL_FORMATPUSHED:
|
|
case IDS_CTRL_FORMATGRAYED:
|
|
BaseId = VGA_FORMAT_NORMAL;
|
|
break;
|
|
default:
|
|
Assert(FALSE);
|
|
}
|
|
|
|
// Load the bitmaps for each state for the button
|
|
for (State = STATE_NORMAL; State <= STATE_GRAYED; State++) {
|
|
Dbg(hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE( BaseId + State )));
|
|
SetWindowHandle(hTemp, GetBitmapIndex(State), (WPARAM)hBitmap);
|
|
}
|
|
}
|
|
}
|
|
|
|
return hTemp ;
|
|
}/* CreateQCQPWindow() */
|
|
|
|
|
|
/*
|
|
** Synopsis:
|
|
** lresult = QCQPCtrlWndProc(hWnd, iMessage, wParam, lParam)
|
|
|
|
** Entry:
|
|
** hWnd
|
|
** iMessage
|
|
** wParam
|
|
** lParam
|
|
*/
|
|
LRESULT CALLBACK QCQPCtrlWndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
PAINTSTRUCT ps ;
|
|
char szText [128] ;
|
|
WPARAM wStyle ;
|
|
RECT r ;
|
|
|
|
wStyle = GetWindowWord (hWnd, CBWNDEXTRA_STYLE) ;
|
|
switch ( iMessage ) {
|
|
case WM_CREATE:
|
|
bTrack = FALSE ;
|
|
break ;
|
|
case WM_PAINT:
|
|
GetClientRect (hWnd, (LPRECT)&r) ;
|
|
|
|
BeginPaint (hWnd, &ps) ;
|
|
|
|
switch ( wStyle ) {
|
|
case QCQP_CS_PUSHBUTTON:
|
|
case QCQP_CS_LATCHBUTTON:
|
|
DrawBitmapButton (hWnd, (LPRECT)&r) ;
|
|
break ;
|
|
default:
|
|
break ;
|
|
}
|
|
|
|
EndPaint (hWnd, &ps) ;
|
|
break ;
|
|
case WM_LBUTTONUP:
|
|
if ( GetWindowWord (hWnd, CBWNDEXTRA_STATE) != STATE_GRAYED ) {
|
|
bTrack = FALSE ;
|
|
ReleaseCapture () ;
|
|
switch (wStyle) {
|
|
case QCQP_CS_PUSHBUTTON:
|
|
// Only change the state and send message back to parent
|
|
// if state is not normal. This prevent user from clicking
|
|
// the mouse on the button then dragging it outside of
|
|
// the button.
|
|
|
|
if (GetWindowWord (hWnd, CBWNDEXTRA_STATE) != STATE_NORMAL) {
|
|
SetWindowWord (hWnd, CBWNDEXTRA_STATE, STATE_NORMAL) ;
|
|
InvalidateRect (hWnd, (LPRECT)NULL, FALSE) ;
|
|
|
|
// Send information back to where the function key is being
|
|
// used for the same purpose.
|
|
|
|
SendMessage (GetParent (hWnd), WM_COMMAND, (WPARAM) GetWindowHandle (hWnd, CBWNDEXTRA_MESSAGE), MAKELONG(0, GetDlgCtrlID (hWnd))) ;
|
|
}
|
|
break ;
|
|
case QCQP_CS_LATCHBUTTON:
|
|
if (GetWindowWord (hWnd, CBWNDEXTRA_STATE) != wOldState) {
|
|
if (wOldState == STATE_NORMAL)
|
|
SetWindowWord (hWnd, CBWNDEXTRA_STATE, STATE_ON) ;
|
|
else
|
|
SetWindowWord (hWnd, CBWNDEXTRA_STATE, STATE_NORMAL) ;
|
|
|
|
InvalidateRect (hWnd, (LPRECT)NULL, FALSE) ;
|
|
|
|
// Send information back to where the function key is being
|
|
// used for the same purpose.
|
|
|
|
SendMessage (GetParent (hWnd), WM_COMMAND, (WPARAM) GetWindowHandle (hWnd, CBWNDEXTRA_MESSAGE), MAKELONG(0, GetDlgCtrlID (hWnd))) ;
|
|
}
|
|
break ;
|
|
}
|
|
}
|
|
break ;
|
|
case WM_LBUTTONDOWN:
|
|
if ( GetWindowWord (hWnd, CBWNDEXTRA_STATE) != STATE_GRAYED ) {
|
|
bTrack = TRUE ;
|
|
wOldState = GetWindowWord (hWnd, CBWNDEXTRA_STATE) ;
|
|
switch (wStyle) {
|
|
case QCQP_CS_PUSHBUTTON:
|
|
case QCQP_CS_LATCHBUTTON:
|
|
SetWindowWord (hWnd, CBWNDEXTRA_STATE, STATE_PUSHED) ;
|
|
InvalidateRect (hWnd, (LPRECT)NULL, FALSE) ;
|
|
break ;
|
|
}
|
|
SetCapture (hWnd) ;
|
|
}
|
|
break ;
|
|
case WM_MOUSEMOVE:
|
|
if ( GetWindowWord (hWnd, CBWNDEXTRA_STATE) != STATE_GRAYED ) {
|
|
if ( bTrack ) {
|
|
int x, y ;
|
|
|
|
x = LOWORD (lParam) ; // get x position
|
|
y = HIWORD (lParam) ; // get y position
|
|
GetClientRect (hWnd, &r) ;
|
|
|
|
// if mouse position is outside of button area, bring it
|
|
// back to its old state stored in wOldState.
|
|
|
|
if ( ((x < r.left) || (x > r.right)) || ((y < r.top) || (y > r.bottom)) ) {
|
|
// redraw the button only if it's not in normal position.
|
|
if ( GetWindowWord (hWnd, CBWNDEXTRA_STATE) != wOldState ) {
|
|
SetWindowWord (hWnd, CBWNDEXTRA_STATE, wOldState) ;
|
|
InvalidateRect (hWnd, (LPRECT)NULL, FALSE) ;
|
|
}
|
|
} else {
|
|
// redraw the button only if it's not in pushed position.
|
|
|
|
if ( GetWindowWord (hWnd, CBWNDEXTRA_STATE) != STATE_PUSHED ) {
|
|
SetWindowWord (hWnd, CBWNDEXTRA_STATE, STATE_PUSHED) ;
|
|
InvalidateRect (hWnd, (LPRECT)NULL, FALSE) ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break ;
|
|
default:
|
|
return DefWindowProc (hWnd, iMessage, wParam, lParam) ;
|
|
break ;
|
|
}
|
|
|
|
return 0L ;
|
|
}/* QCQPCtrlWndProc() */
|
|
|
|
|
|
/*
|
|
** Synopsis:
|
|
** void = DrawBitmapButton(hWnd, r)
|
|
|
|
** Entry:
|
|
** hWnd
|
|
** r
|
|
|
|
*/
|
|
void DrawBitmapButton (HWND hWnd, LPRECT r)
|
|
{
|
|
HDC hDC, hMemoryDC ;
|
|
HBITMAP hBitmap, hTempBitmap ;
|
|
int OldStretchMode ;
|
|
BITMAP Bitmap ;
|
|
WORD State;
|
|
|
|
State = (WORD) GetWindowWord(hWnd, CBWNDEXTRA_STATE);
|
|
hBitmap = (HBITMAP) GetWindowHandle(hWnd, GetBitmapIndex(State));
|
|
|
|
hDC = GetDC (hWnd) ;
|
|
Dbg(hMemoryDC = CreateCompatibleDC (hDC));
|
|
Dbg(GetObject (hBitmap, sizeof(BITMAP), (LPSTR) &Bitmap));
|
|
|
|
// save the current bitmap handle.
|
|
Dbg(hTempBitmap = (HBITMAP) SelectObject (hMemoryDC, hBitmap));
|
|
|
|
OldStretchMode = SetStretchBltMode (hDC, COLORONCOLOR);
|
|
StretchBlt (hDC, r->left, r->top, r->right, r->bottom, hMemoryDC, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, SRCCOPY);
|
|
|
|
SetStretchBltMode(hDC, OldStretchMode);
|
|
|
|
// restore the old bitmap back into DC
|
|
|
|
SelectObject(hMemoryDC, hTempBitmap);
|
|
Dbg(DeleteDC(hMemoryDC));
|
|
Dbg(ReleaseDC(hWnd, hDC));
|
|
}/* DrawBitmapButton() */
|
|
|
|
|
|
/*
|
|
** Synopsis:
|
|
** void = FreeBitmaps(hwnd, ctrlId)
|
|
|
|
** Entry:
|
|
** hwnd -
|
|
** ctrlId -
|
|
*/
|
|
void NEAR PASCAL FreeBitmaps(HWND hwndToolbar, int CtrlId)
|
|
{
|
|
HWND hwndCtrl;
|
|
WORD State;
|
|
HBITMAP hBitmap;
|
|
|
|
hwndCtrl = GetDlgItem(hwndToolbar, CtrlId);
|
|
|
|
for (State = STATE_NORMAL; State <= STATE_GRAYED; State++) {
|
|
hBitmap = (HBITMAP)GetWindowHandle(hwndCtrl, GetBitmapIndex(State));
|
|
Dbg(DeleteObject(hBitmap));
|
|
}
|
|
}/* FreeBitmaps() */ |