Windows2000/private/windbg64/windbg/userctrl.c

388 lines
12 KiB
C
Raw Normal View History

2001-01-01 00:00:00 +01:00
/*
* 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() */