📄 caret.c
字号:
// $Id: caret.c,v 1.2 2000/06/19 01:54:15 weiym Exp $//// caret.c: The Caret module.//// Copyright (c) 1999, Mr. Wei Yongming.//// Current maintainer: Wei Yongming./*** This library is free software; you can redistribute it and/or** modify it under the terms of the GNU Library General Public** License as published by the Free Software Foundation; either** version 2 of the License, or (at your option) any later version.**** This library is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU** Library General Public License for more details.**** You should have received a copy of the GNU Library General Public** License along with this library; if not, write to the Free** Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,** MA 02111-1307, USA*/// Create date: 1999.07.03//// Modify records://// Who When Where For What Status//-----------------------------------------------------------------------------//// TODO:// #include <stdlib.h>#include <pthread.h>#include <semaphore.h>#include "common.h"#include "gdi.h"#include "window.h"#include "cliprect.h"#include "gal.h"#include "internals.h"#ifndef lintstatic char fileid[] = "$Id: caret.c,v 1.2 2000/06/19 01:54:15 weiym Exp $";#endifBOOL GUIAPI CreateCaret (HWND hWnd, PBITMAP pBitmap, int nWidth, int nHeight){ PMAINWIN pWin; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) { if (!(pWin->pCaretInfo = malloc (sizeof (CARETINFO)))) return FALSE; pWin->pCaretInfo->pBitmap = pBitmap; if (pBitmap) { nWidth = pBitmap->bmWidth; nHeight = pBitmap->bmHeight; } pWin->pCaretInfo->nWidth = nWidth; pWin->pCaretInfo->nHeight = nHeight; pWin->pCaretInfo->nEffWidth = nWidth; pWin->pCaretInfo->nEffHeight = nHeight; pWin->pCaretInfo->nBytesNr = nWidth * nHeight * BYTESPERPHYPIXEL; pWin->pCaretInfo->pNormal = malloc (pWin->pCaretInfo->nBytesNr); pWin->pCaretInfo->pXored = malloc (pWin->pCaretInfo->nBytesNr); if (pWin->pCaretInfo->pNormal == NULL || pWin->pCaretInfo->pXored == NULL) { free (pWin->pCaretInfo); pWin->pCaretInfo = NULL; return FALSE; } pWin->pCaretInfo->x = pWin->pCaretInfo->y = 0; pWin->pCaretInfo->fBlink = FALSE; pWin->pCaretInfo->fShow = FALSE; pWin->pCaretInfo->hOwner = hWnd; pWin->pCaretInfo->uTime = 500; } SendMessage (HWND_DESKTOP, MSG_CARET_CREATE, (WPARAM)hWnd, 0); return TRUE;}BOOL GUIAPI ActiveCaret (HWND hWnd){ PMAINWIN pWin; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) return FALSE; SendMessage (HWND_DESKTOP, MSG_CARET_CREATE, (WPARAM)hWnd, 0); return TRUE;}BOOL GUIAPI DestroyCaret (HWND hWnd){ PMAINWIN pWin; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) return FALSE; free (pWin->pCaretInfo->pNormal); free (pWin->pCaretInfo->pXored); free (pWin->pCaretInfo); SendMessage (HWND_DESKTOP, MSG_CARET_DESTROY, (WPARAM)hWnd, 0); return TRUE;}UINT GUIAPI GetCaretBlinkTime (HWND hWnd){ PMAINWIN pWin; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) return 0; return pWin->pCaretInfo->uTime;}#define MIN_BLINK_TIME 100 // msBOOL GUIAPI SetCaretBlinkTime (HWND hWnd, UINT uTime){ PMAINWIN pWin; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) return FALSE; if (uTime < MIN_BLINK_TIME) uTime = MIN_BLINK_TIME; pWin->pCaretInfo->uTime = uTime; SendMessage (HWND_DESKTOP, MSG_CARET_CREATE, (WPARAM)hWnd, 0); return TRUE;}BOOL GUIAPI HideCaret (HWND hWnd){ PMAINWIN pWin; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) return FALSE; if (!pWin->pCaretInfo->fBlink) return FALSE; pWin->pCaretInfo->fBlink = FALSE; if (pWin->pCaretInfo->fShow) { HDC hdc; pWin->pCaretInfo->fShow = FALSE; // hide caret immediately hdc = GetClientDC (hWnd); PutSavedBoxOnDC (hdc, pWin->pCaretInfo->x, pWin->pCaretInfo->y, pWin->pCaretInfo->nEffWidth, pWin->pCaretInfo->nEffHeight, pWin->pCaretInfo->pNormal); ReleaseDC (hdc); } return TRUE;}void GetCaretBitmaps (PCARETINFO pCaretInfo){ int i; int sx, sy; // convert to screen coordinates sx = pCaretInfo->x; sy = pCaretInfo->y; ClientToScreen (pCaretInfo->hOwner, &sx, &sy); // save normal bitmap first. SaveScreenBox (sx, sy, pCaretInfo->nEffWidth, pCaretInfo->nEffHeight, pCaretInfo->pNormal); // generate XOR bitmap. if (pCaretInfo->pBitmap) { BYTE* normal; BYTE* bitmap; BYTE* xored; normal = pCaretInfo->pNormal; bitmap = pCaretInfo->pBitmap->bmBits; xored = pCaretInfo->pXored; for (i = 0; i < pCaretInfo->nBytesNr; i++) xored[i] = normal[i] ^ bitmap[i]; } else { BYTE* normal; BYTE* xored; normal = pCaretInfo->pNormal; xored = pCaretInfo->pXored; for (i = 0; i < pCaretInfo->nBytesNr; i++) xored[i] = normal[i] ^ 0xFF; }}BOOL BlinkCaret (HWND hWnd){ PMAINWIN pWin; HDC hdc; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) return FALSE; if (!pWin->pCaretInfo->fBlink) return FALSE; hdc = GetClientDC (hWnd); if (!pWin->pCaretInfo->fShow) { // show caret PutSavedBoxOnDC (hdc, pWin->pCaretInfo->x, pWin->pCaretInfo->y, pWin->pCaretInfo->nEffWidth, pWin->pCaretInfo->nEffHeight, pWin->pCaretInfo->pXored); pWin->pCaretInfo->fShow = TRUE; } else { // hide caret PutSavedBoxOnDC (hdc, pWin->pCaretInfo->x, pWin->pCaretInfo->y, pWin->pCaretInfo->nEffWidth, pWin->pCaretInfo->nEffHeight, pWin->pCaretInfo->pNormal); pWin->pCaretInfo->fShow = FALSE; } ReleaseDC (hdc); return TRUE;}BOOL GUIAPI ShowCaret (HWND hWnd){ PMAINWIN pWin; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) return FALSE; if (pWin->pCaretInfo->fBlink) return FALSE; pWin->pCaretInfo->fBlink = TRUE; GetCaretBitmaps (pWin->pCaretInfo); if (!pWin->pCaretInfo->fShow) { HDC hdc; // show caret immediately hdc = GetClientDC (hWnd); PutSavedBoxOnDC (hdc, pWin->pCaretInfo->x, pWin->pCaretInfo->y, pWin->pCaretInfo->nEffWidth, pWin->pCaretInfo->nEffHeight, pWin->pCaretInfo->pXored); ReleaseDC (hdc); pWin->pCaretInfo->fShow = TRUE; } return TRUE;}BOOL GUIAPI SetCaretPos (HWND hWnd, int x, int y){ PMAINWIN pWin; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) return FALSE; if (pWin->pCaretInfo->fBlink) { if (pWin->pCaretInfo->fShow) { HDC hdc; // hide caret first hdc = GetClientDC (hWnd); PutSavedBoxOnDC (hdc, pWin->pCaretInfo->x, pWin->pCaretInfo->y, pWin->pCaretInfo->nEffWidth, pWin->pCaretInfo->nEffHeight, pWin->pCaretInfo->pNormal); // then update position pWin->pCaretInfo->x = x; pWin->pCaretInfo->y = y; // save normal bitmap first GetCaretBitmaps (pWin->pCaretInfo); // show caret again PutSavedBoxOnDC (hdc, pWin->pCaretInfo->x, pWin->pCaretInfo->y, pWin->pCaretInfo->nEffWidth, pWin->pCaretInfo->nEffHeight, pWin->pCaretInfo->pXored); ReleaseDC (hdc); } else { HDC hdc; // update position pWin->pCaretInfo->x = x; pWin->pCaretInfo->y = y; // save normal bitmap first GetCaretBitmaps (pWin->pCaretInfo); // show caret hdc = GetClientDC (hWnd); PutSavedBoxOnDC (hdc, pWin->pCaretInfo->x, pWin->pCaretInfo->y, pWin->pCaretInfo->nEffWidth, pWin->pCaretInfo->nEffHeight, pWin->pCaretInfo->pXored); ReleaseDC (hdc); pWin->pCaretInfo->fShow = TRUE; } } else { // update position pWin->pCaretInfo->x = x; pWin->pCaretInfo->y = y; } return TRUE;}BOOL GUIAPI ChangeCaretSize (HWND hWnd, int newWidth, int newHeight){ PMAINWIN pWin; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) return FALSE; if (newWidth == pWin->pCaretInfo->nEffWidth && newHeight == pWin->pCaretInfo->nEffHeight) return TRUE; if (newWidth > pWin->pCaretInfo->nWidth || newHeight > pWin->pCaretInfo->nHeight || newWidth <= 0 || newHeight <= 0) return FALSE; if (pWin->pCaretInfo->fBlink) { if (pWin->pCaretInfo->fShow) { HDC hdc; // hide caret first hdc = GetClientDC (hWnd); PutSavedBoxOnDC (hdc, pWin->pCaretInfo->x, pWin->pCaretInfo->y, pWin->pCaretInfo->nEffWidth, pWin->pCaretInfo->nEffHeight, pWin->pCaretInfo->pNormal); // then update size info pWin->pCaretInfo->nEffWidth = newWidth; pWin->pCaretInfo->nEffHeight = newHeight; pWin->pCaretInfo->nBytesNr = newWidth*newHeight*BYTESPERPHYPIXEL; // save normal bitmap first GetCaretBitmaps (pWin->pCaretInfo); // show caret again PutSavedBoxOnDC (hdc, pWin->pCaretInfo->x, pWin->pCaretInfo->y, pWin->pCaretInfo->nEffWidth, pWin->pCaretInfo->nEffHeight, pWin->pCaretInfo->pXored); ReleaseDC (hdc); } else { HDC hdc; // then update size info pWin->pCaretInfo->nEffWidth = newWidth; pWin->pCaretInfo->nEffHeight = newHeight; pWin->pCaretInfo->nBytesNr = newWidth*newHeight*BYTESPERPHYPIXEL; // save normal bitmap first GetCaretBitmaps (pWin->pCaretInfo); // show caret hdc = GetClientDC (hWnd); PutSavedBoxOnDC (hdc, pWin->pCaretInfo->x, pWin->pCaretInfo->y, pWin->pCaretInfo->nEffWidth, pWin->pCaretInfo->nEffHeight, pWin->pCaretInfo->pXored); ReleaseDC (hdc); pWin->pCaretInfo->fShow = TRUE; } } else { // update size info pWin->pCaretInfo->nEffWidth = newWidth; pWin->pCaretInfo->nEffHeight = newHeight; pWin->pCaretInfo->nBytesNr = newWidth*newHeight*BYTESPERPHYPIXEL; } return TRUE;}BOOL GUIAPI GetCaretPos (HWND hWnd, PPOINT pPt){ PMAINWIN pWin; pWin = (PMAINWIN)hWnd; if (!pWin->pCaretInfo) return FALSE; pPt->x = pWin->pCaretInfo->x; pPt->y = pWin->pCaretInfo->y; return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -