home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / videotlk.zip / SAMPLES / EX1 / EX1.C next >
Text File  |  1999-01-26  |  15KB  |  413 lines

  1.  
  2. /*------------------------------------------------------------------*
  3.  *                                                                  *
  4.  *  Video Toolkit For OS/2 Version 2.0                              *
  5.  *  Example PM Application No. 1                                    *
  6.  *  Date : 22/02/95.                                                *
  7.  *  Copyright (c) Abbotsbury Software Ltd., United Kingdom. 1995-98 *
  8.  *                                                                  *
  9.  *  Filename : ex1.c                                                *
  10.  *                                                                  *
  11.  *------------------------------------------------------------------*/
  12.  
  13. #define INCL_PM
  14.  
  15. #include <os2.h>
  16. #include <os2me.h>
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <vcadd.h>
  21. #include <vcai.h>
  22. #include "ex1.h"
  23. #include "helpfunc.h"
  24.  
  25.  
  26.                             // The following external variable is imported
  27.                             // from a DLL called VIDIPF (the binary of which
  28.                             // is contained in the DLL sub-directory of the
  29.                             // toolkit). The VIDIPF DLL allows the TV to be
  30.                             // displayed within a help window, but it requires
  31.                             // 1 piece of information. This is :-
  32.                             //
  33.                             //   1. Calling app window handle - for sending
  34.                             //      an update message to the app when the
  35.                             //      help window is closed.
  36. // extern  HWND    HwndApp;
  37.  
  38. HWND    HwndFrame;
  39.  
  40. static  UCHAR   *Copyright =
  41.   "Copyright (c) Abbotsbury Software Ltd., UK. 1994-1998. All Rights Reserved";
  42. static  HAB     Hab;
  43. static  LONG    NumColours, Width, Height;
  44. static  LONG    Colours[256];
  45. static  VCADEVINFO  DevInfo;
  46. static  CHAR    txt[256];
  47. static  DRIVERHANDLE    DevHandle;
  48.  
  49. int     main(int argc, char **argv);
  50. void    msg_box (UCHAR *txt, UCHAR *title, ULONG options);
  51. void    err_msg (UCHAR *mess);
  52. MRESULT EXPENTRY ClientWndProc (HWND, ULONG, MPARAM, MPARAM);
  53. MRESULT EXPENTRY QuitDlgProc (HWND, ULONG, MPARAM, MPARAM);
  54. MRESULT EXPENTRY AboutDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  55.  
  56. static  void    init_colour (void);
  57. static  LONG    get_colour (HPS hps);
  58. static  void    map_pallete (HPS hps);
  59.  
  60. int main (int argc, char **argv)
  61. {
  62.     CHAR    szClient[] = "Client";
  63.     ULONG   flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU | FCF_ACCELTABLE |
  64.                            FCF_SIZEBORDER | FCF_MINMAX | FCF_ICON |
  65.                            FCF_SHELLPOSITION | FCF_TASKLIST;
  66.     HMQ     hmq;
  67.     QMSG    qmsg;
  68.     USHORT  dev_instance;
  69.     CHAR    dev_type[20];
  70.     HWND    hwndClient;
  71.  
  72.         if (argc < 3)
  73.             DosExit (EXIT_PROCESS, 1);
  74.  
  75.         Hab = WinInitialize (0);
  76.         if (!Hab)
  77.             DosExit (EXIT_PROCESS, 1);
  78.  
  79.         hmq = WinCreateMsgQueue (Hab, 0);
  80.         if (!hmq)
  81.             DosExit (EXIT_PROCESS, 1);
  82.  
  83.         strcpy (dev_type, argv[1]);
  84.         dev_instance = (USHORT)atoi (argv[2]);
  85.         DevHandle = VcaiDeviceOpen (dev_type, dev_instance);
  86.         if (DevHandle < 0)
  87.         {
  88.             sprintf (txt, "Cannot Open Device %u !", atoi (argv[2]));
  89.             msg_box (txt, "Error", MB_OK | MB_ERROR);
  90.             DosExit (EXIT_PROCESS, 1);
  91.         }
  92.  
  93.         VcaiWCastMonitor (800, 600, "");
  94.  
  95.         WinRegisterClass (Hab, szClient, ClientWndProc,
  96.                           CS_SIZEREDRAW | CS_MOVENOTIFY, 0);
  97.  
  98.         sprintf (txt, "Example 1 - %s %u", dev_type, dev_instance);
  99.  
  100.         HwndFrame = WinCreateStdWindow (HWND_DESKTOP,
  101.                                         WS_VISIBLE,
  102.                                         &flFrameFlags,
  103.                                         szClient,
  104.                                         txt,
  105.                                         0L,
  106.                                         (HMODULE)NULLHANDLE,
  107.                                         IDR_MAIN,
  108.                                         &hwndClient);
  109.         if (!HwndFrame)
  110.             return 0;
  111.  
  112.                                 // Setup the HwndApp variable exported by the
  113.                                 // VIDIPF DLL which allows the application
  114.                                 // window to be updated once the help window
  115.                                 // containing the TV is closed.
  116. //        HwndApp = HwndFrame;
  117.  
  118.         DevInfo.Length = sizeof (VCADEVINFO);
  119.  
  120.         VcaiDeviceInfoGet (&DevInfo);
  121.  
  122.         HelpInit (HwndFrame);
  123.  
  124.         WinSetWindowPos (HwndFrame, NULLHANDLE, 20, 20, 256, 256, 0);
  125.  
  126.         while (WinGetMsg (Hab, &qmsg, NULLHANDLE, 0, 0))
  127.             WinDispatchMsg (Hab, &qmsg);
  128.  
  129.         DestroyHelpInstance ();
  130.         WinDestroyWindow (HwndFrame);
  131.         WinDestroyMsgQueue (hmq);
  132.         WinTerminate (Hab);
  133.         DosExit (EXIT_PROCESS, 0);
  134. }
  135.  
  136. void msg_box (UCHAR *txt, UCHAR *title, ULONG options)
  137. {
  138.         WinMessageBox (HWND_DESKTOP,
  139.                        HWND_DESKTOP,
  140.                        txt,
  141.                        title,
  142.                        IDD_MSG,
  143.                        options);
  144. }
  145.  
  146. void err_msg (UCHAR *mess)
  147. {
  148.     ERRORID err;
  149.     UCHAR   txt[256];
  150.  
  151.         err = WinGetLastError (Hab);
  152.         sprintf (txt, "%s - %lx", mess,  err & 0xffff);
  153.         msg_box (txt, "Error", MB_OK | MB_ERROR);
  154. }
  155.  
  156. MRESULT EXPENTRY ClientWndProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  157. {
  158.     static  BOOL minimize = FALSE;
  159.     static  HWND hwnd_menu;
  160.     HPS     hps;
  161.     RECTL   rcl;
  162.     LONG    bx, by, cy, x, y, ck;
  163.     BOOL    success;
  164.     PSWP    pswp;
  165.     FILE *fd;
  166.  
  167.         switch(msg)
  168.         {
  169.             case WM_CREATE :
  170.                 VcaiOverlay (TRUE);
  171.                 VcaiFreeze (FALSE);
  172.                 init_colour ();
  173.                 hwnd_menu = WinLoadMenu (hwnd, NULLHANDLE, IDR_MAIN);
  174.                 break;
  175.             case WM_PAINT :
  176.                 WinSetWindowPos (hwnd, NULLHANDLE, 20, 20, 256, 256, 0);
  177.                 hps = WinBeginPaint (hwnd, NULLHANDLE, &rcl);
  178.                 WinQueryWindowRect (hwnd, &rcl);
  179.                 ck = get_colour (hps);
  180.                 if ((ULONG)NumColours <= 256)
  181.                     WinFillRect (hps, &rcl, Colours[ck]);
  182.                 else
  183.                     WinFillRect (hps, &rcl, ck);
  184.                 WinEndPaint (hps);
  185.                 break;
  186.             case MSG_SIZE_TV :
  187.             case WM_SIZE :
  188.             case WM_MOVE :
  189.             case WM_WINDOWPOSCHANGED :
  190.                 if (minimize)
  191.                     break;
  192.                 success = WinQueryWindowRect (hwnd, &rcl);
  193.                 if (!success)
  194.                     return 0;
  195.                 WinMapWindowPoints (hwnd, HWND_DESKTOP, (PPOINTL)&rcl, 2);
  196.                 bx = WinQuerySysValue (HWND_DESKTOP, SV_CXSIZEBORDER);
  197.                 by = WinQuerySysValue (HWND_DESKTOP, SV_CYSIZEBORDER);
  198.                 cy = WinQuerySysValue (HWND_DESKTOP, SV_CYSCREEN);
  199.                 x      = rcl.xLeft + bx;
  200.                 y      = cy - rcl.yTop - by;
  201.                 Width  = rcl.xRight - rcl.xLeft;
  202.                 Height = rcl.yTop - rcl.yBottom;
  203.                 VcaiVideoRectValidate (0, 0, 0, 0, (USHORT)x, (USHORT)y,
  204.                                        (USHORT)Width, (USHORT)Height);
  205.  
  206.                 break;
  207.             case WM_MINMAXFRAME :
  208.                 pswp = (PSWP)PVOIDFROMMP (mp1);
  209.                 if (!(pswp->fl & SWP_MINIMIZE))
  210.                 {
  211.                     minimize = FALSE;
  212.                     break;
  213.                 }
  214.                 minimize = TRUE;
  215.                 VcaiVideoRectValidate (0, 0, 0, 0, 0, 0, 0, 0);
  216.                 break;
  217.  
  218.             case WM_BUTTON2CLICK :
  219.                 WinPopupMenu (hwnd, hwnd, hwnd_menu,
  220.                               MOUSEMSG (&msg)->x, MOUSEMSG (&msg)->y, 0L,
  221.                               PU_HCONSTRAIN | PU_VCONSTRAIN |
  222.                               PU_NONE | PU_MOUSEBUTTON1 |
  223.                               PU_KEYBOARD);
  224.                 return 0;
  225.  
  226.             case WM_CLOSE :
  227.                 VcaiDeviceClose (DevHandle);
  228.                 break;
  229.  
  230.             case WM_COMMAND :
  231.                 switch (SHORT1FROMMP (mp1))
  232.                 {
  233.                     case IDM_FILE_QUIT :
  234.                         WinDlgBox (HWND_DESKTOP,
  235.                                    HwndFrame,
  236.                                    (PFNWP)QuitDlgProc,
  237.                                    (HMODULE)NULLHANDLE,
  238.                                    IDD_QUIT,
  239.                                    NULL);
  240.                         WinInvalidateRegion (HwndFrame, NULLHANDLE, FALSE);
  241.                         break;
  242.                     case IDM_HELPCONTENTS :
  243.                         HelpContents ();
  244.                         break;
  245.                     case IDM_HELPINDEX :
  246.                         HelpIndex ();
  247.                         break;
  248.                     case IDM_KEYSHELP :
  249.                         HelpKeys ();
  250.                         break;
  251.                     case IDM_GENERALHELP :
  252.                         HelpHelpForHelp ();
  253.                         break;
  254.                     case IDM_HELPPRODUCTINFO :
  255.                         HelpAbout ();
  256.                         break;
  257.                     default :
  258.                         break;
  259.                 }
  260.             case HM_QUERY_KEYS_HELP :
  261.                 return ((MRESULT)PANEL_KEYSHELP);
  262.             case MSG_UPDATE_WINDOW :
  263.                 WinQueryWindowRect (hwnd, &rcl);
  264.                 WinInvalidateRect (hwnd, &rcl, TRUE);
  265.                 VcaiDeviceConnect (DevHandle);
  266.                 WinPostMsg (hwnd, MSG_SIZE_TV, NULL, NULL);
  267.                 return 0;
  268.             default :
  269.                 break;
  270.         }
  271.         return WinDefWindowProc (hwnd,msg,mp1,mp2);
  272. }
  273.  
  274. MRESULT EXPENTRY QuitDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  275. {
  276.         switch (msg)
  277.         {
  278.             case WM_COMMAND :
  279.                 switch (SHORT1FROMMP (mp1))
  280.                 {
  281.                     case DID_OK :
  282.                         WinPostMsg (HwndFrame, WM_CLOSE, NULL, NULL);
  283.                         WinDismissDlg (hwnd, TRUE);
  284.                         break;
  285.                     case DID_CANCEL :
  286.                         WinDismissDlg (hwnd, TRUE);
  287.                         break;
  288.                     default :
  289.                         break;
  290.                 }
  291.                 break;
  292.             default :
  293.                 break;
  294.         }
  295.         return WinDefDlgProc (hwnd, msg, mp1, mp2);
  296. }
  297.  
  298. MRESULT EXPENTRY AboutDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  299. {
  300.     HPS     hps;
  301.     RECTL   rcl;
  302.     LONG    x, y;
  303.     CHAR    txt[80];
  304.  
  305.         switch (msg)
  306.         {
  307.             case WM_PAINT :
  308.                 hps = WinBeginPaint (hwnd, NULLHANDLE, &rcl);
  309.                 WinQueryWindowRect (hwnd, &rcl);
  310.                 WinFillRect (hps, &rcl, CLR_PALEGRAY);
  311.                 sprintf (txt, "%30.30s", DevInfo.ProdInfo);
  312.                 WinSetDlgItemText (hwnd, IDD_ABOUT_PROD_INFO, txt);
  313.                 sprintf (txt, "%30.30s", DevInfo.ManInfo);
  314.                 WinSetDlgItemText (hwnd, IDD_ABOUT_MAN_INFO, txt);
  315.                 sprintf (txt, "%10.10s", DevInfo.Version);
  316.                 WinSetDlgItemText (hwnd, IDD_ABOUT_VERSION, txt);
  317.                 WinDrawBorder (hps, &rcl, x, y, 0L, 0L, DB_AREAATTRS |
  318.                                DB_DLGBORDER);
  319.                 WinEndPaint (hps);
  320.                 break;
  321.             case WM_COMMAND :
  322.                 switch (SHORT1FROMMP (mp1))
  323.                 {
  324.                     case DID_OK :
  325.                         WinDismissDlg (hwnd, TRUE);
  326.                         break;
  327.                     default :
  328.                         break;
  329.                 }
  330.                 break;
  331.             default :
  332.                 break;
  333.         }
  334.         return WinDefDlgProc (hwnd, msg, mp1, mp2);
  335. }
  336.  
  337. static void init_colour ()
  338. {
  339.     HDC     hdc;
  340.     DEVOPENSTRUC dop = {NULL, "DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL,
  341.                         NULL};
  342.  
  343.         hdc = DevOpenDC (Hab, OD_INFO, "*", 5L, (PDEVOPENDATA)&dop, NULLHANDLE);
  344.         DevQueryCaps (hdc, CAPS_COLORS, 1L, &NumColours);
  345.         DevCloseDC (hdc);
  346. }
  347.  
  348.                         // The colour value for the Video Colour Key
  349.                         // is a physical palette value.
  350.                         // For systems with 256 or less colours in the
  351.                         // palette, you MUST map the physical palette
  352.                         // to PM logical palette first.
  353.                         // If there are more than 256 colours this
  354.                         // step should be ignored.
  355. static LONG get_colour (HPS hps)
  356. {
  357.     LONG index;
  358.  
  359.         map_pallete (hps);
  360.  
  361.         index = VcaiColourkeyGet();
  362.         if (index > (ULONG)NumColours)
  363.         {
  364.             index = COLOUR_KEY_DEFAULT;
  365.             VcaiColourkeySet (index);
  366.         }
  367.         return (LONG)index;
  368. }
  369.  
  370. static void map_pallete (HPS hps)
  371. {
  372.     LONG    rc;
  373.     VCASCREENINFO vs;
  374.     USHORT cx, cy, i;
  375.  
  376.         if ((ULONG)NumColours <= 256)
  377.         {
  378.             rc = GpiQueryRealColors (hps, 0L, 0L, NumColours, Colours);
  379.             if (rc == GPI_ALTERROR)
  380.             {
  381.                 err_msg ("GpiQueryRealColors");
  382.                 return;
  383.             }
  384.         }
  385.         cx = WinQuerySysValue (HWND_DESKTOP, SV_CXSCREEN);
  386.         cy = WinQuerySysValue (HWND_DESKTOP, SV_CYSCREEN);
  387.         vs.ulLength = sizeof (VCASCREENINFO);
  388.         vs.ul_RESV01 = 0L;
  389.         vs.ulWidth = (ULONG)cx;
  390.         vs.ulHeight = (ULONG)cy;
  391.         vs.ulNumColours = (ULONG)NumColours;
  392.         vs.ulHFreq = 0L;
  393.         vs.ulVFreq = 0L;
  394.         if ((ULONG)NumColours <= 256)
  395.         {
  396.             for (i = 0; i < NumColours; i++)
  397.                 vs.ulRGB[i] = (ULONG)Colours[i];
  398.         }
  399.         else
  400.         {
  401.             for (i = 0; i < 256; i++)
  402.                 vs.ulRGB[i] = 0L;
  403.         }
  404.         VcaiScreenInfoSet (&vs);
  405.         rc = GpiCreateLogColorTable (hps, LCOL_RESET, LCOLF_RGB,
  406.                                      0L, 0L, (PLONG)0L);
  407.         if (!rc)
  408.         {
  409.             err_msg ("GpiCreateLogColorTable");
  410.             return;
  411.         }
  412. }
  413.