home *** CD-ROM | disk | FTP | other *** search
/ Programming Tool Box / SIMS_2.iso / vb_code2 / texthook / txthook.c < prev    next >
C/C++ Source or Header  |  1992-09-08  |  4KB  |  156 lines

  1. /************************************************************************
  2. TXTHOOK.DLL -- Author: Jeff Simms -- CIS 72200,3173 --    September 7, 1992
  3.  
  4. Purpose - Subclass VB textbox to add 'ES_NOHIDESEL' functionality. Also
  5. adds caret choice and overstrike mode.
  6.  
  7. Modesty prevents me from taking full credit for this code. But hopefully
  8. this is cut and paste at its best.
  9. ***********************************************************************/
  10.  
  11. #include <windows.h>
  12. #include "txthook.h"
  13.  
  14. int gOverwrite=0,nWidth;
  15. HBITMAP ghBitmap=0;
  16. HFONT hfont,tmpfont;
  17. POINT  lppt;
  18. TEXTMETRIC tm;
  19. HDC hdc;
  20. FARPROC  lpfnVBEditWndProc;
  21. HWND hVBEditWnd=0,hVBFormWnd,wnd;
  22. WORD wFlag=0,wStart,wEnd;
  23. DWORD dwResult;
  24.  
  25. int FAR PASCAL WEP (int bSystemExit)
  26. {
  27.     return (1);
  28. }
  29.  
  30. VOID __export FAR PASCAL SetTextHook(HWND hVBTextWnd,HWND hvbFormWnd)
  31. {
  32.     if (hVBEditWnd)
  33.        return;
  34.  
  35.     hVBEditWnd = hVBTextWnd;
  36.     hVBFormWnd = hvbFormWnd;
  37.     GetCaretPos(&lppt);
  38.     NewFont();
  39.  
  40.     lpfnVBEditWndProc = (FARPROC) SetWindowLong(hVBEditWnd,GWL_WNDPROC,
  41.                  (DWORD)(FARPROC) MainFilterProc);
  42.     SetFocus(hVBEditWnd);
  43. }
  44.  
  45. VOID __export FAR PASCAL TextOverstrike(int bSwitch)
  46. {
  47.        gOverwrite = bSwitch;
  48.     if (GetFocus() == hVBEditWnd){
  49.         DestroyCaret();
  50.         DoTheCaretThing();
  51.     }
  52.     else
  53.         SetFocus(hVBEditWnd);
  54. }
  55.  
  56. VOID __export FAR PASCAL CaretBitmap(HBITMAP hbitmap)
  57. {
  58.     if (ghBitmap != hbitmap)
  59.     DeleteObject(ghBitmap);
  60.  
  61.     ghBitmap = hbitmap;
  62.     if (GetFocus() == hVBEditWnd){
  63.         DestroyCaret();
  64.         DoTheCaretThing();
  65.     }
  66.     else
  67.         SetFocus(hVBEditWnd);
  68. }
  69.  
  70. VOID FAR PASCAL DoTheCaretThing()
  71. {
  72.  
  73.        if (hfont != (HFONT) SendMessage(hVBEditWnd,WM_GETFONT,0,0L))
  74.         NewFont();
  75.  
  76.         if (!gOverwrite)
  77.         nWidth = GetSystemMetrics(SM_CXBORDER)*2;
  78.         else
  79.         nWidth = tm.tmAveCharWidth;
  80.         CreateCaret(hVBEditWnd,ghBitmap,nWidth,tm.tmHeight);
  81.         if (!wFlag)
  82.         SetCaretPos(lppt.x,lppt.y);
  83.         else
  84.         wFlag = 0;
  85.         ShowCaret(hVBEditWnd);
  86.  
  87. }
  88.  
  89.  
  90. VOID FAR PASCAL NewFont()
  91. {
  92.     tmpfont = (HFONT) SendMessage(hVBFormWnd,WM_GETFONT,0,0L);
  93.     hfont = (HFONT) SendMessage(hVBEditWnd,WM_GETFONT,0,0L);
  94.     SendMessage(hVBFormWnd,WM_SETFONT,(WORD) hfont,0L);
  95.     hdc = GetDC(hVBFormWnd);
  96.     GetTextMetrics(hdc,&tm);
  97.     ReleaseDC(hVBFormWnd,hdc);
  98.     SendMessage(hVBFormWnd,WM_SETFONT,(WORD) tmpfont,0L);
  99. }
  100.  
  101. VOID __export FAR PASCAL UndoTextHook(int zero)
  102. {
  103.     SetWindowLong(hVBEditWnd,GWL_WNDPROC, (DWORD)(FARPROC) lpfnVBEditWndProc);
  104.     hVBEditWnd = 0;
  105.     gOverwrite = 0;
  106.     DeleteObject(ghBitmap);
  107.     ghBitmap = 0;
  108. }
  109.  
  110. LONG __export FAR PASCAL MainFilterProc(HWND hWnd,unsigned wMsg,WORD wParam,LONG lParam)
  111. {
  112.  
  113.       switch (wMsg){
  114.  
  115.     case WM_CHAR:
  116.         if (gOverwrite && (wParam != VK_BACK) && (wParam != VK_DELETE))
  117.         {
  118.         dwResult = SendMessage(hVBEditWnd,EM_GETSEL,0,0L);
  119.                 wStart   = LOWORD(dwResult);
  120.                 wEnd     = HIWORD(dwResult);
  121.  
  122.                 if (wEnd == wStart)
  123.                 {
  124.                    wEnd++;
  125.            SendMessage(hVBEditWnd,EM_SETSEL,0,MAKELONG(wStart,wEnd));
  126.                 }
  127.         SendMessage(hVBEditWnd,EM_REPLACESEL,0,(DWORD)((LPSTR)&wParam ));
  128.                 return (FALSE);
  129.             }
  130.             break;
  131.  
  132.      case WM_LBUTTONDOWN:
  133.         wFlag = 1;
  134.         SetFocus(hVBEditWnd);
  135.         break;
  136.  
  137.      case WM_SETFOCUS:
  138.         DoTheCaretThing();
  139.         break;
  140.  
  141.     case  WM_KILLFOCUS:
  142.         GetCaretPos(&lppt);
  143.         DestroyCaret();
  144.         return 0L;
  145.         break;
  146.  
  147.     case  WM_DESTROY:
  148.         DeleteObject(ghBitmap);
  149.         SetWindowLong(hVBEditWnd,GWL_WNDPROC, (DWORD)(FARPROC) lpfnVBEditWndProc);
  150.         PostMessage(hVBEditWnd,WM_DESTROY,0,0);
  151.         return 0L;
  152.         break;
  153.       }
  154.   return(CallWindowProc(lpfnVBEditWndProc,hWnd, wMsg, wParam, lParam));
  155. }
  156.