📄 support.c
字号:
}
void GUIAPI set_cliprgn(short lx, short ty, short rx, short by)
{
rcClipRgn.left = lx;
rcClipRgn.top = ty;
rcClipRgn.right = rx;
rcClipRgn.bottom = by;
_setcliprgn(lx, ty, rx, by);
}
void GUIAPI move_image(short srcx, short srcy, short srcw, short srch, short destx, short desty)
{
_asm
{
push ds
push es
mov dx, 3ceh
mov ax, 0105h
out dx, al
xchg ah, al
inc dx
out dx, al
mov ax, srcy
mov si, srcx
mov dx, 80
mul dx
mov cl, 3
shr si, cl
add si, ax
push si
mov ax, desty
mov di, destx
mov dx, 80
mul dx
mov cl, 3
shr di, cl
add di, ax
push di
mov ax, 0a000h
mov ds, ax
mov es, ax
mov bx, srcw
mov cl, 3
shr bx, cl
mov dx, 80
mov ax, srch
move1: mov cx, bx
move2: movsb
loop move2
pop di
pop si
add si, dx
add di, dx
push si
push di
dec ax
cmp ax, 0
jne move1
pop di
pop si
mov dx, 3ceh
mov ax, 0005h
out dx, al
xchg ah, al
inc dx
out dx, al
pop es
pop ds
}
}
/* LPIMAGEMEM GUIAPI SaveImageUseVirtualMem(int x, int y, int iWidth, int iHeight)
*
* Params: x, y: the position of image that want to save.
* iWidth, iHeight: the size of image that want to save.
*
* Return: Handle of virtual memory that save image.
*
* 1995.8.10.AM.
*
*/
_vmhnd_t GUIAPI SaveImageUseVirtualMem(int x, int y, int iWidth, int iHeight)
{
_vmhnd_t Handle;
char FAR* lpImageMem;
unsigned long size;
SetPtrVis(HIDE);
def_GDC_reg();
size = (unsigned long)_imagesize(0, 0, iWidth, iHeight);
Handle = _vmalloc(size);
if(Handle == _VM_NULL)
return _VM_NULL;
lpImageMem = (char FAR*)_vload(Handle, _VM_DIRTY);
_getimage(x, y, x + iWidth, y + iHeight, lpImageMem);
SetPtrVis(SHOW);
return Handle;
}
/* void GUIAPI RestoreImageUseVirtualMem( _vmhnd_t hdlImage, int x, int y )
*
* Params: hdlImage: the handle of image memory;
* x, y: the position that image will be put.
*
* Return: None.
*
* 1995.8.10.AM.
*
*/
void GUIAPI RestoreImageUseVirtualMem( _vmhnd_t hdlImage, int x, int y )
{
char FAR* lpImageMem;
lpImageMem = (char FAR*)_vload(hdlImage, _VM_CLEAN);
SetPtrVis(HIDE);
def_GDC_reg();
_putimage(x, y, lpImageMem, _GPSET);
SetPtrVis(SHOW);
_vfree(hdlImage);
}
/* _vmhnd_t GUIAPI GetIconImageHandler( void )
*
* Params: none.
*
* Return: the virtual memomry handler of icon image.
*
* 1997.7.3.AM.
*
*/
_vmhnd_t GUIAPI GetIconImageHandler( void )
{
return hdlImage;
}
/*
* Function: void GUIAPI SetCaretPos( short x, short y ).
* This function set new caret position.
* Parameters:
* x, y: newposition
* Return:
* None;
* Note:
* Before call this function, undisplay caret first.
*/
void GUIAPI SetCaretPos( short x, short y )
{
// Undisplay the old caret.
if(CaretInfo.fShowOrHide)
{
SetPtrVis(HIDE);
_setwritemode(_GXOR);
_setcolor(COLOR_lightwhite);
_moveto(CaretInfo.x, CaretInfo.y+2);
_lineto(CaretInfo.x, CaretInfo.y+14);
_moveto(CaretInfo.x + 1, CaretInfo.y+2);
_lineto(CaretInfo.x + 1, CaretInfo.y+14);
_setwritemode(_GPSET);
CaretInfo.fShowOrHide = FALSE;
SetPtrVis(SHOW);
}
// set new caret position.
CaretInfo.x = x;
CaretInfo.y = y;
CaretInfo.fDisplay = TRUE;
CaretInfo.count = 6;
return;
}
/*
* Function: void GUIAPI FlashCaret(void).
* This function flash caret in the current position.
* Parameters:
* none.
* Return:
* None;
* Note:
* Before call this function, undisplay caret first.
*/
void GUIAPI FlashCaret(void)
{
if(CaretInfo.fDisplay && CaretInfo.count > 5)
{
SetPtrVis(HIDE);
_setwritemode(_GXOR);
_setcolor(COLOR_lightwhite);
_moveto(CaretInfo.x, CaretInfo.y+2);
_lineto(CaretInfo.x, CaretInfo.y+14);
_moveto(CaretInfo.x + 1, CaretInfo.y+2);
_lineto(CaretInfo.x + 1, CaretInfo.y+14);
_setwritemode(_GPSET);
SetPtrVis(SHOW);
CaretInfo.count = 0;
CaretInfo.fShowOrHide = !CaretInfo.fShowOrHide;
}
}
/*
* Function: void GUIAPI UndipslayCaret( void ).
* This function erase current caret .
* Parameters:
* None.
* Return:
* None.
* Note:
* This function always called before update position of caret.
*/
void GUIAPI UndisplayCaret( void )
{
CaretInfo.fDisplay = FALSE;
if(CaretInfo.fShowOrHide)
{
SetPtrVis(HIDE);
_setwritemode(_GXOR);
_setcolor(COLOR_lightwhite);
_moveto(CaretInfo.x, CaretInfo.y+2);
_lineto(CaretInfo.x, CaretInfo.y+14);
_moveto(CaretInfo.x + 1, CaretInfo.y+2);
_lineto(CaretInfo.x + 1, CaretInfo.y+14);
_setwritemode(_GPSET);
CaretInfo.fShowOrHide = FALSE;
SetPtrVis(SHOW);
}
}
BOOL GUIAPI IsCaretDisplaying(int* x, int* y)
{
*x = CaretInfo.x;
*y = CaretInfo.y;
return CaretInfo.fDisplay;
}
/* MouseInit - Initialize mouse and turns on mouse pointer. Initializes
* all internal variables used by other mouse functions. This function
* should be called whenever a new video mode is set, since internal
* variables are mode-dependent.
*
* Params: none
*
* Return: 0 if no mouse available, otherwise number of buttons available
*/
static int MouseInit()
{
// struct videoconfig vc;
char _far *pMode = (char _far *)0x00000449; /* Address for mode */
/* Handle special case of Hercules graphics. To use mouse with video
* page 0. assume mode 6. To use mouse with page 1, assume mode 5.
* Since the mouse functions couldn't easily detect and adjust for
* page changes anyway, this code assumes page 0. Note also that the
* mouse for Hercules graphics must be set in text mono mode.
*/
if( vc.mode == _HERCMONO )
{
mi.fExist = 0;
*pMode = 6;
}
mi.fInit = 1;
_asm
{
sub ax, ax ; Mouse function 0, reset mouse
int 33h
mov mi.fExist, ax ; Set existence flag for future calls
or ax, ax ; If AX = 0, there is no mouse
jnz exist
ret ; so quit
exist:
mov mi.cBtn, bx ; Save number of mouse buttons for return
}
/* Set graphics flag. */
if( vc.numxpixels )
{
mi.fGraph = 1;
mi.yActual = vc.numypixels - 1;
mi.xActual = vc.numxpixels - 1;
}
else
mi.fGraph = 0;
/* The mouse works on a virtual screen of 640 x pixels by (8 * textrows)
* vertical pixels. By default, it assumes 640 x 200 for 25-line mode.
* You must call function 8 to adjust for other screen sizes.
*/
mi.xVirtual = 639;
if( mi.fGraph )
mi.yVirtual = vc.numypixels - 1;
else
mi.yVirtual = (vc.numtextrows << 3) - 1;
/* Reset Hercules graphics mode and reset the height. */
if( vc.mode == _HERCMONO )
{
_setvideomode( _HERCMONO );
mi.xVirtual = 719;
}
_asm
{
mov ax, 8 ; Set minimum and maximum vertical
sub cx, cx ; Minimum is 0
mov dx, mi.yVirtual ; Maximum is 8 * rows (or rows SHL 3)
int 33h ; Adjust for 25, 30, 43, 50, or 60 lines
mov ax, 1 ; Turn on mouse pointer
int 33h
mov ax, 3 ; Get initial position and button status
int 33h
mov mi.xLast, cx ; Save internally
mov mi.yLast, dx
mov mi.fsBtnLast, bx
}
return mi.cBtn; /* Return the number of mouse buttons */
}
BOOL GUIAPI IsMouseAvailable()
{
return mi.fExist;
}
/* GetMouseEvent - Check to see if there has been a mouse event. If event
* occurred, update event structure.
*
* Params: pEvent - Pointer to event structure
*
* Return: 1 if event, 0 if no event
*/
int GUIAPI GetMouseEvent( EVENT _far *pEvent )
{
int rtn;
/* Make sure that mouse exists. */
if( !mi.fExist )
return 0;
_asm
{
mov ax, 3 ; Get Mouse position and button status
int 33h
sub ax, ax ; Assume no event
cmp cx, mi.xLast ; Has column changed?
jne event
cmp dx, mi.yLast ; Has row changed?
jne event
cmp bx, mi.fsBtnLast ; Has button changed?
je noevent
event:
mov ax, 1 ; If something changed, event occurred
mov mi.xLast, cx ; Update internal variables
mov mi.yLast, dx
mov mi.fsBtnLast, bx
noevent:
mov rtn, ax ; Set return value
}
/* If event, put adjust values in structure. */
if( rtn )
{
/* If graphics mode, adjust virtual mouse position to actual
* screen coordinates.
*/
if( mi.fGraph )
{
pEvent->hotx = (short)(((long)mi.xLast * mi.xActual) / mi.xVirtual);
pEvent->hoty = (short)(((long)mi.yLast * mi.yActual) / mi.yVirtual);
}
/* If text mode, adjust virtual mouse position to 1-based
* row/column.
*/
else
{
pEvent->hotx = (mi.xLast >> 3) + 1;
pEvent->hoty = (mi.yLast >> 3) + 1;
}
pEvent->fsBtn = mi.fsBtnLast;
}
return rtn;
}
/* GetPtrPos - Get mouse pointer position and button status regardless of
* whether there was an event.
*
* Params: pEvent - Pointer to event structure
*
* Return: 0 if no mouse, otherwise 1
*/
int GUIAPI GetPtrPos( EVENT FAR *pEvent )
{
/* Make sure that mouse exists. */
if( !mi.fExist )
return 0;
_asm
{
mov ax, 3 ; Get Mouse position and button status
int 33h
les di, pEvent
mov es:[di].hotx, cx
mov es:[di].hoty, dx
mov es:[di].fsBtn, bx
}
/* If graphics mode, adjust virtual mouse position to actual
* screen coordinates.
*/
if( mi.fGraph )
{
pEvent->hotx = (short)(((long)pEvent->hotx * mi.xActual) / mi.xVirtual);
pEvent->hoty = (short)(((long)pEvent->hoty * mi.yActual) / mi.yVirtual);
}
/* If text mode, adjust virtual mouse position to 1-based
* row/column.
*/
else
{
pEvent->hotx >>= 3;
pEvent->hoty >>= 3;
pEvent->hotx++;
pEvent->hoty++;
}
return 1;
}
/* SetPtrVis - Set pointer visibility.
*
* Params: state - SHOW or HIDE
*
* Return: 0 if no mouse, otherwise 1
*/
int GUIAPI SetPtrVis( enum PTRVIS pv )
{
/* Make sure that mouse exists. */
if( !mi.fExist )
return 0;
_asm
{
mov ax, pv ; Show or hide mouse pointer
int 33h
}
}
/* SetPtrPos - Set mouse pointer position.
*
* Params: x - column position in text modes, actual x coordinate in graphics
* y - row position in text modes, actual y coordinate in graphics
*
* Return: 0 if no mouse, otherwise 1
*/
int GUIAPI SetPtrPos( short x, short y )
{
/* Make sure that mouse exists. */
if( !mi.fExist )
return 0;
/* If graphics, adjust actual coordinates to virtual coordinates. */
if( mi.fGraph )
{
x = (short)(((long)x * mi.xActual) / mi.xVirtual);
y = (short)(((long)y * mi.yActual) / mi.yVirtual);
}
/* If text, adjust row/column to 0-based virtual coordinates. */
else
{
x--;
y--;
x <<= 3;
y <<= 3;
}
_asm
{
mov ax, 4 ; Set mouse position
mov cx, x
mov dx, y
int 33h
}
return 1;
}
/* SetPtrShape - Set mouse pointer shape.
*
* Params: x - column position in text modes, actual x coordinate in graphics
* y - row position in text modes, actual y coordinate in graphics
*
* Return: 0 if no mouse, otherwise 1
*/
int GUIAPI SetPtrShape( PTRSHAPE FAR *ps )
{
/* Make sure that mouse exists. */
if( !mi.fExist )
return 0;
/* If graphics, use pointer shape bitmask array. */
if( mi.fGraph )
{
_asm
{
les di, ps
mov bx, es:[di].g.xHot ; Load hot spot offsets
mov cx, es:[di].g.yHot
mov dx, di
add dx, 4
mov ax, 9 ; Set graphics pointer
int 33h
}
}
/* If text, use pointer color/character values. */
else
{
_asm
{
les di, ps
mov bx, 0 ; Use software cursor
mov cl, es:[di].t.chScreen
mov ch, es:[di].t.atScreen
mov dl, es:[di].t.chCursor
mov dh, es:[di].t.atCursor
mov ax, 10 ; Set text pointer
int 33h
}
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -