void HotKeyInputWindow::ShowCustomCaret() const { AssertCriticalWinApiResult(CreateCaret(windowHandle, (HBITMAP)nullptr, 1, lineHeight)); AssertCriticalWinApiResult(SetCaretPos(currentTextPoistion.GetX(), borderWidth + padding)); AssertCriticalWinApiResult(ShowCaret(windowHandle)); }
int32_t CFDE_TxtEdtEngine::Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLength) { if (IsLocked()) { return FDE_TXTEDT_MODIFY_RET_F_Locked; } CFX_WideString wsTemp; FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nLength); FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR)); ReplaceParagEnd(lpBuffer, nLength, FALSE); wsTemp.ReleaseBuffer(nLength); FX_BOOL bPart = FALSE; if (m_nLimit > 0) { int32_t nTotalLength = GetTextBufLength(); int32_t nCount = m_SelRangePtrArr.GetSize(); for (int32_t i = 0; i < nCount; i++) { FDE_TXTEDTSELRANGE* lpSelRange = m_SelRangePtrArr.GetAt(i); nTotalLength -= lpSelRange->nCount; } int32_t nExpectLength = nTotalLength + nLength; if (nTotalLength == m_nLimit) { return FDE_TXTEDT_MODIFY_RET_F_Full; } if (nExpectLength > m_nLimit) { nLength -= (nExpectLength - m_nLimit); bPart = TRUE; } } if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) || (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) { int32_t nTemp = nLength; if (m_Param.dwMode & FDE_TEXTEDITMODE_Password) { CFX_WideString wsText; while (nLength > 0) { GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); int32_t nTotal = wsText.GetLength(); FX_WCHAR* lpBuf = wsText.GetBuffer(nTotal); for (int32_t i = 0; i < nTotal; i++) { lpBuf[i] = m_wcAliasChar; } wsText.ReleaseBuffer(nTotal); if (IsFitArea(wsText)) { break; } nLength--; } } else { CFX_WideString wsText; while (nLength > 0) { GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); if (IsFitArea(wsText)) { break; } nLength--; } } if (nLength == 0) { return FDE_TXTEDT_MODIFY_RET_F_Full; } if (nLength < nTemp) { bPart = TRUE; } } if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { CFX_WideString wsText; GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); if (!m_Param.pEventSink->On_Validate(this, wsText)) { return FDE_TXTEDT_MODIFY_RET_F_Invalidate; } } if (IsSelect()) { DeleteSelect(); } if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) m_Param.pEventSink->On_AddDoRecord( this, new CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength)); GetText(m_ChangeInfo.wsPrevText, 0); Inner_Insert(m_nCaret, lpBuffer, nLength); m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength); nStart = m_nCaret; nStart += nLength; FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); FX_BOOL bBefore = TRUE; if (wChar != L'\n' && wChar != L'\r') { nStart--; bBefore = FALSE; } SetCaretPos(nStart, bBefore); m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); return bPart ? FDE_TXTEDT_MODIFY_RET_S_Part : FDE_TXTEDT_MODIFY_RET_S_Normal; }
long FAR PASCAL _export WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam) { static char *pBuffer = NULL; static int cxChar, cyChar, cxClient, cyClient, cxBuffer, cyBuffer, xCaret, yCaret; HDC hdc; //handle to device context int x, y, i; PAINTSTRUCT ps; TEXTMETRIC tm; TRACE_STR("ENTER WndProc"); switch(message) { case WM_CREATE : { TRACE_DELIM('='); TRACE_STR("WM_CREATE.."); hdc = GetDC(hwnd); SelectObject (hdc, GetStockObject(SYSTEM_FIXED_FONT)); GetTextMetrics(hdc, &tm); // Suggested character width for all chars in fixed width font... cxChar = tm.tmAveCharWidth; // character height cyChar = tm.tmHeight; ReleaseDC (hwnd,hdc); TRACE_STR("EXIT WM_CREATE.."); TRACE_STR("EXIT WndProc"); return 0; } case WM_SIZE: { TRACE_STR("WM_SIZE.."); // current window size in pixels... cyClient = HIWORD(lParam); cxClient = LOWORD(lParam); TRACE_INT(cxClient); TRACE_INT(cyClient); //Window size in characters in current font... cxBuffer = max(1,cxClient/cxChar); cyBuffer = max(1,cyClient/cyChar); TRACE_INT(cxBuffer); TRACE_INT(cyBuffer); if (pBuffer != NULL) free(pBuffer); if ( ( ((LONG) (cxBuffer * cyBuffer)) > 65535L ) || ((pBuffer = (char *) malloc (cxBuffer * cyBuffer)) == NULL) ) { MessageBox (hwnd, "Window too large. Cannot" "Allocate enough memory.", "Type", MB_ICONEXCLAMATION | MB_OK ); } else { TRACE_FARP(pBuffer); for (y=0; y < cyBuffer ; y++) for (x = 0; x < cxBuffer ; x++) BUFFER(x,y) = ' '; } xCaret = 0; yCaret = 0; if (hwnd == GetFocus()) { SetCaretPos (xCaret * cxChar, yCaret * cyChar); } TRACE_STR("EXIT WM_SIZE.."); TRACE_STR("EXIT WndProc"); return 0; } case WM_SETFOCUS : { TRACE_STR("ENTER WM_SETFOCUS.."); CreateCaret(hwnd, NULL, cxChar, cyChar); SetCaretPos(xCaret * cxChar, yCaret * cyChar); ShowCaret(hwnd); TRACE_STR("EXIT WM_SETFOCUS.."); TRACE_STR("EXIT WndProc"); return 0; } case WM_KEYDOWN : { TRACE_STR("ENTER WM_KEYDOWN..."); TRACE_INT(wParam); switch(wParam) { case VK_HOME: { xCaret = 0; break; } case VK_END: { xCaret = cxBuffer - 1; break; } case VK_PRIOR: { yCaret = 0; break; } case VK_NEXT: { yCaret = cyBuffer - 1; break; } case VK_LEFT: { xCaret = max(xCaret - 1, 0); break; } case VK_RIGHT: { xCaret = min(xCaret + 1, cxBuffer - 1); break; } case VK_UP: { yCaret = max(yCaret - 1, 0); break; } case VK_DOWN: { yCaret = min(yCaret + 1, cyBuffer - 1); break; } case VK_DELETE: { for (x = xCaret ; x < cxBuffer; x++) BUFFER(x,yCaret) = BUFFER(x+1, yCaret); BUFFER(cxBuffer - 1, yCaret) = ' '; HideCaret(hwnd); hdc = GetDC(hwnd); SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); TextOut(hdc, xCaret * cxChar, yCaret * cyChar, &BUFFER(xCaret,yCaret), cxBuffer - xCaret ); ShowCaret(hwnd); ReleaseDC(hwnd, hdc); break; } } SetCaretPos(xCaret*cxChar, yCaret*cyChar); TRACE_STR("EXIT WM_KEYDOWN..."); TRACE_STR("EXIT WndProc"); return 0; } case WM_CHAR : { TRACE_STR("ENTER WM_CHAR..."); TRACE_INT(wParam); for (i = 0; i < (int) LOWORD(lParam) ; i++) { switch(wParam) { case '\b': //backspace { TRACE_STR(">>BACKSPACE.."); if(xCaret > 0) { xCaret--; SendMessage(hwnd, WM_KEYDOWN, VK_DELETE, 1L ); } TRACE_STR(">>END BACKSPACE.."); break; } case '\t': //tab { TRACE_STR(">>TAB.."); // EXTREMELY curious! do { // this is acted upon immediately! // it calls WndProc for 'hwnd' with the indicated // message/wParam/lParam... SendMessage(hwnd, WM_CHAR, ' ', 1L ); } while (xCaret % 8 != 0); TRACE_STR(">>END TAB.."); break; } case '\n': //linefeed { TRACE_STR(">>LINEFEED.."); if (++yCaret == cyBuffer) yCaret = 0; TRACE_STR(">>END LINEFEED.."); break; } case '\r': //carraige return { TRACE_STR(">>CARRAIGE RETURN.."); xCaret = 0; if (++yCaret == cyBuffer) yCaret = 0; TRACE_STR(">>END CARRAIGE RETURN.."); break; } case '\x1B': //excape (!) { TRACE_STR(">>ESCAPE..."); for(y=0;y<cyBuffer; y++) { for(x=0; x<cxBuffer; x++) { BUFFER(x,y) = ' '; } } xCaret = 0; yCaret = 0; InvalidateRect(hwnd,NULL,FALSE); TRACE_STR(">>END ESCAPE..."); break; } default : { TRACE_STR(">>default..."); BUFFER(xCaret,yCaret) = (char) wParam; HideCaret(hwnd); hdc = GetDC(hwnd); SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); TextOut(hdc, xCaret*cxChar, yCaret*cyChar, &BUFFER(xCaret,yCaret), 1); ShowCaret(hwnd); ReleaseDC(hwnd,hdc); if(++xCaret == cxBuffer) { xCaret = 0; if(++yCaret == cyBuffer) yCaret = 0; } TRACE_STR(">>END default..."); break; } } } SetCaretPos (xCaret * cxChar, yCaret * cyChar); TRACE_STR("EXIT WM_CHAR..."); TRACE_STR("EXIT WndProc"); return 0; } case WM_PAINT : { TRACE_STR("WM_PAINT.."); // Invalidate the entire client area and erase it.... //get the device context handle for use in painting the sucker... hdc = BeginPaint(hwnd, &ps); // set up the font as fixed width font... SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); for (y = 0; y<cyBuffer; y++) { TextOut(hdc, 0, y * cyChar, &BUFFER(0,y), cxBuffer); } EndPaint (hwnd, &ps); TRACE_STR("EXIT WM_PAINT..."); TRACE_STR("EXIT WndProc"); return 0; } case WM_DESTROY : { // insert a WM_QUIT in the queue... TRACE_STR("WM_DESTROY.."); PostQuitMessage (0); TRACE_STR("EXIT WndProc"); return 0; } }//switch TRACE_STR("EXIT WndProc"); return DefWindowProc (hwnd, message, wParam, lParam); } //WndProc
void CBSumCaret::CaretPos() { SetCaretPos ( (int)(m_XPosition - m_ScrollXPosition), (int)(m_YPosition - m_ScrollYPosition) ); // for status bar updates }
/*********************************************************************** * UpdateStuff * * Update scroll info (if needed) and set caret position * * ARGUMENTS: * - do we need to update scroll info * bool isFixScroll * RETURNS: none */ static void UpdateStuff(bool isFixScroll) { SCROLLINFO vert_scroll_info, horz_scroll_info; if (isFixScroll) { // Get vertical scroll info vert_scroll_info.cbSize = sizeof(vert_scroll_info); vert_scroll_info.fMask = SIF_ALL; GetScrollInfo(Globals.hMainWnd, SB_VERT, &vert_scroll_info); // Get horizontal scroll info horz_scroll_info.cbSize = sizeof(horz_scroll_info); horz_scroll_info.fMask = SIF_ALL; GetScrollInfo(Globals.hMainWnd, SB_HORZ, &horz_scroll_info); //SendMessage(hWnd, WM_VSCROLL, SB_THUMBTRACK, MAKELONG(0, MAKEWORD(0, 222))); // Fix vertical scroll if (Globals.CaretCurLine == vert_scroll_info.nPos + vert_scroll_info.nPage) { SendMessage(Globals.hMainWnd, WM_VSCROLL, SB_LINEDOWN, 0); } else if (Globals.CaretCurLine > vert_scroll_info.nPos + vert_scroll_info.nPage) { int vert_pos = vert_scroll_info.nPos; vert_scroll_info.nPos = Globals.CaretCurLine - vert_scroll_info.nPage + 1; vert_scroll_info.fMask = SIF_POS; SetScrollInfo(Globals.hMainWnd, SB_VERT, &vert_scroll_info, true); ScrollWindow(Globals.hMainWnd, 0, Globals.CharH * (vert_pos - vert_scroll_info.nPos), NULL, NULL); UpdateWindow(Globals.hMainWnd); } else if (Globals.CaretCurLine == vert_scroll_info.nPos - 1) { SendMessage(Globals.hMainWnd, WM_VSCROLL, SB_LINEUP, 0); } else if (Globals.CaretCurLine < vert_scroll_info.nPos) { int vert_pos = vert_scroll_info.nPos; vert_scroll_info.nPos = Globals.CaretCurLine; vert_scroll_info.fMask = SIF_POS; SetScrollInfo(Globals.hMainWnd, SB_VERT, &vert_scroll_info, true); ScrollWindow(Globals.hMainWnd, 0, Globals.CharH * (vert_pos - vert_scroll_info.nPos), NULL, NULL); UpdateWindow(Globals.hMainWnd); } // Fix horizontal scroll if (!Globals.isWrapLongLines) { if (Globals.CaretCurPos == horz_scroll_info.nPos + horz_scroll_info.nPage) { SendMessage(Globals.hMainWnd, WM_HSCROLL, SB_LINERIGHT, 0); } else if (Globals.CaretCurPos > horz_scroll_info.nPos + horz_scroll_info.nPage) { int horz_pos = horz_scroll_info.nPos; horz_scroll_info.nPos = Globals.CaretCurPos - horz_scroll_info.nPage + 1; horz_scroll_info.fMask = SIF_POS; SetScrollInfo(Globals.hMainWnd, SB_HORZ, &horz_scroll_info, true); ScrollWindow(Globals.hMainWnd, Globals.CharW * (horz_pos - horz_scroll_info.nPos), 0, NULL, NULL); UpdateWindow(Globals.hMainWnd); } else if (Globals.CaretCurPos == horz_scroll_info.nPos - 1) { SendMessage(Globals.hMainWnd, WM_HSCROLL, SB_LINELEFT, 0); } else if (Globals.CaretCurPos < horz_scroll_info.nPos) { int horz_pos = horz_scroll_info.nPos; horz_scroll_info.nPos = Globals.CaretCurPos; horz_scroll_info.fMask = SIF_POS; SetScrollInfo(Globals.hMainWnd, SB_HORZ, &horz_scroll_info, true); ScrollWindow(Globals.hMainWnd, Globals.CharW * (horz_pos - horz_scroll_info.nPos), 0, NULL, NULL); UpdateWindow(Globals.hMainWnd); } } } // Get vertical scroll info vert_scroll_info.cbSize = sizeof(vert_scroll_info); vert_scroll_info.fMask = SIF_ALL; GetScrollInfo(Globals.hMainWnd, SB_VERT, &vert_scroll_info); // Get horizontal scroll info horz_scroll_info.cbSize = sizeof(horz_scroll_info); horz_scroll_info.fMask = SIF_ALL; GetScrollInfo(Globals.hMainWnd, SB_HORZ, &horz_scroll_info); SetCaretPos((Globals.CaretCurPos - horz_scroll_info.nPos) * Globals.CharW, (Globals.CaretCurLine - vert_scroll_info.nPos) * Globals.CharH); }
//window message process function LRESULT SLEditCtrlProc( HWND hWnd, int iMsg, WPARAM wParam, LPARAM lParam ) { PWindowsTree pWin; char* buffer; POINT point; PSLEditData pEditData; HPEN hPen; HBRUSH hBrush; COLORREF crColor; PWNDCLASSEX pWndClass; LRESULT res; char* passwdchar; int dispLen,len,iBorder; char* dispBuffer; HDC hDC; RECT rect; PAINTSTRUCT ps; pWin = (PWindowsTree)hWnd; switch(iMsg){ case LMSG_CREATE: pWin = (PWindowsTree)hWnd; pEditData = (void*)malloc(sizeof(SLEditData)); if(!pEditData) return false; if (!CreateCaret (hWnd, NULL, 1, GetSysCharHeight())){ printerror ("EDIT: Create Caret error!\n"); free (pEditData); return -1; } memset(pEditData,0,sizeof(SLEditData)); pEditData->iBufferLen = LEN_EDITBOX_BUFFER; pEditData->passwdChar = '*'; pEditData->iLeftMargin = MARGIN_EDIT_LEFT; pEditData->iTopMargin = MARGIN_EDIT_TOP; pEditData->iRightMargin = MARGIN_EDIT_RIGHT; pEditData->iBottomMargin = MARGIN_EDIT_BOTTOM; // memcpy (pEditData->buffer, pWin->lpszCaption,min (pEditData->iBufferLen, strlen(pWin->lpszCaption)+1); strncpy (pEditData->buffer, pWin->lpszCaption,pEditData->iBufferLen-1);//modify pWin->rect.bottom = pWin->rect.top + GetSysCharHeight() + MARGIN_EDIT_TOP + MARGIN_EDIT_BOTTOM + 2 * wndGetBorder(hWnd); pWin->dwData = (DWORD)pEditData; SetTimer(hWnd,1,50); break; case LMSG_TIMER: BlinkCaret(hWnd); break; case LMSG_DESTROY: free((void*)(pWin->dwData)); DestroyCaret(hWnd); KillTimer(hWnd,1); break; case LMSG_ERASEBKGND: pWndClass=GetRegClass(pWin->lpszClassName); if(!pWndClass) return (LRESULT)NULL; //is Enable ? hBrush=pWndClass->hbrBackground; crColor=((BRUSH*)hBrush)->crBrushColor; if(!IsEnable(hWnd)) ((BRUSH*)hBrush)->crBrushColor=RGB_SYSTEMLTGRAY; else ((BRUSH*)hBrush)->crBrushColor=RGB_SYSTEMWHITE; res=DefWindowProc(hWnd, iMsg, wParam, lParam); ((BRUSH*)hBrush)->crBrushColor=crColor; return res; case LMSG_KILLFOCUS: pEditData = (PSLEditData) (pWin->dwData); pEditData->dwStatus &= ~EST_FOCUSED; HideCaret (hWnd); NotifyParent (hWnd, EN_KILLFOCUS); break; case LMSG_SETFOCUS: pEditData = (PSLEditData) (pWin->dwData); if (pEditData->dwStatus & EST_FOCUSED) return 0; pEditData->dwStatus |= EST_FOCUSED; SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); ShowCaret (hWnd); NotifyParent (hWnd, EN_SETFOCUS); break; case LMSG_GETTEXTLENGTH: pEditData = (PSLEditData) (pWin->dwData); return pEditData->iDataLen; case LMSG_GETTEXT: buffer = (char*)lParam; pEditData = (PSLEditData) (pWin->dwData); len = min ((int)wParam, pEditData->iDataLen); memcpy (buffer, pEditData->buffer, len); buffer [len] = '\0'; return len; case LMSG_SETTEXT: pEditData = (PSLEditData)(pWin->dwData); if(pWin->dwStyle & ES_READONLY) return 0; pEditData = (PSLEditData) (pWin->dwData); len = min (strlen ((char*)lParam), pEditData->iBufferLen); pEditData->iDataLen = len; memcpy (pEditData->buffer, (char*)lParam, len); pEditData->iEditPos = 0; pEditData->iCaretPos = 0; pEditData->iStartPos = 0; if (pEditData->dwStatus & EST_FOCUSED) SetCaretPos (hWnd, pEditData->iLeftMargin, pEditData->iTopMargin); InvalidateRect (hWnd, NULL, TRUE); break; case EM_SETREADONLY: if (wParam) pWin->dwStyle |= ES_READONLY; else pWin->dwStyle &= ~ES_READONLY; break; case EM_SETPASSWORDCHAR: pEditData = (PSLEditData) (pWin->dwData); if (pEditData->passwdChar != (char)wParam) { if (pEditData->dwStatus & ES_PASSWORD) { pEditData->passwdChar = (char)wParam; InvalidateRect (hWnd, NULL, TRUE); } } break; case EM_GETPASSWORDCHAR: pEditData = (PSLEditData) (pWin->dwData); passwdchar = (char*) lParam; *passwdchar = pEditData->passwdChar; break; case LMSG_PENDOWN: { int x,y; int iRet; CaptureMouse(hWnd,BYCLIENT); pEditData = (PSLEditData) (pWin->dwData); x = (int)wParam; y = (int)lParam; ScreenToClient(hWnd, &x,&y); iRet = edtGetCaretPos (pEditData, x); //printf("%d\n",x); if (iRet != pEditData->iCaretPos) { pEditData->iEditPos += iRet - pEditData->iCaretPos; pEditData->iCaretPos = iRet; SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); } NotifyParent(hWnd,EN_CLICKED); break; } case LMSG_PENUP: DisCaptureMouse(); break; case LMSG_ENABLE: if((BOOL)wParam)///Enable pWin->dwStyle &=~WS_DISABLE; else//Disable pWin->dwStyle |=WS_DISABLE; break; case LMSG_NCPAINT: GetWindowRect(hWnd,&rect); SetRect(&rect,0,0,rect.right-rect.left,rect.bottom-rect.top); if(IsBorder(hWnd)){ hDC = (HDC)wParam; if(!hDC) return false; hPen=CreatePen(PS_SOLID,1,RGB(88,87,81)); SelectObject(hDC,hPen); DeleteObject(hPen); winMoveToEx(hDC,rect.left,rect.top,&point); winLineTo(hDC,rect.right,rect.top); winMoveToEx(hDC,rect.left,rect.top,&point); winLineTo(hDC,rect.left,rect.bottom); hPen=GetStockObject(LTGRAY_PEN); SelectObject(hDC,hPen); DeleteObject(hPen); winMoveToEx(hDC,rect.right,rect.top+1,&point); winLineTo(hDC,rect.right,rect.bottom); winMoveToEx(hDC,rect.right,rect.bottom,&point); winLineTo(hDC,rect.left,rect.bottom); } break; case LMSG_PAINT: ps.bPaintDirect=false; hDC=BeginPaint(hWnd, &ps); if(!hDC){ return true; } if(IsFocus(hWnd)){ HideCaret(hWnd); } GetWindowRect(hWnd,&rect); SetRect(&rect,0,0,rect.right-rect.left,rect.bottom-rect.top); pEditData = (PSLEditData) (pWin->dwData); iBorder = wndGetBorder(hWnd); InflateRect(&rect,(-1)*iBorder,(-1)*iBorder); dispLen = GetEditBoxDispLen (hWnd); if (dispLen == 0) { EndPaint(hWnd, &ps); break; } dispBuffer = malloc (dispLen + 1); if (pWin->dwStyle & ES_PASSWORD) memset (dispBuffer, '*', dispLen); else memcpy (dispBuffer, pEditData->buffer + pEditData->iStartPos, dispLen); dispBuffer [dispLen] = '\0'; rect.left += pEditData->iLeftMargin; rect.top += pEditData->iTopMargin; rect.right -= pEditData->iRightMargin; rect.bottom -= pEditData->iBottomMargin; DrawText(hDC,dispBuffer,strlen(dispBuffer),&rect,DT_LEFT); free(dispBuffer);//modify,this is added EndPaint(hWnd, &ps); if(IsFocus(hWnd)){ ShowCaret(hWnd); SetTimer(hWnd,1,50); } break; //keydown process case LMSG_KEYDOWN: edtProcessKeyDown(hWnd,wParam,lParam); break; case LMSG_CHAR: edtProcessChar(hWnd,wParam,lParam); break; default: return DefWindowProc(hWnd, iMsg, wParam, lParam); } return 0; }
static int edtProcessChar( HWND hWnd, WPARAM wParam, LPARAM lParam ) { PWindowsTree pWin; PSLEditData pEditData; char charBuffer[2]; int chars, inserting, scrollStep, iLimit; RECT InvRect; int i; pWin = (PWindowsTree)hWnd; pEditData = (PSLEditData) (pWin->dwData); if (pWin->dwStyle & ES_READONLY) { return 0; } if (HIBYTE (wParam)) { charBuffer [0] = LOBYTE (wParam); charBuffer [1] = HIBYTE (wParam); chars = 2; } else { charBuffer [0] = LOBYTE (wParam); chars = 1; } if (chars == 1) { switch (charBuffer [0]){ case 0x00: // NULL case 0x07: // BEL case 0x08: // BS case 0x09: // HT case 0x0A: // LF case 0x0B: // VT case 0x0C: // FF case 0x0D: // CR case 0x1B: // Escape return 0; } } if (pEditData->dwStatus & EST_REPLACE) { if (pEditData->iDataLen == pEditData->iEditPos) inserting = chars; else if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iEditPos)) { if (chars == 2) inserting = 0; else inserting = -1; } else { if (chars == 2) inserting = 1; else inserting = 0; } } else inserting = chars; // check space if (pEditData->iDataLen + inserting > pEditData->iBufferLen) { NotifyParent(hWnd,EN_MAXTEXT); return 0; } if (inserting == -1) { for (i = pEditData->iEditPos; i < pEditData->iDataLen-1; i++) pEditData->buffer [i] = pEditData->buffer [i + 1]; } else if (inserting > 0) { for (i = pEditData->iDataLen + inserting - 1; i > pEditData->iEditPos + inserting - 1;i--) pEditData->buffer [i] = pEditData->buffer [i - inserting]; } for (i = 0; i < chars; i++) pEditData->buffer [pEditData->iEditPos + i] = charBuffer [i]; pEditData->iEditPos += chars; pEditData->iCaretPos += chars; pEditData->iDataLen += inserting; iLimit = pWin->rect.right - pWin->rect.left + 1 - 2 * wndGetBorder(hWnd) - pEditData->iLeftMargin - pEditData->iRightMargin; if (pEditData->iCaretPos * GetSysCharWidth () > iLimit){ if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iStartPos)) scrollStep = 2; else { if (chars == 2) { if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iStartPos + 1)) scrollStep = 3; else scrollStep = 2; } else scrollStep = 1; } pEditData->iStartPos += scrollStep; pEditData->iCaretPos = pEditData->iEditPos - pEditData->iStartPos; InvRect.left = pEditData->iLeftMargin; InvRect.top = pEditData->iTopMargin; InvRect.right = pWin->rect.right - pWin->rect.left; InvRect.bottom = pWin->rect.bottom - pWin->rect.top; } else { InvRect.left = pEditData->iLeftMargin + (pEditData->iCaretPos - chars) * GetSysCharWidth (); InvRect.top = pEditData->iTopMargin; InvRect.right = pWin->rect.right - pWin->rect.left; InvRect.bottom = pWin->rect.bottom - pWin->rect.top; } SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); InvalidateRect (hWnd, &InvRect, TRUE); NotifyParent (hWnd, EN_CHANGE); return 0; }
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { POINT pt; switch(msg) { case WM_ACTIVATE: switch(LOWORD(wParam)) { case WA_ACTIVE: case WA_CLICKACTIVE: if(!ShowCaret(hWnd)) DbgPrint("ShowCaret(0x%x)\n", hWnd); break; case WA_INACTIVE: if(!HideCaret(hWnd)) DbgPrint("HideCaret(0x%x)\n", hWnd); break; } break; case WM_KEYDOWN: if(!GetCaretPos(&pt)) { DbgPrint("GetCaretPos() failed!\n"); break; } switch(wParam) { case VK_LEFT: pt.x -= CharWidth; break; case VK_UP: pt.y -= CharHeight; break; case VK_RIGHT: pt.x += CharWidth; break; case VK_DOWN: pt.y += CharHeight; break; } if(!SetCaretPos(pt.x, pt.y)) DbgPrint("SetCaretPos() failed!\n"); break; case WM_RBUTTONDOWN: if(!CreateCaret(hWnd, CaretBitmap, 0, 0)) DbgPrint("CreateCaret() for window 0x%x failed!\n", hWnd); else if(!ShowCaret(hWnd)) DbgPrint("ShowCaret(0x%x)\n", hWnd); break; case WM_LBUTTONDOWN: if(!CreateCaret(hWnd, (HBITMAP)0, CaretWidth, CaretHeight)) DbgPrint("CreateCaret() for window 0x%x failed!\n", hWnd); else if(!ShowCaret(hWnd)) DbgPrint("ShowCaret(0x%x)\n", hWnd); break; case WM_CREATE: if(!CreateCaret(hWnd, (HBITMAP)0, CaretWidth, CaretHeight)) DbgPrint("CreateCaret() for window 0x%x failed!\n", hWnd); else if(!SetCaretPos(1, 1)) DbgPrint("SetCaretPos(%i, %i) failed!\n", 1, 1); break; case WM_DESTROY: if(!DestroyCaret()) DbgPrint("DestroyCaret() failed!\n"); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; }
//-------------------------------------------------------------------------- // 功能:窗口函数(处理消息) //-------------------------------------------------------------------------- int KWndEdit::WndProc(unsigned int uMsg, unsigned int uParam, int nParam) { int nRet = 0; if (m_Flag & WNDEDIT_ES_WIN32_WND) { if (uMsg == WM_KEYDOWN) nRet = OnKeyDownWin32(uParam, nParam); if (uMsg == WND_M_SET_FOCUS) Win32Edit_SetFocus(m_hWin32Wnd, true); else if (uMsg == WND_M_KILL_FOCUS) Win32Edit_SetFocus(m_hWin32Wnd, false); return 0; } switch(uMsg) { case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: if (IsVisible() && Wnd_GetFocusWnd() != (KWndWindow*)this) { Wnd_SetFocusWnd((KWndWindow*)this); } else nRet = KWndWindow::WndProc(uMsg, uParam, nParam); break; case WM_IME_CHAR: case WM_CHAR: if ((m_Flag & WNDEDIT_F_HAVE_FOCUS) && ((m_Style & WND_S_DISABLE) == 0)) { if (InsertChar(uParam)) UpdateData(); nRet = 1; } break; case WM_KEYDOWN: if (!IsDisable()) nRet = OnKeyDown(uParam, nParam); break; case WND_M_SET_FOCUS: if (m_pText) { if (m_Flag & WNDEDIT_ES_IME_AVAILABLE) { s_Ime.EnableLanguageChange(); if (s_LastTimeIsIme) s_Ime.OpenIME(); } // m_nCaretPos = m_nTextLen; //把光标位置设在文本末尾 m_Flag |= WNDEDIT_F_HAVE_FOCUS; m_nCaretTime = 0; // CreateCaret(::g_GetMainHWnd(), (HBITMAP)NULL, 2, m_nFontSize); m_nCaretX = m_nAbsoluteLeft; m_nCaretY = m_nAbsoluteTop; SetCaretPos(m_nCaretX, m_nCaretY); s_Ime.SetCaretPos(m_nCaretX, m_nCaretY); // ShowCaret(::g_GetMainHWnd()); } break; case WND_M_KILL_FOCUS: // DestroyCaret(); if (m_Flag & WNDEDIT_ES_IME_AVAILABLE) s_LastTimeIsIme = s_Ime.IsIme(); s_Ime.DisableLanguageChange(); s_Ime.CloseIME(); m_Flag &= ~WNDEDIT_F_HAVE_FOCUS; break; case WM_SYSKEYDOWN: if (m_pParentWnd) nRet = m_pParentWnd->WndProc(uMsg, uParam, nParam); break; case WM_MOUSEWHEEL: if (!IsDisable()) { int zDelta = GET_Y_LPARAM(uParam); if (zDelta != 0) nRet = OnKeyDown(zDelta < 0 ? VK_DOWN : VK_UP, 0); } break; case WM_MOVING: case WM_MOVE: { if (m_Flag & WNDEDIT_ES_WIN32_WND) { Win32Edit_UpdateSizePos(m_hWin32Wnd, m_nAbsoluteLeft, m_nAbsoluteTop, m_Width, m_Height); break; } } default: nRet = KWndWindow::WndProc(uMsg, uParam, nParam); break; } return nRet; }
// ======================================= // 정의 : CGraphicManager::Caret(int x, int y, const std::string& s) // 동작 : 커서 출력 void CGraphicManager::Caret(int x, int y, const std::string& s) { SIZE size; GetTextExtentPoint(MemoryDC, s.c_str(), s.size(), &size); SetCaretPos(x + size.cx, y); }
/* need to add extended codes */ int text_getch(TW *tw) { MSG msg; int ch; text_to_cursor(tw); tw->bGetCh = TRUE; if (tw->bFocus) { SetCaretPos(tw->CursorPos.x*tw->CharSize.x - tw->ScrollPos.x, tw->CursorPos.y*tw->CharSize.y + tw->CharAscent - tw->CaretHeight - tw->ScrollPos.y); ShowCaret(tw->hwnd); } #ifdef WINDOWS_NO_UNICODE while (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_NOREMOVE)) { if (GetMessage(&msg, (HWND)NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } #else while (PeekMessageW(&msg, (HWND)NULL, 0, 0, PM_NOREMOVE)) { if (GetMessageW(&msg, (HWND)NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessageW(&msg); } } #endif if (tw->quitnow) return EOF; /* window closed */ while (!text_kbhit(tw)) { if (!tw->quitnow) { #ifdef WINDOWS_NO_UNICODE if (GetMessage(&msg, (HWND)NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } #else if (GetMessageW(&msg, (HWND)NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessageW(&msg); } #endif } else return EOF; /* window closed */ } ch = *tw->KeyBufOut++; if (ch=='\r') ch = '\n'; if (tw->KeyBufOut - tw->KeyBuf >= tw->KeyBufSize) tw->KeyBufOut = tw->KeyBuf; /* wrap around */ if (tw->bFocus) HideCaret(tw->hwnd); tw->bGetCh = FALSE; return ch; }
void update_cursor(void) { SetCaretPos(last_col * char_width, last_line * char_height); ShowCaret(hwnd); }
DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetCaretPos(ITextHost *iface, INT x, INT y) { return SetCaretPos(x, y); }
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static int cxChar, cyChar; static int xCaret, yCaret; static int cxClient, cyClient; static int cxBuffer, cyBuffer; static DWORD dwCharSet = DEFAULT_CHARSET; static TCHAR *szBuffer; HDC hdc; PAINTSTRUCT ps; TEXTMETRIC tm; int x, y; int j; switch(uMsg) { case WM_INPUTLANGCHANGE: case WM_CREATE: if(uMsg == WM_INPUTLANGCHANGE) { dwCharSet = wParam ; } hdc = GetDC (hwnd) ; SelectObject (hdc, CreateFont (0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)) ; GetTextMetrics (hdc, &tm) ; cxChar = tm.tmAveCharWidth ; cyChar = tm.tmHeight ; DeleteObject (SelectObject (hdc, GetStockObject (SYSTEM_FONT))) ; ReleaseDC (hwnd, hdc) ; for (x = 0; x < cxBuffer; ++x) for(y=0; y < cyBuffer; ++y) BUFFER(x, y) = ' '; xCaret = 0; yCaret = 0; if (hwnd == GetFocus()) { SetCaretPos(xCaret * cxChar, yCaret * cyChar); } InvalidateRect(hwnd, NULL, TRUE); return 0; case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); cxBuffer = cxClient / cxChar; cyBuffer = cyClient / cyChar; if (szBuffer != NULL) { free(szBuffer); } szBuffer = (TCHAR *)malloc(cxBuffer * cyBuffer * sizeof(TCHAR)); for (x = 0; x < cxBuffer; ++x) for(y=0; y < cyBuffer; ++y) BUFFER(x, y) = ' '; xCaret = 0; yCaret = 0; if (hwnd == GetFocus()) { SetCaretPos(xCaret * cxChar, yCaret * cyChar); } InvalidateRect(hwnd, NULL, TRUE); return 0; case WM_SETFOCUS: { CreateCaret (hwnd, NULL, cxChar, cyChar) ; SetCaretPos (xCaret * cxChar, yCaret * cyChar) ; ShowCaret (hwnd) ; return 0 ; } case WM_KILLFOCUS: { HideCaret (hwnd) ; DestroyCaret () ; return 0 ; } case WM_KEYDOWN: { switch(wParam) { case VK_DELETE: for (x = xCaret; x < cxBuffer -1; ++x) { BUFFER(x, yCaret) = BUFFER(x+1, yCaret); } BUFFER(cxBuffer-1, yCaret) = ' '; hdc = GetDC(hwnd); HideCaret(hwnd); SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)); TextOut(hdc, xCaret * cxChar, yCaret * cyChar, &BUFFER(xCaret, yCaret), cxBuffer - xCaret); DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT))); ShowCaret(hwnd); ReleaseDC(hwnd, hdc); break; case VK_UP: if (yCaret > 0) yCaret--; break; case VK_DOWN: if (yCaret < cyBuffer - 1) yCaret++; break; case VK_LEFT: if (xCaret > 0) xCaret--; break; case VK_RIGHT: if (xCaret < cxBuffer - 1) xCaret++; break; case VK_HOME: xCaret = 0; break; case VK_END: xCaret = cxBuffer - 1; break; case VK_PRIOR: yCaret = 0; break; case VK_NEXT: yCaret = cyBuffer - 1; break; default: break; } SetCaretPos(xCaret*cxChar, yCaret*cyChar); return 0; } case WM_CHAR: { for (j = 0; j < LOWORD(lParam); ++j) { hdc = GetDC(hwnd); HideCaret(hwnd); switch(wParam) { // Ctrl + Enter case '\n': { if (++yCaret == cyBuffer) { yCaret = 0; } break; } //Enter case '\r': { xCaret = 0; if (++yCaret == cyBuffer) { yCaret = 0; } break; } case '\t': { do { SendMessage(hwnd, WM_CHAR, ' ', 1); } while(xCaret % 8); break; } case '\b': //backspace { if (xCaret > 0) { xCaret--; SendMessage(hwnd, WM_KEYDOWN, VK_DELETE, 1); } break; } case '\x1B': //Escape { for (x = 0; x < cxBuffer; ++x) { for (y = 0; y < cyBuffer; ++y) { BUFFER(x, y) = ' '; } } xCaret = 0; yCaret = 0; SetCaretPos(xCaret * cxChar, yCaret * cyChar); InvalidateRect(hwnd, NULL, TRUE); break; } default: { BUFFER(xCaret, yCaret) = (TCHAR)wParam; SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)); TextOut(hdc, xCaret * cxChar, yCaret * cyChar, &BUFFER(xCaret, yCaret), sizeof(BUFFER(xCaret, yCaret))/sizeof(TCHAR)); DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT))); xCaret++; break; } } if (xCaret >= cxBuffer) { xCaret = 0; yCaret++; } if (yCaret >= cyBuffer) { yCaret = 0; } SetCaretPos(xCaret * cxChar, yCaret * cyChar); ReleaseDC(hwnd, hdc); ShowCaret(hwnd); } return 0; } case WM_PAINT: { hdc = BeginPaint(hwnd, &ps); SelectObject (hdc, CreateFont (0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)) ; for (y = 0; y < cyBuffer; ++y) { TextOut(hdc, 0, y * cyChar, &szBuffer[y*cxBuffer], cxBuffer); } DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT))); EndPaint(hwnd, &ps); break; } case WM_DESTROY: { PostQuitMessage(0); return 0; } default: { break; } } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
void IntDrawScrollBar(HWND Wnd, HDC DC, INT Bar) { INT ThumbSize; SCROLLBARINFO Info; BOOL Vertical; /* * Get scroll bar info. */ switch (Bar) { case SB_HORZ: Vertical = FALSE; break; case SB_VERT: Vertical = TRUE; break; case SB_CTL: Vertical = (GetWindowLongPtrW(Wnd, GWL_STYLE) & SBS_VERT) != 0; break; default: return; } if (! IntGetScrollBarInfo(Wnd, Bar, &Info)) { return; } if (IsRectEmpty(&Info.rcScrollBar)) { return; } ThumbSize = Info.xyThumbBottom - Info.xyThumbTop; /* * Draw the arrows. */ if (Info.dxyLineButton) { IntDrawScrollArrows(DC, &Info, Vertical); } /* * Draw the interior. */ IntDrawScrollInterior(Wnd, DC, Bar, Vertical, &Info); /* * If scroll bar has focus, reposition the caret. */ if (Wnd == GetFocus() && SB_CTL == Bar) { if (Vertical) { SetCaretPos(Info.rcScrollBar.top + 1, Info.dxyLineButton + 1); } else { SetCaretPos(Info.dxyLineButton + 1, Info.rcScrollBar.top + 1); } } }
LONG WINAPI FaderWndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) ///////////////////////////////////////////////////////////////////////////// { PAINTSTRUCT ps; PFADERINFO pFI = (PFADERINFO)GetWindowLong( hWnd, GWL_USERDATA ); HWND hParentWnd = GetParent( hWnd ); switch( iMessage ) { case WM_GETDLGCODE: return( DLGC_WANTARROWS ); case WM_SETFOCUS: if( pFI ) { CreateCaret( hWnd, (HBITMAP)1, pFI->bmFader.bmWidth - 5, pFI->bmFader.bmHeight - CARET_OFFSET ); SetCaretPos( pFI->nBitmapX + 2, pFI->nBitmapPos + (CARET_OFFSET/2) ); ShowCaret( hWnd ); pFI->bHasFocus = TRUE; } break; case WM_KILLFOCUS: if( pFI ) pFI->bHasFocus = FALSE; HideCaret( hWnd ); DestroyCaret(); break; case WM_APPCOMMAND: switch( GET_APPCOMMAND_LPARAM(lParam) ) { case APPCOMMAND_VOLUME_MUTE: PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_BOTTOM, (LPARAM)hWnd ); return( TRUE ); case APPCOMMAND_VOLUME_UP: PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_LINEUP, (LPARAM)hWnd ); return( TRUE ); case APPCOMMAND_VOLUME_DOWN: PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_LINEDOWN, (LPARAM)hWnd ); return( TRUE ); default: return( DefWindowProc( hWnd, iMessage, wParam, lParam ) ); } break; case WM_KEYDOWN: /* Keyboard Interface for Fader */ switch( wParam ) { case VK_TAB: // pass this on to the parent //PostMessage( hParentWnd, iMessage, wParam, lParam ); break; case VK_RIGHT: case VK_DOWN: PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_LINEDOWN, (LPARAM)hWnd ); break; case VK_LEFT: case VK_UP: PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_LINEUP, (LPARAM)hWnd ); break; case VK_PRIOR: PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_PAGEUP, (LPARAM)hWnd ); break; case VK_NEXT: PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_PAGEDOWN, (LPARAM)hWnd ); break; case VK_HOME: PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_TOP, (LPARAM)hWnd ); break; case VK_END: PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_BOTTOM, (LPARAM)hWnd ); break; } break; case WM_LBUTTONUP: ReleaseCapture(); if( pFI ) { // we know this control has the focus SetCaretPos( pFI->nBitmapX + 2, pFI->nBitmapPos + (CARET_OFFSET/2) ); ShowCaret( hWnd ); pFI->bMouseDown = FALSE; } break; case WM_LBUTTONDOWN: SetFocus( hWnd ); SetCapture( hWnd ); HideCaret( hWnd ); if( pFI ) { pFI->bMouseDown = TRUE; /* Fall Through */ } case WM_MOUSEMOVE: //fwKeys = wParam; // key flags //xPos = LOWORD(lParam); // horizontal position of cursor //yPos = HIWORD(lParam); // vertical position of cursor (zero at the top) if( pFI ) { if( pFI->bMouseDown ) { short X = LOWORD( lParam ); short Y = HIWORD( lParam ); WORD wPos; int nScale = pFI->nWindowY - pFI->bmFader.bmHeight; // make sure we don't go out of bounds if( Y > (pFI->nWindowY - (pFI->bmFader.bmHeight/2)) ) Y = (pFI->nWindowY - (pFI->bmFader.bmHeight/2)); if( Y < (pFI->bmFader.bmHeight/2) ) Y = (pFI->bmFader.bmHeight/2); Y -= (pFI->bmFader.bmHeight/2); if( Y > nScale ) Y = nScale; wPos = pFI->nMax - (((int)Y * pFI->nMax) / nScale); PostMessage( hParentWnd, WM_VSCROLL, MAKELONG( SB_THUMBTRACK, wPos ), (LPARAM)hWnd ); } } break; case WM_MOUSEWHEEL: { short fwKeys = LOWORD( wParam ); short nZDelta = HIWORD( wParam ); short nX = LOWORD( lParam ); short nY = HIWORD( lParam ); POINT Point; HWND hParent; // long CntlID; // what window is the mouse currently above? Point.x = nX; Point.y = nY; hWnd = WindowFromPoint( Point ); hParent = GetParent( hWnd ); // if the parent of this window is not our parent, we are done if( hParent != hParentWnd ) return( 0L ); // is this one of our fader windows? /*********** CntlID = GetWindowLong( hWnd, GWL_ID ); switch( CntlID ) { case IDC_OUT1_VOLUME: case IDC_OUT2_VOLUME: case IDC_OUT3_VOLUME: case IDC_OUT4_VOLUME: break; default: return( 0L ); } ***********/ SetFocus( hWnd ); HideCaret( hWnd ); //sprintf( szBuffer, "fwKeys [%d] nZ [%d] nX [%d] nY [%d]", fwKeys, nZDelta, nX, nY ); //SetDlgItemText( GetParent( hWnd ), IDC_STATUS, szBuffer ); if( nZDelta > 0 ) PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_LINEUP, (LPARAM)hWnd ); else PostMessage( hParentWnd, WM_VSCROLL, (WPARAM)SB_LINEDOWN, (LPARAM)hWnd ); } break; case WM_SIZE: if( pFI ) { pFI->nWindowX = LOWORD( lParam ); pFI->nWindowY = HIWORD( lParam ); // Place the Knob at the top of the control pFI->nBitmapPos = pFI->nWindowY - pFI->bmFader.bmHeight - 2; pFI->nBitmapX = (pFI->nWindowX / 2) - (pFI->bmFader.bmWidth / 2); } break; case WM_CREATE: pFI = (PFADERINFO)malloc( sizeof( FADERINFO ) ); SetWindowLong( hWnd, GWL_USERDATA, (DWORD)pFI ); if( !pFI ) { MessageBox( NULL, TEXT("Fader: malloc failed!"), TEXT("LynxONE Mixer"), MB_OK | MB_ICONSTOP | MB_TASKMODAL ); break; } ZeroMemory( pFI, sizeof( FADERINFO ) ); pFI->hFader = LoadBitmap( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDB_FADER ) ); pFI->hGradient = LoadBitmap( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDB_GRADIENT ) ); GetObject( pFI->hFader, sizeof( BITMAP ), (LPSTR)&pFI->bmFader ); GetObject( pFI->hGradient, sizeof( BITMAP ), (LPSTR)&pFI->bmGradient ); break; case WM_DESTROY: if( pFI ) { DeleteObject( pFI->hFader ); DeleteObject( pFI->hGradient ); free( pFI ); } SetWindowLong( hWnd, GWL_USERDATA, (DWORD)0 ); break; case WM_PAINT: BeginPaint( hWnd, (LPPAINTSTRUCT)&ps ); if( pFI ) PaintControl( ps.hdc, pFI ); EndPaint( hWnd, (LPPAINTSTRUCT)&ps ); break; default: return( DefWindowProc( hWnd, iMessage, wParam, lParam ) ); } return( 0L ); }
void CMyRichEdit::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 LONG lCharHeight; CHARFORMAT cf; memset(&cf, 0, sizeof(CHARFORMAT)); GetDefaultCharFormat(cf); //int nline = GetLineCount(); int StartIndex = LineIndex(0); int EndIndex = LineIndex(1); if (EndIndex != -1) { CPoint LinePoint = GetCharPos(StartIndex); CPoint AfterPoint = GetCharPos(EndIndex); lCharHeight = AfterPoint.y - LinePoint.y; }else { lCharHeight = cf.yHeight/15; } //设置为焦点 SetFocus(); //创建一个弹出式菜单 CMenu popmenu; popmenu.CreatePopupMenu(); //添加菜单项目 //popmenu.AppendMenu(0, ID_RICH_UNDO, "&Undo"); //popmenu.AppendMenu(0, MF_SEPARATOR); //popmenu.AppendMenu(0, ID_RICH_CUT, "&Cut"); popmenu.AppendMenu(0, ID_RICH_COPY, _T("复制")); //popmenu.AppendMenu(0, ID_RICH_PASTE, "&Paste"); popmenu.AppendMenu(0, ID_RICH_SELECTALL, _T("选择全部内容")); popmenu.AppendMenu(0, MF_SEPARATOR); popmenu.AppendMenu(0, ID_RICH_CLEAR, _T("清空全部内容")); //popmenu.AppendMenu(0, MF_SEPARATOR); //popmenu.AppendMenu(0, ID_RICH_SETFONT, "Select &Font"); //初始化菜单项 //UINT nUndo=(CanUndo() ? 0 : MF_GRAYED ); //popmenu.EnableMenuItem(ID_RICH_UNDO, MF_BYCOMMAND|nUndo); CPoint CurrPoint; CurrPoint = GetCaretPos(); long nStartChar; long nEndChar; GetSel(nStartChar, nEndChar); CPoint startPoint; CPoint endPoint; startPoint = GetCharPos(nStartChar); // Gets the position (top-left corner) of a given character within this CRichEditCtrl endPoint = GetCharPos(nEndChar); if(point.y < startPoint.y || point.y > endPoint.y + lCharHeight || (point.x < startPoint.x && point.y > startPoint.y && point.y < startPoint.y + lCharHeight) || (point.x > endPoint.x && point.y > endPoint.y && point.y < endPoint.y + lCharHeight)) { //SetSel(0, -1); SetSel(-1, 0); // 取消文本选中 } CurrPoint.y = point.y/lCharHeight*lCharHeight; CurrPoint.x = point.x; SetCaretPos(CurrPoint); //char chTT[100]; //sprintf_s(chTT, "y: %d startY: %d endY: %d", CurrPoint.y, startPoint.y, endPoint.y); //OutputDebugStringA(chTT); UINT nSel=((GetSelectionType()!=SEL_EMPTY) ? 0 : MF_GRAYED) ; //popmenu.EnableMenuItem(ID_RICH_CUT, MF_BYCOMMAND|nSel); popmenu.EnableMenuItem(ID_RICH_COPY, MF_BYCOMMAND|nSel); //popmenu.EnableMenuItem(ID_RICH_CLEAR, MF_BYCOMMAND|nSel); //UINT nPaste=(CanPaste() ? 0 : MF_GRAYED) ; //popmenu.EnableMenuItem(ID_RICH_PASTE, MF_BYCOMMAND|nPaste); //显示菜单 CPoint pt; GetCursorPos(&pt); popmenu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); popmenu.DestroyMenu(); CRichEditCtrl::OnRButtonDown(nFlags, point); }
LONG WINAPI TextWndProc(HWND hWnd,UINT messg,UINT wParam,LONG lParam) { int idChild; HDC hdc; #if 0 char buf[BUFSZ]; #endif PAINTSTRUCT ps; static int xClientView,yClientView; static HWND hInst; static FARPROC fpfnAboutDiaProc; int row,col; int srow, scol; int colcount, rowcount; int offset; uchar ch; uchar *pch; int color; int *pcolor; /* RECT rect; */ char tch[2]="X"; idChild = GetWindowLong(hWnd, GWL_ID); switch (messg) { case WM_CREATE: wins[idChild]->dwCharX = DefCharWidth; wins[idChild]->dwCharY = DefCharHeight; return 0; #if 0 case WM_SIZE: break; #endif case WM_PAINT: HideCaret(hWnd); hdc=BeginPaint(hWnd,&ps); SelectObject(hdc,wins[idChild]->hFnt); scol = ps.rcPaint.left / DefCharWidth; srow = ps.rcPaint.top / DefCharHeight; rowcount = ((ps.rcPaint.bottom / DefCharHeight) - srow) + 1; colcount = ((ps.rcPaint.right / DefCharWidth) - scol) + 1; switch(wins[idChild]->type) { case NHW_MESSAGE: col = ps.rcPaint.left / wins[NHW_MESSAGE]->dwCharX; offset = (srow * wins[NHW_MESSAGE]->maxcols) + col; SelectObject(hdc,wins[NHW_MESSAGE]->hFnt); SetBkColor(hdc,wins[NHW_MESSAGE]->BackGroundColor); for (row = srow; row <= srow + rowcount; ++row) { offset = (row * wins[NHW_MESSAGE]->maxcols + col); pcolor = wins[NHW_MESSAGE]->color + offset; pch = wins[NHW_MESSAGE]->data + offset; color = *pcolor; SetTextColor(hdc,color); TextOut(hdc, ps.rcPaint.left, (row * wins[NHW_MESSAGE]->dwCharY), pch, colcount); } break; case NHW_TEXT: SelectObject(hdc,wins[idChild]->hFnt); SetBkColor(hdc,wins[idChild]->BackGroundColor); colcount = wins[idChild]->widest; for (row = srow; row <= srow + rowcount; ++row) { for (col = scol; col <= scol + colcount; ++col) { offset = (row * wins[idChild]->maxcols) + col; pch = wins[idChild]->data + offset; pcolor = wins[idChild]->color + offset; ch = *pch; color = *pcolor; SetTextColor(hdc,color); TextOut(hdc, (col * wins[idChild]->dwCharX), (row * wins[idChild]->dwCharY), &ch, 1); } } break; default: SelectObject(hdc,wins[idChild]->hFnt); SetBkColor(hdc,wins[idChild]->BackGroundColor); colcount = wins[idChild]->maxcols; for (row = srow; row <= srow + rowcount; ++row) { for (col = scol; col <= scol + colcount; ++col) { offset = (row * wins[idChild]->maxcols) + col; pch = wins[idChild]->data + offset; pcolor = wins[idChild]->color + offset; ch = *pch; color = *pcolor; SetTextColor(hdc,color); TextOut(hdc, (col * wins[idChild]->dwCharX), (row * wins[idChild]->dwCharY), &ch, 1); } } } EndPaint(hWnd,&ps); ShowCaret(hWnd); break; case WM_SETFOCUS: if (idChild == WIN_MAP) { CreateCaret(hWnd,(HBITMAP)1,0,0); SetCaretPos(wins[idChild]->nCaretPosX, wins[idChild]->nCaretPosY * wins[idChild]->dwCharY); ShowCaret(hWnd); } else { SetFocus(wins[WIN_MAP]->hWnd); } break; case WM_KILLFOCUS: if (idChild == WIN_MAP) { HideCaret(hWnd); DestroyCaret(); } break; case WM_CHAR: switch(wParam) { default: ch = (unsigned char) wParam; if (pchPut >= pchBuf + (RINGBUFSIZE - 1)) { pchPut = pchBuf; /* wrap it */ } *pchPut++ = ch; ++pchCount; } #ifdef DEBUG_FULL sprintf(debugbuf,"Message = %X, wParam = %d, pchCount = %d", messg, wParam, pchCount); DEBUG_MSG(debugbuf); #endif break; case WM_DESTROY: PostQuitMessage(0); break; case WM_VSCROLL: switch(wParam) { case SB_LINEUP: break; } break; case WM_HSCROLL: default: return(DefWindowProc(hWnd,messg,wParam,lParam)); } return(0L); }
static int edtProcessKeyDown( HWND hWnd, WPARAM wParam, LPARAM lParam ) { PWindowsTree pWin; PSLEditData pEditData; BOOL bChange, bScroll; int iNewStartPos; int scrollStep,moveStep,deleted; int iLimit; RECT InvRect; pWin = (PWindowsTree)hWnd; if(!pWin) return -1; pEditData = (PSLEditData)(pWin->dwData); if(!pEditData) return -1; bChange = false; switch(LOWORD(wParam)){ case SCANCODE_ENTER: NotifyParent (hWnd, EN_ENTER); break; case SCANCODE_HOME: if (pEditData->iEditPos == 0) break; pEditData->iEditPos = 0; pEditData->iCaretPos = 0; SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); if (pEditData->iStartPos != 0) InvalidateRect (hWnd, NULL, TRUE); pEditData->iStartPos = 0; break; case SCANCODE_END: if (pEditData->iEditPos == pEditData->iDataLen) return 0; iNewStartPos = GetStartPos (hWnd, pEditData); pEditData->iEditPos = pEditData->iDataLen; pEditData->iCaretPos = pEditData->iEditPos - iNewStartPos; SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); if (pEditData->iStartPos != iNewStartPos) InvalidateRect (hWnd, NULL, TRUE); pEditData->iStartPos = iNewStartPos; break; case SCANCODE_LEFT: // bScroll = FALSE; if (pEditData->iEditPos == 0) return 0; if (IsACCharBeforePos (pEditData->buffer, pEditData->iEditPos)) { scrollStep = 2; pEditData->iEditPos -= 2; } else { scrollStep = 1; pEditData->iEditPos --; } pEditData->iCaretPos -= scrollStep; if (pEditData->iCaretPos == 0 && pEditData->iEditPos != 0) { bScroll = TRUE; if (IsACCharBeforePos(pEditData->buffer, pEditData->iEditPos)) { pEditData->iStartPos -= 2; pEditData->iCaretPos = 2; } else{ pEditData->iStartPos --; pEditData->iCaretPos = 1; } } else if (pEditData->iCaretPos < 0) { pEditData->iStartPos = 0; pEditData->iCaretPos = 0; } SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); if (bScroll) InvalidateRect (hWnd, NULL, TRUE); break; case SCANCODE_RIGHT: bScroll = FALSE; if (pEditData->iEditPos == pEditData->iDataLen) return 0; if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iStartPos)) { if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iEditPos)) { scrollStep = 2; moveStep = 2; pEditData->iEditPos += 2; } else { scrollStep = 2; moveStep = 1; pEditData->iEditPos ++; } } else {// isn't a chinese character at start position if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iEditPos)) { if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iStartPos + 1)) scrollStep = 3; else scrollStep = 2; moveStep = 2; pEditData->iEditPos += 2; } else { scrollStep = 1; moveStep = 1; pEditData->iEditPos ++; } } iLimit = pWin->rect.right - pWin->rect.left + 1 - 2 * wndGetBorder(hWnd) - pEditData->iLeftMargin - pEditData->iRightMargin; pEditData->iCaretPos += moveStep; if (pEditData->iCaretPos * GetSysCharWidth () > iLimit) { bScroll = TRUE; pEditData->iStartPos += scrollStep; pEditData->iCaretPos = pEditData->iEditPos - pEditData->iStartPos; } SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); if (bScroll) InvalidateRect (hWnd, NULL, TRUE); break; case SCANCODE_INS: pEditData = (PSLEditData) (pWin->dwData); pEditData->dwStatus ^= EST_REPLACE; break; case SCANCODE_DEL: { int i; pEditData = (PSLEditData) (pWin->dwData); if ((pWin->dwStyle & ES_READONLY) || (pEditData->iEditPos == pEditData->iDataLen)){ return 0; } if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iEditPos)) deleted = 2; else deleted = 1; for(i=pEditData->iEditPos; i<pEditData->iDataLen; i++) pEditData->buffer[i] = pEditData->buffer[i+deleted]; //for (i = pEditData->iEditPos; // i < pEditData->iDataLen - deleted; i++) // pEditData->buffer [i] = pEditData->buffer [i + deleted]; pEditData->iDataLen -= deleted; bChange = TRUE; InvRect.left = pEditData->iLeftMargin + pEditData->iCaretPos * GetSysCharWidth (); InvRect.top = pEditData->iTopMargin; InvRect.right = pWin->rect.right - pWin->rect.left; InvRect.bottom = pWin->rect.bottom - pWin->rect.top; InvalidateRect (hWnd, &InvRect, TRUE); break; } case SCANCODE_BACKSPACE: { int i; pEditData = (PSLEditData) (pWin->dwData); if ((pEditData->dwStatus & ES_READONLY) || (pEditData->iEditPos == 0)) { return 0; } if (IsACCharBeforePos (pEditData->buffer, pEditData->iEditPos)) deleted = 2; else deleted = 1; for (i = pEditData->iEditPos - deleted; i < pEditData->iDataLen; i++) pEditData->buffer [i] = pEditData->buffer [i + deleted]; pEditData->iDataLen -= deleted; pEditData->iEditPos -= deleted; bChange = TRUE; pEditData->iCaretPos -= deleted; if (pEditData->iCaretPos == 0 && pEditData->iEditPos != 0) { if (IsACCharBeforePos (pEditData->buffer, pEditData->iEditPos)) { pEditData->iStartPos -= 2; pEditData->iCaretPos = 2; } else { pEditData->iStartPos --; pEditData->iCaretPos = 1; } InvRect.left = pEditData->iLeftMargin; InvRect.top = pEditData->iTopMargin; InvRect.right = pWin->rect.right - pWin->rect.left; InvRect.bottom = pWin->rect.bottom - pWin->rect.top; } else { InvRect.left = pEditData->iLeftMargin + pEditData->iCaretPos * GetSysCharWidth (); InvRect.top = pEditData->iTopMargin; InvRect.right = pWin->rect.right - pWin->rect.left; InvRect.bottom = pWin->rect.bottom - pWin->rect.top; } SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); InvalidateRect (hWnd, &InvRect, TRUE); break; } } if (bChange) NotifyParent (hWnd, EN_CHANGE); return 0; }
LONG WINAPI ListboxWndProc(HWND hWnd,UINT messg,UINT wParam,LONG lParam) { int idListbox; HDC hdc; static int xClientView,yClientView; static HWND hInst; idListbox = GetWindowLong(hWnd, GWL_ID); switch (messg) { case WM_CREATE: hdc =GetDC(hWnd); GetTextMetrics(hdc, &tm); ReleaseDC(hWnd,hdc); return 0; case WM_SETFOCUS: #if 0 CreateCaret(hWnd,(HBITMAP)1,0,0); SetCaretPos(wins[idListbox]->nCaretPosX, wins[idListbox]->nCaretPosY * wins[idListbox]->dwCharY); ShowCaret(hWnd); break; #endif #if 0 case WM_KILLFOCUS: HideCaret(hWnd); DestroyCaret(); break; #endif case WM_DESTROY: PostQuitMessage(0); break; case WM_COMMAND: switch (HIWORD(wParam)) { case LBN_DBLCLK: DEBUG_MSG("Got LBN_DBLCLK"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; case LBN_KILLFOCUS: DEBUG_MSG("Got LBN_KILLFOCUS"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; case LBN_SELCANCEL: DEBUG_MSG("Got LBN_SELCANCEL"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; case LBN_SELCHANGE: DEBUG_MSG("Got LBN_SELCHANGE"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; case LBN_SETFOCUS: DEBUG_MSG("Got LBN_SETFOCUS"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; case WM_VKEYTOITEM: DEBUG_MSG("Got LBN_VKEYTOITEM"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; default: return(DefWindowProc(hWnd,messg,wParam,lParam)); } break; case WM_VSCROLL: case WM_HSCROLL: default: return(DefWindowProc(hWnd,messg,wParam,lParam)); } return(0L); }
uint32 Editor::onMessage(uint32 message, uint32 wParam, uint32 lParam) { switch (message) { case WM_DESTROY: delete target; target = NULL; break; case WM_SETCURSOR: if (LOWORD(lParam) == HTCLIENT) { POINT pt; GetCursorPos(&pt); ScreenToClient(hWnd, &pt); if (pt.x < LeftMargin()) SetCursor(cursors[cArrow]); else if (selStart != caret) { pt.x = (pt.x - LeftMargin()) / chSize.cx + scrollPos.x; pt.y = pt.y / chSize.cy + scrollPos.y; if (pt.y < 0 || pt.y >= lines.length() || pt.x < 0 || pt.x >= lines[pt.y].text.length()) SetCursor(cursors[cBeam]); else { int offset = fromPoint(pt); int sela = (selStart < caret ? selStart : caret); int selb = (selStart < caret ? caret : selStart); if (offset >= sela && offset < selb) SetCursor(cursors[cArrow]); else SetCursor(cursors[cBeam]); } } else SetCursor(cursors[cBeam]); } else SetCursor(cursors[cArrow]); return TRUE; case WM_ERASEBKGND: return TRUE; case WM_PAINT: paint(); return 0; case WM_SIZE: if (hBitmap) { int wd = LOWORD(lParam); int ht = HIWORD(lParam); if (wd < 10) wd = 10; if (ht < 10) ht = 10; hBitmap = CreateCompatibleBitmap(hDC, wd, ht); SelectObject(hDC, hBitmap); } updateExtent(); return 0; case WM_SETFOCUS: placeCaret(); invalidate(); getParent()->notify(EN_FOCUSED, (uint32) this, 0); return 0; case WM_KILLFOCUS: DestroyCaret(); updateCaret(); invalidate(); return 0; case WM_LBUTTONDBLCLK: { POINT pt = paramToPoint(lParam); fixPoint(pt); int ptStart = wordEnd(lines[pt.y].text.c_str(), pt.x, -1); int ptEnd = wordEnd(lines[pt.y].text.c_str(), pt.x, 1); int offset = fromPoint(pt); selStart = offset - (pt.x - ptStart); caret = offset + (ptEnd - pt.x); updateCaret(); } return 0; case WM_LBUTTONDOWN: if (int(GET_X_LPARAM(lParam)) < int(settings->bpOffset - scrollPos.x * chSize.cx)) { POINT pt = paramToPoint(lParam); toggleBreakpoint(pt.y); } else { POINT pt = paramToPoint(lParam); int offset = fromPoint(pt); int sela = (selStart < caret ? selStart : caret); int selb = (selStart > caret ? selStart : caret); if (offset >= sela && offset < selb) { dragop = 1; uint32 fx = DoDragDropEx(CF_UNICODETEXT, CreateGlobalText(getSelection()), DROPEFFECT_MOVE | DROPEFFECT_COPY, hWnd); if (fx == DROPEFFECT_NONE) dragop = 0; //else if (fx != DROPEFFECT_COPY && dragop != 2) // replace(sela, selb, ""); } else SetCapture(hWnd); if (dragop == 0) { caret = offset; if (!(wParam & MK_SHIFT)) selStart = caret; } dragop = 0; if (GetFocus() != hWnd) SetFocus(hWnd); updateCaret(); } return 0; case WM_RBUTTONDOWN: if (int(GET_X_LPARAM(lParam)) >= int(settings->bpOffset - scrollPos.x * chSize.cx)) { POINT pt = paramToPoint(lParam); int offset = fromPoint(pt); int sela = (selStart < caret ? selStart : caret); int selb = (selStart > caret ? selStart : caret); if (offset < sela || offset >= selb) caret = selStart = offset; if (GetFocus() != hWnd) SetFocus(hWnd); updateCaret(); } return 0; case WM_MOUSEMOVE: if (GetCapture() == hWnd && (wParam & MK_LBUTTON)) { POINT pt = paramToPoint(lParam); caret = fromPoint(pt); updateCaret(); } return 0; case WM_LBUTTONUP: ReleaseCapture(); return 0; case WM_CHAR: if (iswprint(wParam) && (GetAsyncKeyState(VK_CONTROL) & 0x8000) == 0) { if (caret == selStart && !insertMode && caret < getTextLength()) replace(caret, caret + 1, WideString((wchar_t) wParam)); else replace(selStart, caret, WideString((wchar_t) wParam)); } return 0; case WM_VSCROLL: { SCROLLINFO si; memset(&si, 0, sizeof si); si.cbSize = sizeof si; si.fMask = SIF_ALL; GetScrollInfo(hWnd, SB_VERT, &si); switch (LOWORD(wParam)) { case SB_TOP: si.nPos = si.nMin; break; case SB_BOTTOM: si.nPos = si.nMax; break; case SB_LINEUP: si.nPos--; break; case SB_LINEDOWN: si.nPos++; break; case SB_PAGEUP: si.nPos -= si.nPage; break; case SB_PAGEDOWN: si.nPos += si.nPage; break; case SB_THUMBTRACK: si.nPos = si.nTrackPos; break; } doScroll(scrollPos.x, si.nPos); } return 0; case WM_HSCROLL: { SCROLLINFO si; memset(&si, 0, sizeof si); si.cbSize = sizeof si; si.fMask = SIF_ALL; GetScrollInfo(hWnd, SB_HORZ, &si); switch (LOWORD(wParam)) { case SB_LEFT: si.nPos = si.nMin; break; case SB_RIGHT: si.nPos = si.nMax; break; case SB_LINELEFT: si.nPos--; break; case SB_LINERIGHT: si.nPos++; break; case SB_PAGELEFT: si.nPos -= si.nPage; break; case SB_PAGERIGHT: si.nPos += si.nPage; break; case SB_THUMBTRACK: si.nPos = si.nTrackPos; break; } doScroll(si.nPos, scrollPos.y); } return 0; case WM_MOUSEWHEEL: { int step; SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &step, 0); if (step < 0) step = 3; scrollAccum.y += GET_WHEEL_DELTA_WPARAM(wParam) * step; doScroll(scrollPos.x, scrollPos.y - scrollAccum.y / WHEEL_DELTA); scrollAccum.y %= WHEEL_DELTA; } return 0; case WM_MOUSEHWHEEL: { scrollAccum.x += GET_WHEEL_DELTA_WPARAM(wParam) * 4; doScroll(scrollPos.x + scrollAccum.x / WHEEL_DELTA, scrollPos.y); scrollAccum.x %= WHEEL_DELTA; } return 0; case WM_DRAGOVER: { if (running || settings->mode) return TRUE; POINT pt = paramToPoint(lParam); dropPos = fromPoint(pt); RECT rc; GetClientRect(hWnd, &rc); int xto = scrollPos.x; if (pt.x < 10) xto--; else if (pt.x > rc.right - 10) xto++; int yto = scrollPos.y; if (pt.y < 10) yto--; else if (pt.y > rc.bottom - 10) yto++; doScroll(xto, yto); int sela = (selStart < caret ? selStart : caret); int selb = (selStart > caret ? selStart : caret); if (dropPos > sela && dropPos < selb) return TRUE; else { fixPoint(pt); CreateCaret(hWnd, NULL, 2, chSize.cy); SetCaretPos((pt.x - scrollPos.x) * chSize.cx + LeftMargin(), (pt.y - scrollPos.y) * chSize.cy); ShowCaret(hWnd); } } return 0; case WM_DRAGLEAVE: dropPos = 0; updateCaret(); return 0; case WM_DRAGDROP: if (running || settings->mode) return DROPEFFECT_NONE; if (dragop) { dragop = 2; int sela = (selStart < caret ? selStart : caret); int selb = (selStart > caret ? selStart : caret); if (dropPos < sela || dropPos > selb) { WideString text = getSelection(); if (lParam != DROPEFFECT_COPY) { replace(sela, selb, L""); if (dropPos > selb) dropPos -= (selb - sela); caret = replace(dropPos, dropPos, text, NULL, true); } else caret = replace(dropPos, dropPos, text); selStart = dropPos; } } else { caret = replace(dropPos, dropPos, GetGlobalTextWide((HGLOBAL) wParam)); selStart = dropPos; return DROPEFFECT_COPY; } return lParam; case WM_SYSKEYDOWN: case WM_KEYDOWN: onKey(wParam); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_EDIT_UNDO: { bool glue = true; bool first = true; while (glue && historyPos > 0) { HistoryItem& h = history[--historyPos]; replace(h.begin, h.end, h.text, &h); glue = h.glue; h.glue = !first; first = false; } } break; case ID_EDIT_REDO: { bool glue = true; bool first = true; while (glue && historyPos < history.length()) { HistoryItem& h = history[historyPos++]; replace(h.begin, h.end, h.text, &h); glue = h.glue; h.glue = !first; first = false; } } break; case ID_EDIT_SELECTALL: selStart = 0; caret = getTextLength(); updateCaret(); break; case ID_EDIT_COPY: if (caret != selStart) SetClipboard(CF_UNICODETEXT, CreateGlobalText(getSelection())); else { POINT pt = toPoint(caret); pt.x = 0; int start = fromPoint(pt); if (pt.y < lines.length() - 1) pt.y++; else pt.x = lines[pt.y].text.length(); int end = fromPoint(pt); if (pCopyLine) pCopyLine->Release(); pCopyLine = SetClipboard(CF_UNICODETEXT, CreateGlobalText(substring(start, end))); if (pCopyLine) pCopyLine->AddRef(); } break; case ID_EDIT_CUT: if (caret != selStart) { SetClipboard(CF_UNICODETEXT, CreateGlobalText(getSelection())); replace(selStart, caret, L""); } else { POINT pt = toPoint(caret); POINT save = pt; pt.x = 0; int start = fromPoint(pt); if (pt.y < lines.length() - 1) pt.y++; else pt.x = lines[pt.y].text.length(); int end = fromPoint(pt); if (pCopyLine) pCopyLine->Release(); pCopyLine = SetClipboard(CF_UNICODETEXT, CreateGlobalText(substring(start, end))); if (pCopyLine) pCopyLine->AddRef(); replace(start, end, L""); caret = selStart = fromPoint(save); updateCaret(); } break; case ID_EDIT_PASTE: { ClipboardReader reader(CF_UNICODETEXT); if (reader.getData()) { if (OleIsCurrentClipboard(pCopyLine) == S_OK) { POINT pt = toPoint(caret); pt.x = 0; caret = selStart = fromPoint(pt); } selStart = caret = replace(selStart, caret, GetGlobalTextWide(reader.getData())); updateCaret(); } } break; case ID_DEBUG_BREAKPOINT: { POINT pt = toPoint(caret); toggleBreakpoint(pt.y); } break; default: return M_UNHANDLED; } return 0; } return M_UNHANDLED; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hDC; static char text[10][100]; static char text_copy[10][100]; static SIZE size; static int count, xPos, yPos, line = 0; static int home = 1; switch (iMessage) { case WM_CREATE: CreateCaret(hWnd, NULL, 5, 15); ShowCaret(hWnd); count = 0; return 0; //엔터 벡스페이스 이스케이프(화면이 다지워지고 캐럿은 맨위의 앞줄로 이동) 텝 (스페이스 4개) 홈 (그줄의 맨앞으로이동) case WM_CHAR: if (wParam == VK_BACK) // 벡스페이스 { if (count == 0 && line == 0) { break; } count--; if (count <= 0) { line--; count = strlen(text[line]); yPos = yPos - 20; } } else if (wParam == VK_RETURN) // 엔터 { if (line < 9) { count = 0; yPos = yPos + 20; line++; } } else if (wParam == VK_TAB) // 텝 { for (int i = 0; i < 4; ++i) { text[line][count++] = ' '; } if (count >= 96) { line++; count = 0; yPos += 20; } } else if (wParam == VK_ESCAPE) // 이스케이프 { for (int i = 0; i <= line; i++) for (int j = 0; j <= count; j++) { //text_copy[i][j] = text[i][j]; text[i][j] = '\0'; } count = 0; line = 0; yPos = 0; } else if (wParam =='/') { if (home != 1) home = 1; else home = 0; } else if (count < 98) { text[line][count++] = wParam; } //home = true; text[line][count] = '\0'; InvalidateRect(hWnd, NULL, TRUE); break; case WM_PAINT: hDC = BeginPaint(hWnd, &ps); for (int i = 0; i <= line; ++i) { TextOut(hDC, 0, (i * 20), text[i], strlen(text[i])); } if (home==1) { GetTextExtentPoint(hDC, text[line], strlen(text[line]), &size); SetCaretPos(size.cx, yPos); } else SetCaretPos(0, yPos); EndPaint(hWnd, &ps); break; case WM_DESTROY: HideCaret(hWnd); DestroyCaret(); PostQuitMessage(0); return 0; } return(DefWindowProc(hWnd, iMessage, wParam, lParam)); }
/* text window */ LRESULT CALLBACK WndTextProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; int nYinc, nXinc; TW *tw; if (message == WM_CREATE) { /* Object is stored in window extra data. * Nothing must try to use the object before WM_CREATE * initializes it here. */ tw = (TW *)(((CREATESTRUCT FAR *)lParam)->lpCreateParams); SetWindowLong(hwnd, 0, (LONG)tw); } tw = (TW *)GetWindowLong(hwnd, 0); switch(message) { case WM_SYSCOMMAND: switch(LOWORD(wParam)) { case M_COPY_CLIP: text_copy_to_clipboard(tw); return 0; case M_PASTE_CLIP: text_paste_from_clipboard(tw); return 0; } break; case WM_SETFOCUS: tw->bFocus = TRUE; CreateCaret(hwnd, 0, tw->CharSize.x, 2+tw->CaretHeight); SetCaretPos(tw->CursorPos.x*tw->CharSize.x - tw->ScrollPos.x, tw->CursorPos.y*tw->CharSize.y + tw->CharAscent - tw->CaretHeight - tw->ScrollPos.y); if (tw->bGetCh) ShowCaret(hwnd); break; case WM_KILLFOCUS: DestroyCaret(); tw->bFocus = FALSE; break; case WM_MOVE: if (!IsIconic(hwnd) && !IsZoomed(hwnd)) { GetWindowRect(hwnd, &rect); tw->x = rect.left; tw->y = rect.top; } break; case WM_SIZE: if (wParam == SIZE_MINIMIZED) return(0); /* remember current window size */ if (wParam != SIZE_MAXIMIZED) { GetWindowRect(hwnd, &rect); tw->cx = rect.right - rect.left; tw->cy = rect.bottom - rect.top; tw->x = rect.left; tw->y = rect.top; } tw->ClientSize.y = HIWORD(lParam); tw->ClientSize.x = LOWORD(lParam); tw->ScrollMax.y = max(0, tw->CharSize.y*tw->ScreenSize.y - tw->ClientSize.y); tw->ScrollPos.y = min(tw->ScrollPos.y, tw->ScrollMax.y); SetScrollRange(hwnd, SB_VERT, 0, tw->ScrollMax.y, FALSE); SetScrollPos(hwnd, SB_VERT, tw->ScrollPos.y, TRUE); tw->ScrollMax.x = max(0, tw->CharSize.x*tw->ScreenSize.x - tw->ClientSize.x); tw->ScrollPos.x = min(tw->ScrollPos.x, tw->ScrollMax.x); SetScrollRange(hwnd, SB_HORZ, 0, tw->ScrollMax.x, FALSE); SetScrollPos(hwnd, SB_HORZ, tw->ScrollPos.x, TRUE); if (tw->bFocus && tw->bGetCh) { SetCaretPos(tw->CursorPos.x*tw->CharSize.x - tw->ScrollPos.x, tw->CursorPos.y*tw->CharSize.y + tw->CharAscent - tw->CaretHeight - tw->ScrollPos.y); ShowCaret(hwnd); } return(0); case WM_VSCROLL: switch(LOWORD(wParam)) { case SB_TOP: nYinc = -tw->ScrollPos.y; break; case SB_BOTTOM: nYinc = tw->ScrollMax.y - tw->ScrollPos.y; break; case SB_LINEUP: nYinc = -tw->CharSize.y; break; case SB_LINEDOWN: nYinc = tw->CharSize.y; break; case SB_PAGEUP: nYinc = min(-1,-tw->ClientSize.y); break; case SB_PAGEDOWN: nYinc = max(1,tw->ClientSize.y); break; case SB_THUMBPOSITION: nYinc = HIWORD(wParam) - tw->ScrollPos.y; break; default: nYinc = 0; } if ( (nYinc = max(-tw->ScrollPos.y, min(nYinc, tw->ScrollMax.y - tw->ScrollPos.y))) != 0 ) { tw->ScrollPos.y += nYinc; ScrollWindow(hwnd,0,-nYinc,NULL,NULL); SetScrollPos(hwnd,SB_VERT,tw->ScrollPos.y,TRUE); UpdateWindow(hwnd); } return(0); case WM_HSCROLL: switch(LOWORD(wParam)) { case SB_LINEUP: nXinc = -tw->CharSize.x; break; case SB_LINEDOWN: nXinc = tw->CharSize.x; break; case SB_PAGEUP: nXinc = min(-1,-tw->ClientSize.x); break; case SB_PAGEDOWN: nXinc = max(1,tw->ClientSize.x); break; case SB_THUMBPOSITION: nXinc = HIWORD(wParam) - tw->ScrollPos.x; break; default: nXinc = 0; } if ( (nXinc = max(-tw->ScrollPos.x, min(nXinc, tw->ScrollMax.x - tw->ScrollPos.x))) != 0 ) { tw->ScrollPos.x += nXinc; ScrollWindow(hwnd,-nXinc,0,NULL,NULL); SetScrollPos(hwnd,SB_HORZ,tw->ScrollPos.x,TRUE); UpdateWindow(hwnd); } return(0); case WM_KEYDOWN: switch(wParam) { case VK_HOME: SendMessage(hwnd, WM_VSCROLL, SB_TOP, (LPARAM)0); break; case VK_END: SendMessage(hwnd, WM_VSCROLL, SB_BOTTOM, (LPARAM)0); break; case VK_PRIOR: SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, (LPARAM)0); break; case VK_NEXT: SendMessage(hwnd, WM_VSCROLL, SB_PAGEDOWN, (LPARAM)0); break; case VK_UP: SendMessage(hwnd, WM_VSCROLL, SB_LINEUP, (LPARAM)0); break; case VK_DOWN: SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, (LPARAM)0); break; case VK_LEFT: SendMessage(hwnd, WM_HSCROLL, SB_LINEUP, (LPARAM)0); break; case VK_RIGHT: SendMessage(hwnd, WM_HSCROLL, SB_LINEDOWN, (LPARAM)0); break; } break; case WM_CHAR: { /* store key in circular buffer */ long count = tw->KeyBufIn - tw->KeyBufOut; if (count < 0) count += tw->KeyBufSize; if (count < tw->KeyBufSize-1) { *tw->KeyBufIn++ = wParam; if (tw->KeyBufIn - tw->KeyBuf >= tw->KeyBufSize) tw->KeyBufIn = tw->KeyBuf; /* wrap around */ } } return(0); case WM_PAINT: { POINT source, width, dest; hdc = BeginPaint(hwnd, &ps); SelectFont(hdc, tw->hfont); SetMapMode(hdc, MM_TEXT); SetBkMode(hdc,OPAQUE); GetClientRect(hwnd, &rect); source.x = (rect.left + tw->ScrollPos.x) / tw->CharSize.x; /* source */ source.y = (rect.top + tw->ScrollPos.y) / tw->CharSize.y; dest.x = source.x * tw->CharSize.x - tw->ScrollPos.x; /* destination */ dest.y = source.y * tw->CharSize.y - tw->ScrollPos.y; width.x = ((rect.right + tw->ScrollPos.x + tw->CharSize.x - 1) / tw->CharSize.x) - source.x; /* width */ width.y = ((rect.bottom + tw->ScrollPos.y + tw->CharSize.y - 1) / tw->CharSize.y) - source.y; if (source.x < 0) source.x = 0; if (source.y < 0) source.y = 0; if (source.x+width.x > tw->ScreenSize.x) width.x = tw->ScreenSize.x - source.x; if (source.y+width.y > tw->ScreenSize.y) width.y = tw->ScreenSize.y - source.y; /* for each line */ while (width.y>0) { TextOut(hdc,dest.x,dest.y, (LPSTR)(tw->ScreenBuffer + source.y*tw->ScreenSize.x + source.x), width.x); dest.y += tw->CharSize.y; source.y++; width.y--; } EndPaint(hwnd, &ps); return 0; } case WM_DROPFILES: text_drag_drop(tw, (HDROP)wParam); break; case WM_CREATE: { RECT crect, wrect; int cx, cy; tw->hwnd = hwnd; /* make window no larger than screen buffer */ GetWindowRect(hwnd, &wrect); GetClientRect(hwnd, &crect); cx = min(tw->CharSize.x*tw->ScreenSize.x, crect.right); cy = min(tw->CharSize.y*tw->ScreenSize.y, crect.bottom); MoveWindow(hwnd, wrect.left, wrect.top, wrect.right-wrect.left + (cx - crect.right), wrect.bottom-wrect.top + (cy - crect.bottom), TRUE); if ( (tw->DragPre!=(LPSTR)NULL) && (tw->DragPost!=(LPSTR)NULL) ) DragAcceptFiles(hwnd, TRUE); } break; case WM_CLOSE: /* Tell user that we heard them */ if (!tw->quitnow) { char title[256]; int count = GetWindowText(hwnd, title, sizeof(title)-11); strcpy(title+count, " - closing"); SetWindowText(hwnd, title); } tw->quitnow = TRUE; /* wait until Ghostscript exits before destroying window */ return 0; case WM_DESTROY: DragAcceptFiles(hwnd, FALSE); if (tw->hfont) DeleteFont(tw->hfont); tw->hfont = (HFONT)0; tw->quitnow = TRUE; PostQuitMessage(0); break; } return DefWindowProc(hwnd, message, wParam, lParam); }
/** LoadFile DESCRIPTION Read file into buffer in file structure PARAM[IN] LPTSTR pFileName - name of file to open PARAM[IN/OUT] FILESTRUCT * pFS - pointer to file structure RETURNS error_t error - error code */ error_t LoadFile(LPTSTR pFileName, FILESTRUCT * pFS) { FILE * file = NULL; LPTSTR pBuffer; LPTSTR * ppString; int * pStrLen; int nFileSize, nStrNum, nMaxStrLen; int i, iStr; struct stat stFileStat; #ifdef _MSC_VER fopen_s(&file, pFileName, "rb"); #else file = fopen(pFileName, "rb"); #endif if (file == NULL) return ERR_OPEN_FILE; // find out size of file fstat(_fileno(file), &stFileStat); nFileSize = stFileStat.st_size; // allocate memory for the text in file and read the text pBuffer = (LPTSTR)calloc(nFileSize, sizeof(TCHAR)); if (pBuffer == NULL) return ERR_MEMORY_ALLOCATION; fread(pBuffer, sizeof(TCHAR), nFileSize, file); // calculate number of strings nStrNum = 1; for (i = 0; i < nFileSize; ++i) if (pBuffer[i] == '\n') nStrNum++; // allocate memory for array of strings and array of string lengths ppString = (LPTSTR*)calloc(nStrNum, sizeof(LPTSTR)); if (ppString == NULL) { free(pBuffer); return ERR_MEMORY_ALLOCATION; } pStrLen = (int*)calloc(nStrNum, sizeof(int)); if (pStrLen == NULL) { free(pBuffer); free(pStrLen); return ERR_MEMORY_ALLOCATION; } // fill array of strings and array of string lengths iStr = 0; nMaxStrLen = 0; ppString[0] = pBuffer; for (i = 0; i < nFileSize; ++i) { assert(iStr <= nStrNum); if (pBuffer[i] == '\n') { assert(iStr < nStrNum); pStrLen[iStr] = pBuffer + i - ppString[iStr]; if (pStrLen[iStr] > nMaxStrLen) nMaxStrLen = pStrLen[iStr]; ++iStr; if (iStr < nStrNum) ppString[iStr] = pBuffer + i + 1; } } pStrLen[nStrNum - 1] = pBuffer + nFileSize - ppString[nStrNum - 1]; if (pStrLen[nStrNum - 1] > nMaxStrLen) nMaxStrLen = pStrLen[nStrNum - 1]; // fill the file structure pFS->pBuffer = pBuffer; pFS->ppString = ppString; pFS->pStrLen = pStrLen; pFS->nMaxStrLen = nMaxStrLen; pFS->nStrNum = nStrNum; pFS->nFileSize = nFileSize; pFS->nCaretPosX = pFS->nCaretPosY = 0; pFS->iCaretStr = pFS->iCaretChar = 0; SetCaretPos(0, 0); fclose(file); return NO_ERR; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static DWORD dwCharSet = DEFAULT_CHARSET; static int cxChar, cyChar, cxClient, cyClient, cxBuffer, cyBuffer, xCaret, yCaret; static TCHAR *pBuffer = NULL; HDC hdc; int x, y, i; PAINTSTRUCT ps; TEXTMETRIC tm; switch (message) { case WM_INPUTLANGCHANGE: dwCharSet = wParam; // fall through case WM_CREATE: hdc = GetDC(hwnd); SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)); GetTextMetrics(hdc, &tm); cxChar = tm.tmAveCharWidth; cyChar = tm.tmHeight; DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT))); ReleaseDC(hwnd, hdc); // fall through case WM_SIZE: // obtain window size in pixels if (message == WM_SIZE) { cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); } // calculate window size in characters cxBuffer = max(1, cxClient / cxChar); cyBuffer = max(1, cyClient / cyChar); // allocate memory for buffer and clear it if (pBuffer != NULL) free(pBuffer); pBuffer = (TCHAR *)malloc(cxBuffer * cyBuffer * sizeof (TCHAR)); for (y = 0; y < cyBuffer; y++) for (x = 0; x < cxBuffer; x++) BUFFER(x, y) = ' '; // set caret to upper left corner xCaret = 0; yCaret = 0; if (hwnd == GetFocus()) SetCaretPos(xCaret * cxChar, yCaret * cyChar); InvalidateRect(hwnd, NULL, TRUE); return 0; case WM_SETFOCUS: // create and show the caret CreateCaret(hwnd, NULL, cxChar, cyChar); SetCaretPos(xCaret * cxChar, yCaret * cyChar); ShowCaret(hwnd); return 0; case WM_KILLFOCUS: // hide and destroy the caret HideCaret(hwnd); DestroyCaret(); return 0; case WM_KEYDOWN: switch (wParam) { case VK_HOME: xCaret = 0; break; case VK_END: xCaret = cxBuffer - 1; break; case VK_PRIOR: yCaret = 0; break; case VK_NEXT: yCaret = cyBuffer - 1; break; case VK_LEFT: xCaret = max(xCaret - 1, 0); break; case VK_RIGHT: xCaret = min(xCaret + 1, cxBuffer - 1); break; case VK_UP: yCaret = max(yCaret - 1, 0); break; case VK_DOWN: yCaret = min(yCaret + 1, cyBuffer - 1); break; case VK_DELETE: for (x = xCaret; x < cxBuffer - 1; x++) BUFFER(x, yCaret) = BUFFER(x + 1, yCaret); BUFFER(cxBuffer - 1, yCaret) = ' '; HideCaret(hwnd); hdc = GetDC(hwnd); SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)); TextOut(hdc, xCaret * cxChar, yCaret * cyChar, &BUFFER(xCaret, yCaret), cxBuffer - xCaret); DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT))); ReleaseDC(hwnd, hdc); ShowCaret(hwnd); break; } SetCaretPos(xCaret * cxChar, yCaret * cyChar); return 0; case WM_CHAR: for (i = 0; i < (int)LOWORD(lParam); i++) { switch (wParam) { case '\b': // backspace if (xCaret > 0) { xCaret--; SendMessage(hwnd, WM_KEYDOWN, VK_DELETE, 1); } break; case '\t': // tab do { SendMessage(hwnd, WM_CHAR, ' ', 1); } while (xCaret % 8 != 0); break; case '\n': // line feed if (++yCaret == cyBuffer) yCaret = 0; break; case '\r': // carriage return xCaret = 0; if (++yCaret == cyBuffer) yCaret = 0; break; case '\x1B': // escape for (y = 0; y < cyBuffer; y++) for (x = 0; x < cxBuffer; x++) BUFFER(x, y) = ' '; xCaret = 0; yCaret = 0; InvalidateRect(hwnd, NULL, FALSE); break; default: // character codes BUFFER(xCaret, yCaret) = (TCHAR)wParam; HideCaret(hwnd); hdc = GetDC(hwnd); SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)); TextOut(hdc, xCaret * cxChar, yCaret * cyChar, &BUFFER(xCaret, yCaret), 1); DeleteObject( SelectObject(hdc, GetStockObject(SYSTEM_FONT))); ReleaseDC(hwnd, hdc); ShowCaret(hwnd); if (++xCaret == cxBuffer) { xCaret = 0; if (++yCaret == cyBuffer) yCaret = 0; } break; } } SetCaretPos(xCaret * cxChar, yCaret * cyChar); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)); for (y = 0; y < cyBuffer; y++) TextOut(hdc, 0, y * cyChar, &BUFFER(0, y), cxBuffer); DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT))); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }
void CBaseCaret::CaretPos() { SetCaretPos ( (int)(m_XPosition - m_ScrollXPosition), (int)(m_YPosition - m_ScrollYPosition) ); // for status bar updates // TRACE ( "CaretPos: X = %d, Y = %d\n", (int)(m_XPosition - m_ScrollXPosition), (int)(m_YPosition - m_ScrollYPosition) ); }
/* a simple edit window */ static int MyeditWindowProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { int w = 0; SIZE Size; static char *pBuffer = NULL; static int pos = 0, len = 0; HDC hdc; switch (message) { case MSG_CREATE: SetWindowFont(hWnd, GetSystemFont(SYSLOGFONT_DEFAULT)); if (!CreateCaret (hWnd, NULL, 1, GetSysCharHeight())) { return -1; } pBuffer = (char *) calloc(1, 11); *pBuffer = 0; break; case MSG_SETFOCUS: hdc = GetClientDC(hWnd); w = GetTextExtent (hdc, pBuffer, pos, &Size); SetCaretPos(hWnd, w, 0); //SetCaretPos(hWnd, pos*GetSysCharWidth(), 0); ShowCaret(hWnd); ReleaseDC(hdc); break; case MSG_KILLFOCUS: HideCaret(hWnd); break; case MSG_CHAR: switch (wParam) { case '\t': case '\b': case '\n': SetCaretBlinkTime(hWnd, GetCaretBlinkTime(hWnd)-100); break; default: { char ch, buf[11]; char *tmp; ch = wParam; if (!isalpha(ch) && !isdigit(ch)) break; if (len == 10) break; tmp = pBuffer+pos; if (*tmp != 0) { strcpy(buf, tmp); strcpy(tmp+1, buf); } *tmp = ch; pos++; len++; hdc = GetClientDC(hWnd); InvalidateRect(hWnd, NULL, TRUE); w = GetTextExtent (hdc, pBuffer, pos, &Size); SetCaretPos(hWnd, w, 0); //SetCaretPos(hWnd, pos*GetSysCharWidth(), 0); ShowCaret(hWnd); ReleaseDC(hdc); } break; } break; case MSG_KEYDOWN: switch (wParam) { case SCANCODE_CURSORBLOCKLEFT: pos = MAX(pos-1, 0); break; case SCANCODE_CURSORBLOCKRIGHT: pos = MIN(pos+1, len); break; case SCANCODE_BACKSPACE: { char buf[11]; char *tmp; if (len == 0 || pos == 0) break; tmp = pBuffer+pos; strcpy(buf, tmp); strcpy(tmp-1, buf); pos--; len--; break; } } if (wParam == SCANCODE_CURSORBLOCKLEFT || wParam == SCANCODE_CURSORBLOCKRIGHT || wParam == SCANCODE_BACKSPACE) { hdc = GetClientDC(hWnd); InvalidateRect(hWnd, NULL, TRUE); w = GetTextExtent (hdc, pBuffer, pos, &Size); //SetCaretPos(hWnd, pos*GetSysCharWidth(), 0); SetCaretPos(hWnd, w, 0); ReleaseDC(hdc); } break; case MSG_PAINT: hdc = BeginPaint(hWnd); TextOut(hdc, 0, 0, pBuffer); EndPaint(hWnd, hdc); return 0; case MSG_DESTROY: DestroyCaret (hWnd); if (pBuffer) free(pBuffer); return 0; } return DefaultControlProc(hWnd, message, wParam, lParam); }
/*********************************************************************** * ScrollBarWndProc */ LRESULT WINAPI ScrollBarWndProc(WNDPROC DefWindowProc, HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) { #ifdef __ODYSSEY__ // Do this now, remove after Server side is fixed. PWND pWnd; pWnd = ValidateHwnd(Wnd); if (pWnd) { if (!pWnd->fnid) { NtUserSetWindowFNID(Wnd, FNID_SCROLLBAR); } } #endif if (! IsWindow(Wnd)) { return 0; } switch (Msg) { case WM_CREATE: IntScrollCreateScrollBar(Wnd, (LPCREATESTRUCTW) lParam); break; #ifdef __ODYSSEY__ case WM_DESTROY: NtUserSetWindowFNID(Wnd, FNID_DESTROY); return DefWindowProc(Wnd, Msg, wParam, lParam ); #endif //#if 0 /* FIXME */ case WM_ENABLE: { // SCROLLBAR_INFO *infoPtr; // if ((infoPtr = SCROLL_GetScrollBarInfo( hwnd, SB_CTL ))) // { // infoPtr->flags = wParam ? ESB_ENABLE_BOTH : ESB_DISABLE_BOTH; // SCROLL_RefreshScrollBar(hwnd, SB_CTL, TRUE, TRUE); // } HDC hdc; DbgPrint("ScrollBarWndProc WM_ENABLE\n"); NtUserEnableScrollBar(Wnd,SB_CTL,(wParam ? ESB_ENABLE_BOTH : ESB_DISABLE_BOTH)); /* Refresh Scrollbars. */ hdc = GetDCEx( Wnd, 0, DCX_CACHE ); if (!hdc) return 1; IntDrawScrollBar( Wnd, hdc, SB_CTL); ReleaseDC( Wnd, hdc ); } return 0; //#endif case WM_LBUTTONDBLCLK: case WM_LBUTTONDOWN: { POINT Pt; Pt.x = (short)LOWORD(lParam); Pt.y = (short)HIWORD(lParam); ScrollTrackScrollBar(Wnd, SB_CTL, Pt); } break; case WM_LBUTTONUP: case WM_MOUSEMOVE: case WM_SYSTIMER: { POINT Pt; Pt.x = (short)LOWORD(lParam); Pt.y = (short)HIWORD(lParam); IntScrollHandleScrollEvent(Wnd, SB_CTL, Msg, Pt); } break; case WM_KEYDOWN: IntScrollHandleKbdEvent(Wnd, wParam, lParam); break; case WM_KEYUP: ShowCaret(Wnd); break; case WM_SETFOCUS: { /* Create a caret when a ScrollBar get focus */ RECT Rect; int ArrowSize, ThumbSize, ThumbPos, Vertical; Vertical = IntScrollGetScrollBarRect(Wnd, SB_CTL, &Rect, &ArrowSize, &ThumbSize, &ThumbPos); if (! Vertical) { CreateCaret(Wnd, (HBITMAP) 1, ThumbSize - 2, Rect.bottom - Rect.top - 2); SetCaretPos(ThumbPos + 1, Rect.top + 1); } else { CreateCaret(Wnd, (HBITMAP) 1, Rect.right - Rect.left - 2, ThumbSize - 2); SetCaretPos(Rect.top + 1, ThumbPos + 1); } ShowCaret(Wnd); } break; case WM_KILLFOCUS: { RECT Rect; int ArrowSize, ThumbSize, ThumbPos, Vertical; Vertical = IntScrollGetScrollBarRect(Wnd, SB_CTL, &Rect, &ArrowSize, &ThumbSize, &ThumbPos); if (! Vertical) { Rect.left = ThumbPos + 1; Rect.right = Rect.left + ThumbSize; } else { Rect.top = ThumbPos + 1; Rect.bottom = Rect.top + ThumbSize; } HideCaret(Wnd); InvalidateRect(Wnd, &Rect, FALSE); DestroyCaret(); } break; case WM_ERASEBKGND: return 1; case WM_GETDLGCODE: return DLGC_WANTARROWS; /* Windows returns this value */ case WM_PAINT: { PAINTSTRUCT Ps; HDC Dc; Dc = (0 != wParam ? (HDC) wParam : BeginPaint(Wnd, &Ps)); if (GetWindowLongPtrW(Wnd, GWL_STYLE) & SBS_SIZEGRIP) { IntScrollDrawSizeGrip(Wnd, Dc); } else if (0 != (GetWindowLongPtrW(Wnd, GWL_STYLE) & SBS_SIZEBOX)) { RECT Rect; GetClientRect(Wnd, &Rect); FillRect(Dc, &Rect, GetSysColorBrush(COLOR_SCROLLBAR)); } else { IntDrawScrollBar(Wnd, Dc, SB_CTL/*, TRUE, TRUE*/); } if (0 == wParam) { EndPaint(Wnd, &Ps); } } break; case SBM_SETPOS: return SetScrollPos(Wnd, SB_CTL, wParam, (BOOL) lParam); case SBM_GETPOS: return IntScrollGetScrollPos(Wnd, SB_CTL); case SBM_SETRANGEREDRAW: case SBM_SETRANGE: { INT OldPos = IntScrollGetScrollPos(Wnd, SB_CTL); SetScrollRange(Wnd, SB_CTL, wParam, lParam, FALSE); if (Msg == SBM_SETRANGEREDRAW) SCROLL_RefreshScrollBar( Wnd, SB_CTL, TRUE, TRUE ); if (OldPos != IntScrollGetScrollPos(Wnd, SB_CTL)) return OldPos; } return 0; case SBM_GETRANGE: return IntScrollGetScrollRange(Wnd, SB_CTL, (LPINT) wParam, (LPINT) lParam); case SBM_ENABLE_ARROWS: return EnableScrollBar(Wnd, SB_CTL, wParam); case SBM_SETSCROLLINFO: return NtUserSetScrollInfo(Wnd, SB_CTL, (SCROLLINFO *) lParam, wParam); case SBM_GETSCROLLINFO: return NtUserSBGetParms(Wnd, SB_CTL, NULL, (SCROLLINFO *) lParam); case SBM_GETSCROLLBARINFO: ((PSCROLLBARINFO)lParam)->cbSize = sizeof(SCROLLBARINFO); return NtUserGetScrollBarInfo(Wnd, OBJID_CLIENT, (PSCROLLBARINFO)lParam); case 0x00e5: case 0x00e7: case 0x00e8: case 0x00ec: case 0x00ed: case 0x00ee: case 0x00ef: WARN("unknown Win32 msg %04x wp=%08lx lp=%08lx\n", Msg, wParam, lParam ); break; default: if (WM_USER <= Msg) { WARN("unknown msg %04x wp=%04lx lp=%08lx\n", Msg, wParam, lParam); } return DefWindowProc(Wnd, Msg, wParam, lParam ); } return 0; }
void setCaretSize(int w, int h) { DestroyCaret(); CreateCaret(g_hWnd, 0, w, h); SetCaretPos(g_caretX, g_caretY); }
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM uParam,LPARAM lParam) { TEXTMETRIC tm; PAINTSTRUCT ps; HDC hdc; int i,j,k,t; static int cxChar,cyChar; static int outRow,outCol; CHAR c; CHAR lnBuffer[128]; CHAR *lnPtr; int lnLen; int outColFlag; switch (message) { case WM_CREATE: hdc = GetDC(hwnd); SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); GetTextMetrics(hdc,&tm); cxChar = tm.tmAveCharWidth; cyChar = tm.tmHeight; ReleaseDC(hwnd,hdc); outRow = 0; outCol = 0; break; case WM_SIZE: break; case WM_SETFOCUS: CreateCaret(hwnd,(HBITMAP)1,cxChar,cyChar); ShowCaret(hwnd); break; case WM_KILLFOCUS: HideCaret(hwnd); DestroyCaret(); break; case WM_PAINT: hdc = BeginPaint(hwnd,&ps); SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); outRow=0; outCol=0; outColFlag = 0; lnPtr = lnBuffer; lnLen = 0; for (i=1; i <= gCurrStr; i++) { k = strlen(&gPutStr[i][0]); for (j=0; j < k; j++) { c = gPutStr[i][j]; switch (c) { case '\n': if (lnLen) TextOut(hdc,(outCol*cxChar),(outRow*cyChar),lnBuffer,lnLen); lnPtr = lnBuffer; lnLen = 0; outCol = 0; outRow++; break; case '\r': outColFlag = 1; break; case '\x0C': // form-feed (rest of gPutStr[] line ignored) // cls gCurrStr=0; InvalidateRect(gHwnd,NULL,TRUE); break; default: if (c >= 32) { *lnPtr++ = c; lnLen++; } } } if (lnLen) { TextOut(hdc,(outCol*cxChar),(outRow*cyChar),lnBuffer,lnLen); outCol = outCol + lnLen; lnPtr = lnBuffer; lnLen = 0; } if (outColFlag) { outCol = 0; outColFlag = 0; } } SetCaretPos(outCol*cxChar,outRow*cyChar); EndPaint(hwnd,&ps); break; case WM_CHAR: HideCaret(hwnd); for (i=0; i < (int)LOWORD(lParam); i++) { switch(LOWORD(uParam)) { case '\r': outRow++; outCol=0; gGetStr[gCurrChar] = '\x0'; gInputReady = 1; // used in GetMsg() in bd_main.c break; case '\n': break; case '\b': if (gCurrChar > 0) { gCurrChar--; gGetStr[gCurrChar] = '\x0'; t = strlen(&gPutStr[gCurrStr][0]); if (t > 0) gPutStr[gCurrStr][t-1] = 0; if (outCol > 0) outCol--; // play it safe hdc = GetDC(hwnd); SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); TextOut(hdc,(outCol*cxChar),(outRow*cyChar)," ",1); ReleaseDC(hwnd, hdc); } break; default: if (gCurrChar < sizeof(gGetStr)-1) { c = (CHAR)LOWORD(uParam); if ((c >= 32) & (c < 127)) { gGetStr[gCurrChar] = c; t = strlen(&gPutStr[gCurrStr][0]); gPutStr[gCurrStr][t] = c; gPutStr[gCurrStr][t+1] = '\x0'; hdc = GetDC(hwnd); SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); TextOut(hdc,(outCol*cxChar),(outRow*cyChar),&c,1); ReleaseDC(hwnd, hdc); gCurrChar++; outCol++; } } else { gGetStr[gCurrChar] = '\x0'; gInputReady = 1; } break; } } SetCaretPos(outCol*cxChar,outRow*cyChar); ShowCaret(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hwnd, message, uParam, lParam)); } return 0; }