/*++ * * WOW v1.0 * * Copyright (c) 1991, Microsoft Corporation * * WUCARET.C * WOW32 16-bit User API support * * History: * Created 07-Mar-1991 by Jeff Parsons (jeffpar) --*/ #include "precomp.h" #pragma hdrstop MODNAME(wucaret.c); /*++ void CreateCaret(, , , ) HWND ; BITMAP ; int ; int ; The %CreateCaret% function creates a new shape for the system caret and assigns ownership of the caret to the given window. The caret shape can be a line, block, or bitmap as defined by the parameter. If is a bitmap handle, the and parameters are ignored; the bitmap defines its own width and height. (The bitmap handle must have been previously created by using the %CreateBitmap%, %CreateDIBitmap%, or %LoadBitmap% function.) If is NULL or 1, and give the caret's width and height (in logical units); the exact width and height (in pixels) depend on the window's mapping mode. If or is zero, the caret width or height is set to the system's window-border width or height. Using the window-border width or height guarantees that the caret will be visible on a high-resolution display. The %CreateCaret% function automatically destroys the previous caret shape, if any, regardless of which window owns the caret. Once created, the caret is initially hidden. To show the caret, the %ShowCaret% function must be called. Identifies the window that owns the new caret. Identifies the bitmap that defines the caret shape. If is NULL, the caret is solid; if is 1, the caret is gray. Specifies the width of the caret (in logical units). Specifies the height of the caret (in logical units). This function does not return a value. The system caret is a shared resource. A window should create a caret only when it has the input focus or is active. It should destroy the caret before losing the input focus or becoming inactive. The system's window-border width or height can be retrieved by using the %GetSystemMetrics% function with the SM_CXBORDER and SM_CYBORDER indexes. --*/ ULONG FASTCALL WU32CreateCaret(PVDMFRAME pFrame) { register PCREATECARET16 parg16; HANDLE h32; GETARGPTR(pFrame, sizeof(CREATECARET16), parg16); h32 = (HANDLE)parg16->f2; // 0 -> caret is solid, 1 -> caret is gray, otherwise it's an hBitmap if(((DWORD)h32) > 1) { h32 = HBITMAP32(h32); } CreateCaret(HWND32(parg16->f1), h32, INT32(parg16->f3), INT32(parg16->f4)); FREEARGPTR(parg16); RETURN(0); } /*++ void DestroyCaret(VOID) The %DestroyCaret% function destroys the current caret shape, frees the caret from the window that currently owns it, and removes the caret from the screen if it is visible. The %DestroyCaret% function checks the ownership of the caret and destroys the caret only if a window in the current task owns it. If the caret shape was previously a bitmap, %DestroyCaret% does not free the bitmap. This function has no parameters. This function does not return a value. The caret is a shared resource. If a window has created a caret shape, it destroys that shape before it loses the input focus or becomes inactive. --*/ ULONG FASTCALL WU32DestroyCaret(PVDMFRAME pFrame) { UNREFERENCED_PARAMETER(pFrame); DestroyCaret(); RETURN(0); } /*++ WORD GetCaretBlinkTime(VOID) The %GetCaretBlinkTime% function retrieves the caret blink rate. The blink rate is the elapsed time in milliseconds between flashes of the caret. This function has no parameters. The return value specifies the blink rate (in milliseconds). --*/ ULONG FASTCALL WU32GetCaretBlinkTime(PVDMFRAME pFrame) { ULONG ul; UNREFERENCED_PARAMETER(pFrame); ul = GETWORD16(GetCaretBlinkTime()); RETURN(ul); } /*++ void GetCaretPos() LPPOINT ; The %GetCaretPos% function retrieves the caret's current position (in screen coordinates), and copies them to the %POINT% structure pointed to by the parameter. Points to the %POINT% structure that is to receive the screen coordinates of the caret. This function does not return a value. The caret position is always given in the client coordinates of the window that contains the caret. --*/ ULONG FASTCALL WU32GetCaretPos(PVDMFRAME pFrame) { POINT t1; register PGETCARETPOS16 parg16; GETARGPTR(pFrame, sizeof(GETCARETPOS16), parg16); GetCaretPos( &t1 ); PUTPOINT16(parg16->f1, &t1); FREEARGPTR(parg16); RETURN(0); } /*++ void HideCaret() HWND ; The %HideCaret% function hides the caret by removing it from the display screen. Although the caret is no longer visible, it can be displayed again by using the %ShowCaret% function. Hiding the caret does not destroy its current shape. The %HideCaret% function hides the caret only if the given window owns the caret. If the parameter is NULL, the function hides the caret only if a window in the current task owns the caret. Hiding is cumulative. If %HideCaret% has been called five times in a row, %ShowCaret% must be called five times before the caret will be shown. Identifies the window that owns the caret, or it is NULL to indirectly specify the window in the current task that owns the caret. This function does not return a value. --*/ ULONG FASTCALL WU32HideCaret(PVDMFRAME pFrame) { register PHIDECARET16 parg16; GETARGPTR(pFrame, sizeof(HIDECARET16), parg16); HideCaret( HWND32(parg16->f1) ); FREEARGPTR(parg16); RETURN(0); } /*++ void SetCaretBlinkTime() WORD ; The %SetCaretBlinkTime% function sets the caret blink rate (elapsed time between caret flashes) to the number of milliseconds specified by the parameter. The caret flashes on or off each milliseconds. This means one complete flash (on-off-on) takes 2 x milliseconds. Specifies the new blink rate (in milliseconds). This function does not return a value. The caret is a shared resource. A window should set the caret blink rate only if it owns the caret. It should restore the previous rate before it loses the input focus or becomes inactive. --*/ ULONG FASTCALL WU32SetCaretBlinkTime(PVDMFRAME pFrame) { register PSETCARETBLINKTIME16 parg16; GETARGPTR(pFrame, sizeof(SETCARETBLINKTIME16), parg16); SetCaretBlinkTime( WORD32(parg16->f1) ); FREEARGPTR(parg16); RETURN(0); } /*++ void SetCaretPos(, ) int ; int ; The %SetCaretPos% function moves the caret to the position given by logical coordinates specified by the and parameters. Logical coordinates are relative to the client area of the window that owns them and are affected by the window's mapping mode, so the exact position in pixels depends on this mapping mode. The %SetCaretPos% function moves the caret only if it is owned by a window in the current task. %SetCaretPos% moves the caret whether or not the caret is hidden. Specifies the new x-coordinate (in logical coordinates) of the caret. Specifies the new -coordinate (in logical coordinates) of the caret. This function does not return a value. The caret is a shared resource. A window should not move the caret if it does not own the caret. --*/ ULONG FASTCALL WU32SetCaretPos(PVDMFRAME pFrame) { register PSETCARETPOS16 parg16; GETARGPTR(pFrame, sizeof(SETCARETPOS16), parg16); SetCaretPos( INT32(parg16->f1), INT32(parg16->f2) ); FREEARGPTR(parg16); RETURN(0); } /*++ void ShowCaret() The %ShowCaret% function shows the caret on the display at the caret's current position. Once shown, the caret begins flashing automatically. The %ShowCaret% function shows the caret only if it has a current shape and has not been hidden two or more times in a row. If the caret is not owned by the given window, the caret is not shown. If the parameter is NULL, the %ShowCaret% function shows the caret only if it is owned by a window in the current task. Hiding the caret is accumulative. If the %HideCaret% function has been called five times in a row, %ShowCaret% must be called five times to show the caret. Identifies the window that owns the caret, or is NULL to specify indirectly the owner window in the current task. This function does not return a value. The caret is a shared resource. A window should show the caret only when it has the input focus or is active. --*/ ULONG FASTCALL WU32ShowCaret(PVDMFRAME pFrame) { register PSHOWCARET16 parg16; GETARGPTR(pFrame, sizeof(SHOWCARET16), parg16); ShowCaret( HWND32(parg16->f1) ); FREEARGPTR(parg16); RETURN(0); }