home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 November / Chip_1999-11_cd.bin / ctenari / Novak / ZOOM.CPP < prev    next >
C/C++ Source or Header  |  1999-08-30  |  15KB  |  521 lines

  1. /*
  2.  
  3. TOTO JSOU ZDROJOVE TEXTY K VERZI 1.1
  4.  
  5.       DIRECT DRAW ZOOM V 1.1
  6.  
  7.  AUTOR: Ondrej Novak
  8.  ROK: 1999
  9.  MESIC: Unor
  10.  KONTAKT: xnovako1@cs.felk.cvut.cz
  11.  
  12.  Tento program muze byt volne siren a modifikovan. Spada do PUBLIC DOMAIN.
  13.  Zdrojove texty maji zaroven slouzit jako priklad vyuziti DirectX.
  14.  Autor prosi vsechny, kteri vyuziji tento program, nebo zdrojak ke svemu
  15.  programovani, aby mi napsali elektronicky dopis. Budu velice potesen. Dekuji.
  16.  
  17. */
  18.  
  19. #include <process.h>
  20. #include <windows.h>
  21. #include <stdio.h>
  22. #include <dd/ddraw.h>
  23. #include <assert.h>
  24.  
  25. #define lpszAppName "DirectDraw ZOOM"  //Jmeno a titulni radek
  26. #define lpszTitle "DirectDraw ZOOM"
  27.  
  28. HWND hMainWnd;    //Handle hlavniho okna
  29. HINSTANCE hInst;  //Handle instance
  30.  
  31. short WinX,WinY;  //Pozice klentske oblasti
  32.  
  33. LPDIRECTDRAWSURFACE lpprim,lptemp;  //ukazatele na primarni surface a pracovni
  34. LPDIRECTDRAW lpdd;  //surface a na objekt directdraw
  35. LPDIRECTDRAWCLIPPER lpclip;
  36.  
  37. int sizeX,sizeY; //Velikost desktopu
  38.  
  39. HPEN penblack,penwhite;  //definice cerneho a bileho pera
  40. HBRUSH brtransp;     //defince transparetniho stetce
  41.  
  42. #define HIGHSPEED 20   //rychlost casovace v ms za provozu
  43. #define SLOWSPEED 1000  //rychlost casovace behem uspani v ms.
  44.  
  45. char hided=0;   //jednicka znamena, ze krizek je skryt
  46. int zoom=4;   //zvetseni.
  47. static timerid; //identifikator casovace.
  48. int movewin=0;
  49. static int sysmem=0;
  50.  
  51.  
  52. #define IDC_ZOOM1 (WM_USER+1)  //zpravy systemoveo menu
  53. #define IDC_ZOOM2 (WM_USER+2)
  54. #define IDC_ZOOM3 (WM_USER+3)
  55. #define IDC_ZOOM4 (WM_USER+4)
  56. #define IDC_ZOOM6 (WM_USER+6)
  57. #define IDC_ZOOM8 (WM_USER+8)
  58. #define IDC_ZOOM12 (WM_USER+12)
  59. #define IDC_ZOOM16 (WM_USER+16)
  60. #define IDC_HIDEKZ (WM_USER+17)
  61. #define IDC_MAILME (WM_USER+18)
  62. #define IDC_MOVEW (WM_USER+19)
  63. #define IDC_SYSMEM (WM_USER+20)
  64.  
  65. LPDIRECTDRAWSURFACE CloneSurface(LPDIRECTDRAWSURFACE surf,HWND hWnd)
  66.   {
  67.   DDSURFACEDESC ddsd;
  68.   LPDIRECTDRAWSURFACE clone;
  69.   RECT rect;
  70.  
  71.   if (lpprim->IsLost()) lpprim->Restore();
  72.   GetClientRect(hWnd,&rect);
  73.   assert(surf!=NULL);
  74.   ddsd.dwSize=sizeof(ddsd);
  75.   surf->GetSurfaceDesc(&ddsd);
  76.   ddsd.dwFlags=DDSD_CAPS |DDSD_HEIGHT |DDSD_WIDTH |DDSD_PIXELFORMAT;
  77.   ddsd.dwHeight=rect.bottom-rect.top;
  78.   ddsd.dwWidth=rect.right-rect.left;
  79.   ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN | (sysmem?DDSCAPS_SYSTEMMEMORY:0);
  80.   if (lpdd->CreateSurface(&ddsd,(LPDIRECTDRAWSURFACE *)&clone,NULL)!=DD_OK) return NULL;
  81.   return clone;
  82.   }
  83.  
  84.  
  85. /*
  86. LPDIRECTDRAWSURFACE CloneSurface(LPDIRECTDRAWSURFACE surf)
  87.   {
  88.   DDSURFACEDESC ddsd;
  89.   LPDIRECTDRAWSURFACE clone;
  90.  
  91.   if (surf->IsLost()) surf->Restore();
  92.   assert(surf!=NULL);
  93.   ddsd.dwSize=sizeof(ddsd);
  94.   surf->GetSurfaceDesc(&ddsd);
  95.   ddsd.dwFlags=DDSD_CAPS |DDSD_HEIGHT |DDSD_WIDTH |DDSD_PIXELFORMAT;
  96.   ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
  97.   if (lpdd->CreateSurface(&ddsd,(LPDIRECTDRAWSURFACE *)&clone,NULL)!=DD_OK) return NULL;
  98.   return clone;
  99.   }
  100. */
  101.  
  102. void InitDirect()
  103.   {
  104.   HRESULT res;
  105.   DDSURFACEDESC sdesc;
  106.  
  107.   res=DirectDrawCreate(NULL,&lpdd,NULL);
  108.   assert(res==DD_OK);
  109.   res=lpdd->SetCooperativeLevel(hMainWnd,DDSCL_NORMAL);
  110.   assert(res==DD_OK);
  111.   sdesc.dwSize=sizeof(sdesc);
  112.   sdesc.dwFlags=DDSD_CAPS;
  113.   sdesc.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
  114.   res=lpdd->CreateSurface(&sdesc,&lpprim,NULL);
  115.   assert(res==DD_OK);
  116.   lpprim->GetSurfaceDesc(&sdesc);
  117.   sizeX=sdesc.dwWidth;
  118.   sizeY=sdesc.dwHeight;
  119.   DirectDrawCreateClipper(0,&lpclip,NULL);
  120.   lpclip->SetHWnd(0,hMainWnd);
  121.   }
  122.  
  123.  
  124. void DrawCross(int x,int y)
  125.   {
  126.   HDC hdc;
  127.   POINT p;
  128.   int sz1=2*zoom,sz2=6*zoom;
  129.  
  130.   x+=zoom/2;
  131.   y+=zoom/2;
  132.   lptemp->GetDC(&hdc);
  133.   SelectObject(hdc,penwhite);
  134.   SelectObject(hdc,brtransp);
  135. //  Rectangle(hdc,x-4,y-4,x+4,y+4);
  136.   MoveToEx(hdc,x-sz1,y,&p);LineTo(hdc,x-sz2,y);
  137.   MoveToEx(hdc,x+sz1,y,&p);LineTo(hdc,x+sz2,y);
  138.   MoveToEx(hdc,x,y-sz1,&p);LineTo(hdc,x,y-sz2);
  139.   MoveToEx(hdc,x,y+sz1,&p);LineTo(hdc,x,y+sz2);
  140.   SelectObject(hdc,penblack);
  141.   MoveToEx(hdc,x-sz1,y+1,&p);LineTo(hdc,x-sz2,y+1);
  142.   MoveToEx(hdc,x+sz1,y+1,&p);LineTo(hdc,x+sz2,y+1);
  143.   MoveToEx(hdc,x+1,y-sz1,&p);LineTo(hdc,x+1,y-sz2);
  144.   MoveToEx(hdc,x+1,y+sz1,&p);LineTo(hdc,x+1,y+sz2);
  145.   MoveToEx(hdc,x-sz1,y-1,&p);LineTo(hdc,x-sz2,y-1);
  146.   MoveToEx(hdc,x+sz1,y-1,&p);LineTo(hdc,x+sz2,y-1);
  147.   MoveToEx(hdc,x-1,y-sz1,&p);LineTo(hdc,x-1,y-sz2);
  148.   MoveToEx(hdc,x-1,y+sz1,&p);LineTo(hdc,x-1,y+sz2);
  149. /* MoveToEx(hdc,x-3,y-3,&p);LineTo(hdc,x-5,y-5);
  150.   MoveToEx(hdc,x-3,y+3,&p);LineTo(hdc,x-5,y+5);
  151.   MoveToEx(hdc,x+3,y-3,&p);LineTo(hdc,x+5,y-5);
  152.   MoveToEx(hdc,x+3,y+3,&p);LineTo(hdc,x+5,y+5);*/
  153. //  Rectangle(hdc,x-5,y-5,x+5,y+5);
  154.   lptemp->ReleaseDC(hdc);
  155.  }
  156.  
  157. void Uhni(int x,int y)
  158.   {
  159.   RECT r,r2;
  160.   int nx,ny;
  161.   int midx,midy;
  162.  
  163.   GetClientRect(hMainWnd,&r);
  164.   r2=r;
  165.   r.left+=5+WinX;
  166.   r.right+=-5+WinX;
  167.   r.top+=5+WinY;
  168.   r.bottom+=-5
  169.     +WinY;
  170.   if (x>=r.left && x<r.right && y>=r.top && y<r.bottom)
  171.     {
  172.     midx=r.left+r.right>>1;
  173.     midy=r.top+r.bottom>>1;
  174.     midx=x-midx;
  175.     midy=y-midy;
  176.     /*if (midx<0 && midx<-abs(midy)) nx=x,ny=WinX;
  177.     else if (midx>0 && midx>abs(midy)) nx=x-r2.right,ny=WinY;
  178.     else if (midy<0 && midy<-abs(midx)) nx=WinX,ny=y;
  179.     else if (midy>0 && midy>abs(midx)) nx=WinX,ny=y-r2.bottom;*/
  180.     if (midx>0 || midy>0) nx=x+50,ny=y+50;else nx=x-r2.right-50,ny=y-r2.bottom-50;
  181.     if (nx<0) nx=sizeX-r2.right;
  182.     if (ny<0) ny=sizeY-r2.bottom;
  183.     if (nx+r2.right>sizeX) nx=0;
  184.     if (ny+r2.bottom>sizeY) ny=0;
  185.     SetWindowPos(hMainWnd,NULL,nx,ny,0,0,SWP_NOSIZE|SWP_NOZORDER);
  186.     }
  187.   }
  188.  
  189. void ShowZoomedWindow(int x,int y)
  190.   {
  191.   RECT src,trg,trg2,trg3;
  192.   HRESULT res;
  193.  
  194.   if (lptemp==NULL) lptemp=CloneSurface(lpprim,hMainWnd);
  195.   if (lptemp==NULL) return;
  196.   GetClientRect(hMainWnd,&trg);
  197.   src=trg;
  198.   trg2=trg;
  199.   trg3=trg;
  200.   src.right/=zoom;
  201.   src.bottom/=zoom;
  202.   trg.left+=WinX;
  203.   trg.top+=WinY;
  204.   trg.right+=WinX;
  205.   trg.bottom+=WinY;
  206.   src.left=x-src.right/2;
  207.   src.top=y-src.bottom/2;
  208.   src.right=x+src.right/2;
  209.   src.bottom=y+src.bottom/2;
  210. /*  trg.left=max(trg.left,0);
  211.   trg.right=min(trg.right,sizeX);
  212.   trg.top=max(trg.top,0);
  213.   trg.bottom=min(trg.bottom,sizeY);*/
  214.   if (src.left<0)
  215.     {
  216.     trg2.left-=zoom*src.left;
  217.     src.left=0;
  218.     }
  219.   if (src.top<0)
  220.     {
  221.     trg2.top-=zoom*src.top;
  222.     src.top=0;
  223.     }
  224.   if (src.right>=sizeX)
  225.     {
  226.     trg2.right+=(sizeX-src.right)*zoom;
  227.     src.right=sizeX;
  228.     }
  229.   if (src.bottom>=sizeY)
  230.     {
  231.     trg2.bottom+=(sizeY-src.bottom)*zoom;
  232.     src.bottom=sizeY;
  233.     }
  234.   if (lptemp->IsLost) lptemp->Restore();
  235.   if (lpprim->IsLost) lpprim->Restore();
  236.   res=lptemp->Blt(&trg2,lpprim,&src,DDBLT_WAIT,NULL);
  237.   if (!hided) DrawCross(trg3.left+trg3.right>>1,trg3.top+trg3.bottom>>1);
  238.   lpprim->SetClipper(lpclip);
  239.   res=lpprim->Blt(&trg,lptemp,&trg3,DDBLT_WAIT,NULL);
  240.   if (res!=DDERR_INVALIDCLIPLIST) lpclip->SetHWnd(0,hMainWnd);
  241.   lpprim->SetClipper(NULL);
  242.   }
  243.  
  244. void CheckByZoom()
  245.   {
  246.   HMENU hmn;
  247.   char ch,uchk;
  248.  
  249.   ch=MF_BYCOMMAND | MF_CHECKED;
  250.   uchk=MF_BYCOMMAND | MF_UNCHECKED;
  251.   hmn=GetSystemMenu(hMainWnd,0);
  252.   CheckMenuItem(hmn,IDC_ZOOM2,uchk);
  253.   CheckMenuItem(hmn,IDC_ZOOM3,uchk);
  254.   CheckMenuItem(hmn,IDC_ZOOM4,uchk);
  255.   CheckMenuItem(hmn,IDC_ZOOM6,uchk);
  256.   CheckMenuItem(hmn,IDC_ZOOM8,uchk);
  257.   CheckMenuItem(hmn,IDC_ZOOM12,uchk);
  258.   CheckMenuItem(hmn,IDC_ZOOM16,uchk);
  259.   CheckMenuItem(hmn,WM_USER+zoom,ch);
  260.   CheckMenuItem(hmn,IDC_HIDEKZ,hided?ch:uchk);
  261.   CheckMenuItem(hmn,IDC_MOVEW,movewin?ch:uchk);
  262.   CheckMenuItem(hmn,IDC_SYSMEM,sysmem?ch:uchk);
  263.   }
  264.  
  265.  
  266. char *GetIniName()
  267.   {
  268.   char szBuff[1000];
  269.   char *c,*d,*e;
  270.  
  271.   GetModuleFileName(hInst,szBuff,sizeof(szBuff));
  272.   c=strrchr(szBuff,'.');
  273.   d=strrchr(szBuff,'\\');
  274.   if (c==NULL || c<d) e=strchr(szBuff,0);else e=c;
  275.   strcpy(e,".INI");
  276.   c=(char *)malloc(strlen(szBuff)+1);
  277.   strcpy(c,szBuff);
  278.   return c;
  279.   }
  280.  
  281. void SaveIniFile()
  282.   {
  283.   char *ini;
  284.   FILE *f;
  285.   WINDOWPLACEMENT r;
  286.  
  287.   ini=GetIniName();
  288.   f=fopen(ini,"w");
  289.   free(ini);
  290.   if (f==NULL) return;
  291.   r.length=sizeof(r);
  292.   GetWindowPlacement(hMainWnd,&r);
  293.   fprintf(f,"%d %d %d %d %d %d %d %d\n",
  294.             r.rcNormalPosition.left,
  295.             r.rcNormalPosition.top,
  296.             r.rcNormalPosition.right,
  297.             r.rcNormalPosition.bottom,zoom,hided,movewin,sysmem);
  298.   fclose(f);
  299.   }
  300.  
  301. void LoadIniFile()
  302.   {
  303.   char *ini;
  304.   FILE *f;
  305.   RECT r;
  306.   int i;
  307.  
  308.  
  309.   ini=GetIniName();
  310.   f=fopen(ini,"r");
  311.   free(ini);
  312.   if (f==NULL) return;
  313.   fscanf(f,"%d %d %d %d %d %d %d %d\n",&r.left,&r.top,&r.right,&r.bottom,&zoom,&i,&movewin,&sysmem);
  314.   hided=i;
  315.   SetWindowPos(hMainWnd,NULL,r.left,r.top,r.right-r.left,r.bottom-r.top,SWP_NOZORDER);
  316.   CheckByZoom();
  317.   fclose(f);
  318.   }
  319.  
  320. LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
  321.   {
  322.   switch(uMsg)
  323.     {
  324.     case WM_CREATE:
  325.          {
  326.          LOGBRUSH bb;
  327.          InitDirect();
  328.          timerid=SetTimer(hMainWnd,1,50,NULL);
  329.          penblack=CreatePen(PS_SOLID,0,0);
  330.          penwhite=CreatePen(PS_SOLID,0,0xffffff);
  331.          bb.lbStyle=BS_NULL;
  332.          bb.lbColor=0;
  333.          brtransp=CreateBrushIndirect(&bb);
  334.          }
  335.         break;
  336.     case WM_DESTROY:
  337.         {
  338.         SaveIniFile();
  339.         PostQuitMessage(0);
  340.         KillTimer(hMainWnd,timerid);
  341.         lpprim->Release();
  342.         lptemp->Release();
  343.         lpdd->Release();
  344.         DeleteObject(penblack);
  345.         DeleteObject(penwhite);
  346.         DeleteObject(brtransp);
  347.         break;
  348.         }
  349.     case WM_MOVE:
  350.         {
  351.         WinX=(short)LOWORD(lParam);
  352.         WinY=(short)HIWORD(lParam);
  353.         break;
  354.         }
  355.     case WM_SIZE:
  356.         if (lptemp!=NULL)
  357.           {
  358.           lptemp->Release();
  359.           lptemp=NULL;
  360.           lpclip->SetHWnd(0,hMainWnd);
  361.           }
  362.         break;
  363.     case WM_SYSCOMMAND:
  364.       if (LOWORD(wParam)<=IDC_ZOOM16)
  365.         {
  366.         zoom=LOWORD(wParam)-IDC_ZOOM1+1;
  367.         CheckByZoom();
  368.         }
  369.       if (LOWORD(wParam)==IDC_HIDEKZ)
  370.         {
  371.         hided=!hided;
  372.         CheckByZoom();
  373.         }
  374.       if (LOWORD(wParam)==IDC_MOVEW)
  375.         {
  376.         movewin=!movewin;
  377.         CheckByZoom();
  378.         }
  379.       if (LOWORD(wParam)==IDC_SYSMEM)
  380.         {
  381.         sysmem=!sysmem;
  382.         lptemp->Release();
  383.         lptemp=NULL;
  384.         CheckByZoom();
  385.         }
  386.       if (LOWORD(wParam)==IDC_MAILME)
  387.         {
  388.         char szBuff[1000];
  389.         char *c;
  390.         GetWindowsDirectory(szBuff,sizeof(szBuff));
  391.         c=strchr(szBuff,0);
  392.         if (c[-1]=='\\') c--;
  393.         strcpy(c,"\\explorer.exe");
  394.         spawnl(_P_NOWAIT,szBuff,szBuff,"mailto:xnovako1@cs.felk.cvut.cz",NULL);
  395.         }
  396.       else return DefWindowProc(hWnd,uMsg,wParam,lParam);
  397.       break;
  398.     case WM_USER:ShowZoomedWindow(wParam,lParam);
  399.                 if (movewin) Uhni(wParam,lParam);
  400.                 break;
  401.     default:return DefWindowProc(hWnd,uMsg,wParam,lParam);
  402.     }
  403.   return TRUE;
  404.   }
  405.  
  406.  
  407. void CreateSystemMenu()
  408.   {
  409.   HMENU hmn;
  410.  
  411.   hmn=GetSystemMenu(hMainWnd,0);
  412.   AppendMenu(hmn,MFT_SEPARATOR,0,"");
  413.   AppendMenu(hmn,MFT_STRING,IDC_ZOOM2,"Zoom 2x");
  414.   AppendMenu(hmn,MFT_STRING,IDC_ZOOM3,"Zoom 3x");
  415.   AppendMenu(hmn,MFT_STRING,IDC_ZOOM4,"Zoom 4x");
  416.   AppendMenu(hmn,MFT_STRING,IDC_ZOOM6,"Zoom 6x");
  417.   AppendMenu(hmn,MFT_STRING,IDC_ZOOM8,"Zoom 8x");
  418.   AppendMenu(hmn,MFT_STRING,IDC_ZOOM12,"Zoom 12x");
  419.   AppendMenu(hmn,MFT_STRING,IDC_ZOOM16,"Zoom 16x");
  420.   AppendMenu(hmn,MFT_SEPARATOR,0,"");
  421.   AppendMenu(hmn,MFT_STRING,IDC_HIDEKZ,"Schovej kurzor");
  422.   AppendMenu(hmn,MFT_STRING,IDC_MOVEW,"Nep°ekß₧ej");
  423.   AppendMenu(hmn,MFT_STRING,IDC_SYSMEM,"Pomalß videokarta");
  424.   AppendMenu(hmn,MFT_SEPARATOR,0,"");
  425.   AppendMenu(hmn,MFT_STRING,IDC_MAILME,"  Autor: Ond°ej Novßk");
  426.   AppendMenu(hmn,MFT_STRING,IDC_MAILME,"  E-mail: xnovako1@cs.felk.cvut.cz");
  427.  
  428.  }
  429.  
  430. int  APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  431.                        LPSTR lpCmdLine, int nCmdShow)
  432.    {
  433.    MSG  msg;
  434.    WNDCLASS   wc;
  435.    HWND hWnd;
  436.    POINT lpt;
  437.    int counter=0,cnt2=0,slow=0;
  438.  
  439.  
  440.    if (hPrevInstance == NULL)
  441.      {
  442.      wc.style = CS_HREDRAW | CS_VREDRAW;
  443.      wc.lpfnWndProc   = (WNDPROC)WndProc;
  444.      wc.cbClsExtra    = 0;
  445.      wc.cbWndExtra    = 0;
  446.      wc.hInstance     = hInstance;
  447.      wc.hIcon         = LoadIcon( hInstance, lpszAppName );
  448.      wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  449.      wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  450.      wc.lpszMenuName  = lpszAppName;
  451.      wc.lpszClassName = lpszAppName;
  452.  
  453.      if ( !RegisterClass( &wc ) )
  454.         {
  455.         MessageBox(NULL,"Unable to register CLASS",NULL,MB_OK);
  456.         return 0;
  457.         }
  458.  
  459.    hWnd = CreateWindow( lpszAppName,
  460.                         lpszTitle,
  461.                         WS_OVERLAPPEDWINDOW,
  462.                         CW_USEDEFAULT, 0,
  463.                         200, 200,
  464.                         NULL,
  465.                         NULL,
  466.                         hInstance,
  467.                         NULL
  468.                       );
  469.  
  470.      if ( !hWnd )
  471.         {
  472.         MessageBox(NULL,"Unable to create main window",NULL,MB_OK);
  473.         return 0;
  474.         }
  475.  
  476.      hMainWnd=hWnd;
  477.      hInst = hInstance;
  478.      CreateSystemMenu();
  479.      CheckByZoom();
  480.      LoadIniFile();
  481.      ShowWindow( hWnd, nCmdShow );
  482.      UpdateWindow( hWnd );
  483.      SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  484.      while( GetMessage( &msg, NULL, 0, 0) )
  485.         {
  486.         if (msg.message==WM_TIMER)  //refresh obsahu klentske oblasti
  487.           {
  488.           char p=!IsIconic(hMainWnd) && (lpt.x!=msg.pt.x || lpt.y!=msg.pt.y);
  489.           if ( p || (counter==20 && !slow)) //jen kdyz se neco hejblo
  490.             {
  491.             PostMessage(hMainWnd,WM_USER,msg.pt.x,msg.pt.y); //posli souradnice
  492.             lpt=msg.pt;
  493.             counter=0;
  494.             if (slow)
  495.               {
  496.               KillTimer(hMainWnd,timerid);
  497.               timerid=SetTimer(hMainWnd,1,HIGHSPEED,NULL);
  498.               slow=0;
  499.               }
  500.             if (p) cnt2=0;
  501.             }
  502.           else counter++,cnt2++;
  503.           if (cnt2>200)
  504.             {
  505.             KillTimer(hMainWnd,timerid);
  506.             timerid=SetTimer(hMainWnd,1,SLOWSPEED,NULL);
  507.             cnt2=0;slow=1;
  508.             }
  509.           }
  510.         TranslateMessage( &msg );
  511.         DispatchMessage( &msg );
  512.         }
  513.      }
  514.    return( msg.wParam );
  515.    }
  516.  
  517.  
  518.  
  519.  
  520.  
  521.