Ejemplo n.º 1
0
void HotKeyInputWindow::ShowCustomCaret() const
{
    AssertCriticalWinApiResult(CreateCaret(windowHandle, (HBITMAP)nullptr, 1, lineHeight));
    AssertCriticalWinApiResult(SetCaretPos(currentTextPoistion.GetX(), borderWidth + padding));
    AssertCriticalWinApiResult(ShowCaret(windowHandle));
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
void CBSumCaret::CaretPos()
{
	SetCaretPos ( (int)(m_XPosition - m_ScrollXPosition), (int)(m_YPosition - m_ScrollYPosition) );
	// for status bar updates
}
Ejemplo n.º 5
0
/***********************************************************************
 *          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);
}
Ejemplo n.º 6
0
//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;
}
Ejemplo n.º 7
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;	
}
Ejemplo n.º 8
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;
}
Ejemplo n.º 9
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;
}
Ejemplo n.º 10
0
// ======================================= 
// 정의 : 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);
}
Ejemplo n.º 11
0
/* 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;
}
Ejemplo n.º 12
0
Archivo: de_win.c Proyecto: 8l/lllm
void update_cursor(void)
{
    SetCaretPos(last_col * char_width, last_line * char_height);
    ShowCaret(hwnd);
}
Ejemplo n.º 13
0
DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetCaretPos(ITextHost *iface,
        INT x, INT y)
{
    return SetCaretPos(x, y);
}
Ejemplo n.º 14
0
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);
}
Ejemplo n.º 15
0
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);
        }
    }
}
Ejemplo n.º 16
0
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 );
}
Ejemplo n.º 17
0
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);
}
Ejemplo n.º 18
0
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);
}
Ejemplo n.º 19
0
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;
}
Ejemplo n.º 20
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);
}
Ejemplo n.º 21
0
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;
}
Ejemplo n.º 22
0
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));
}
Ejemplo n.º 23
0
/* 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);
}
Ejemplo n.º 24
0
/** 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;
}
Ejemplo n.º 25
0
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);

}
Ejemplo n.º 26
0
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);
}
Ejemplo n.º 28
0
/***********************************************************************
 *           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;
}
Ejemplo n.º 29
0
void setCaretSize(int w, int h) {
  DestroyCaret();
  CreateCaret(g_hWnd, 0, w, h);
  SetCaretPos(g_caretX, g_caretY);
}
Ejemplo n.º 30
0
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;
}