⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tkwinbutton.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  * tkWinButton.c -- * *	This file implements the Windows specific portion of the button *	widgets. * * Copyright (c) 1996 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCS: @(#) tkWinButton.c 1.12 97/09/02 13:18:27 */#define OEMRESOURCE#include "tkWinInt.h"#include "tkButton.h"/* * These macros define the base style flags for the different button types. */#define LABEL_STYLE (BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS)#define PUSH_STYLE (BS_OWNERDRAW | BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS)#define CHECK_STYLE (BS_OWNERDRAW | BS_CHECKBOX | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS)#define RADIO_STYLE (BS_OWNERDRAW | BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS)static DWORD buttonStyles[] = {    LABEL_STYLE, PUSH_STYLE, CHECK_STYLE, RADIO_STYLE};/* * Declaration of Windows specific button structure. */typedef struct WinButton {    TkButton info;		/* Generic button info. */    WNDPROC oldProc;		/* Old window procedure. */    HWND hwnd;			/* Current window handle. */    Pixmap pixmap;		/* Bitmap for rendering the button. */    DWORD style;		/* Window style flags. */} WinButton;/* * The following macro reverses the order of RGB bytes to convert * between RGBQUAD and COLORREF values. */#define FlipColor(rgb) (RGB(GetBValue(rgb),GetGValue(rgb),GetRValue(rgb)))/* * The following enumeration defines the meaning of the palette entries * in the "buttons" image used to draw checkbox and radiobutton indicators. */enum {    PAL_CHECK = 0,    PAL_TOP_OUTER = 1,    PAL_BOTTOM_OUTER = 2,    PAL_BOTTOM_INNER = 3,    PAL_INTERIOR = 4,    PAL_TOP_INNER = 5,    PAL_BACKGROUND = 6};/* * Set to non-zero if this module is initialized. */static int initialized = 0;/* * Variables for the cached information about the boxes bitmap. */static BITMAPINFOHEADER *boxesPtr = NULL;   /* Information about the bitmap. */static DWORD *boxesPalette = NULL;	    /* Pointer to color palette. */static LPSTR boxesBits = NULL;		    /* Pointer to bitmap data. */static DWORD boxHeight = 0, boxWidth = 0;    /* Size of each sub-image. *//* * This variable holds the default border width for a button in string * form for use in a Tk_ConfigSpec. */static char defWidth[8];/* * Declarations for functions defined in this file. */static int		ButtonBindProc _ANSI_ARGS_((ClientData clientData,			    Tcl_Interp *interp, XEvent *eventPtr,			    Tk_Window tkwin, KeySym keySym));static LRESULT CALLBACK	ButtonProc _ANSI_ARGS_((HWND hwnd, UINT message,			    WPARAM wParam, LPARAM lParam));static DWORD		ComputeStyle _ANSI_ARGS_((WinButton* butPtr));static Window		CreateProc _ANSI_ARGS_((Tk_Window tkwin,			    Window parent, ClientData instanceData));static void		InitBoxes _ANSI_ARGS_((void));static void		UpdateButtonDefaults _ANSI_ARGS_((void));/* * The class procedure table for the button widgets. */TkClassProcs tkpButtonProcs = {     CreateProc,			/* createProc. */    TkButtonWorldChanged,	/* geometryProc. */    NULL			/* modalProc. */ };/* *---------------------------------------------------------------------- * * InitBoxes -- * *	This function load the Tk 3d button bitmap.  "buttons" is a 16  *	color bitmap that is laid out such that the top row contains  *	the 4 checkbox images, and the bottom row contains the radio  *	button images. Note that the bitmap is stored in bottom-up  *	format.  Also, the first seven palette entries are used to  *	identify the different parts of the bitmaps so we can do the  *	appropriate color mappings based on the current button colors. * * Results: *	None. * * Side effects: *	Loads the "buttons" resource. * *---------------------------------------------------------------------- */static voidInitBoxes(){    /*     * For DLLs like Tk, the HINSTANCE is the same as the HMODULE.     */    HMODULE module = (HINSTANCE) Tk_GetHINSTANCE();    HRSRC hrsrc;    HGLOBAL hblk;    LPBITMAPINFOHEADER newBitmap;    DWORD size;    hrsrc = FindResource(module, "buttons", RT_BITMAP);    if (hrsrc) {	hblk = LoadResource(module, hrsrc);	boxesPtr = (LPBITMAPINFOHEADER)LockResource(hblk);    }    /*     * Copy the DIBitmap into writable memory.     */    if (boxesPtr != NULL && !(boxesPtr->biWidth % 4)	    && !(boxesPtr->biHeight % 2)) {	size = boxesPtr->biSize + (1 << boxesPtr->biBitCount) * sizeof(RGBQUAD)	    + boxesPtr->biSizeImage;	newBitmap = (LPBITMAPINFOHEADER) ckalloc(size);	memcpy(newBitmap, boxesPtr, size);	boxesPtr = newBitmap;	boxWidth = boxesPtr->biWidth / 4;	boxHeight = boxesPtr->biHeight / 2;	boxesPalette = (DWORD*) (((LPSTR)boxesPtr) + boxesPtr->biSize);	boxesBits = ((LPSTR)boxesPalette)	    + ((1 << boxesPtr->biBitCount) * sizeof(RGBQUAD));    } else {	boxesPtr = NULL;    }}/* *---------------------------------------------------------------------- * * UpdateButtonDefaults -- * *	This function retrieves the current system defaults for *	the button widgets. * * Results: *	None. * * Side effects: *	Updates the configuration defaults for buttons. * *---------------------------------------------------------------------- */voidUpdateButtonDefaults(){    Tk_ConfigSpec *specPtr;    int width = GetSystemMetrics(SM_CXEDGE);    if (width == 0) {	width = 1;    }    sprintf(defWidth, "%d", width);    for (specPtr = tkpButtonConfigSpecs; specPtr->type != TK_CONFIG_END;	    specPtr++) {	if (specPtr->offset == Tk_Offset(TkButton, borderWidth)) {	    specPtr->defValue = defWidth;	}    }}/* *---------------------------------------------------------------------- * * TkpCreateButton -- * *	Allocate a new TkButton structure. * * Results: *	Returns a newly allocated TkButton structure. * * Side effects: *	Registers an event handler for the widget. * *---------------------------------------------------------------------- */TkButton *TkpCreateButton(tkwin)    Tk_Window tkwin;{    WinButton *butPtr;    if (!initialized) {	UpdateButtonDefaults();	initialized = 1;    }    butPtr = (WinButton *)ckalloc(sizeof(WinButton));    butPtr->hwnd = NULL;    return (TkButton *) butPtr;}/* *---------------------------------------------------------------------- * * CreateProc -- * *	This function creates a new Button control, subclasses *	the instance, and generates a new Window object. * * Results: *	Returns the newly allocated Window object, or None on failure. * * Side effects: *	Causes a new Button control to come into existence. * *---------------------------------------------------------------------- */static WindowCreateProc(tkwin, parentWin, instanceData)    Tk_Window tkwin;		/* Token for window. */    Window parentWin;		/* Parent of new window. */    ClientData instanceData;	/* Button instance data. */{    Window window;    HWND parent;    char *class;    WinButton *butPtr = (WinButton *)instanceData;    parent = Tk_GetHWND(parentWin);    if (butPtr->info.type == TYPE_LABEL) {	class = "STATIC";	butPtr->style = SS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS;    } else {	class = "BUTTON";	butPtr->style = BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS;    }    butPtr->hwnd = CreateWindow(class, NULL, butPtr->style,	    Tk_X(tkwin), Tk_Y(tkwin), Tk_Width(tkwin), Tk_Height(tkwin),	    parent, NULL, Tk_GetHINSTANCE(), NULL);    SetWindowPos(butPtr->hwnd, HWND_TOP, 0, 0, 0, 0,		    SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);    butPtr->oldProc = (WNDPROC)SetWindowLong(butPtr->hwnd, GWL_WNDPROC,	    (DWORD) ButtonProc);    window = Tk_AttachHWND(tkwin, butPtr->hwnd);    return window;}/* *---------------------------------------------------------------------- * * TkpDestroyButton -- * *	Free data structures associated with the button control. * * Results: *	None. * * Side effects: *	Restores the default control state. * *---------------------------------------------------------------------- */voidTkpDestroyButton(butPtr)    TkButton *butPtr;{    WinButton *winButPtr = (WinButton *)butPtr;    HWND hwnd = winButPtr->hwnd;    if (hwnd) {	SetWindowLong(hwnd, GWL_WNDPROC, (DWORD) winButPtr->oldProc);    }}/* *---------------------------------------------------------------------- * * TkpDisplayButton -- * *	This procedure is invoked to display a button widget.  It is *	normally invoked as an idle handler. * * Results: *	None. * * Side effects: *	Information appears on the screen.  The REDRAW_PENDING flag *	is cleared. * *---------------------------------------------------------------------- */voidTkpDisplayButton(clientData)    ClientData clientData;	/* Information about widget. */{    TkWinDCState state;    HDC dc;    register TkButton *butPtr = (TkButton *) clientData;    GC gc;    Tk_3DBorder border;    Pixmap pixmap;    int x = 0;			/* Initialization only needed to stop				 * compiler warning. */    int y, relief;    register Tk_Window tkwin = butPtr->tkwin;    int width, height;    int defaultWidth;		/* Width of default ring. */    int offset;			/* 0 means this is a label widget.  1 means				 * it is a flavor of button, so we offset				 * the text to make the button appear to				 * move up and down as the relief changes. */    butPtr->flags &= ~REDRAW_PENDING;    if ((butPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {	return;    }    border = butPtr->normalBorder;    if ((butPtr->state == tkDisabledUid) && (butPtr->disabledFg != NULL)) {	gc = butPtr->disabledGC;    } else if ((butPtr->state == tkActiveUid)	    && !Tk_StrictMotif(butPtr->tkwin)) {	gc = butPtr->activeTextGC;	border = butPtr->activeBorder;    } else {	gc = butPtr->normalTextGC;    }    if ((butPtr->flags & SELECTED) && (butPtr->state != tkActiveUid)	    && (butPtr->selectBorder != NULL) && !butPtr->indicatorOn) {	border = butPtr->selectBorder;    }    /*     * Override the relief specified for the button if this is a     * checkbutton or radiobutton and there's no indicator.     */    relief = butPtr->relief;    if ((butPtr->type >= TYPE_CHECK_BUTTON) && !butPtr->indicatorOn) {	relief = (butPtr->flags & SELECTED) ? TK_RELIEF_SUNKEN		: TK_RELIEF_RAISED;    }    /*     * Compute width of default ring and offset for pushed buttons.     */    if (butPtr->type == TYPE_BUTTON) {	defaultWidth = ((butPtr->defaultState == tkActiveUid)		? butPtr->highlightWidth : 0);	offset = 1;    } else {	defaultWidth = 0;	if ((butPtr->type >= TYPE_CHECK_BUTTON) && !butPtr->indicatorOn) {	    offset = 1;	} else {	    offset = 0;	}    }    /*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -