home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 December / VPR9712A.ISO / OLS / WIN32 / COMWP380 / comwp380.exe / SAMPLES.EXE / SAMPLE1.C < prev    next >
C/C++ Source or Header  |  1997-08-25  |  8KB  |  298 lines

  1. /*----------------------*
  2.  * ComWin の API 使用例 *
  3.  *----------------------*
  4.  */
  5.  
  6. #include <windows.h>
  7. #include <stdlib.h>
  8. #include "comwin.h"
  9.  
  10. #define SIZE    80
  11. #define BUFSIZE 80
  12.  
  13. /*----------*
  14.  * 内部関数 *
  15.  *----------*
  16.  */
  17. void DisplayArgument(HINSTANCE hInstance, LPSTR lpszCmdParam);
  18. void DisplayVersion(void);
  19. void DisplayConsoleInfo(void);
  20. void DisplaySum(void);
  21. void DisplayEnv(void);
  22. void DisplayAttr(void);
  23. void DisplayGraph(void);
  24. void Pause(void);
  25.  
  26. /*------------*
  27.  * メイン関数 *
  28.  *------------*
  29.  */
  30. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  31.                    LPSTR lpszCmdParam, int nCmdShow)
  32. {
  33.     DisplayArgument(hInstance, lpszCmdParam);
  34.     Pause();
  35.     DisplayVersion();
  36.     Pause();
  37.     DisplayConsoleInfo();
  38.     Pause();
  39.     DisplaySum();
  40.     Pause();
  41.     DisplayEnv();
  42.     Pause();
  43.     DisplayAttr();
  44.     Pause();
  45.     DisplayGraph();
  46.     return 0;
  47. }
  48.  
  49. /*------------------------------------------------*
  50.  * コマンドラインの文字列を argc, argv 形式にする *
  51.  * MakeArgument の使用例                          *
  52.  *------------------------------------------------*
  53.  */
  54. void DisplayArgument(HINSTANCE hInstance, LPSTR lpszCmdParam)
  55. {
  56.     int argc;
  57.     int nArgv[SIZE];
  58.     char *argv[SIZE];
  59.     char szReturn[SIZE*2];
  60.     char szBuffer[BUFSIZE];
  61.     char *psz;
  62.     int i;
  63.  
  64.     argc = MakeArgument(hInstance, "sample1", lpszCmdParam,
  65.                         nArgv, szReturn, sizeof(szReturn));
  66.  
  67.     wsprintf(szBuffer, "パラメーターの数は%d個です。", argc - 1);
  68.     Puts(szBuffer);
  69.  
  70.     if (argc <= 1) {
  71.         Puts("パラメーターを指定してください。");
  72.     }
  73.  
  74.     Puts("出力方法1");
  75.     for (psz = szReturn; *psz != '\0'; psz += lstrlen(psz) + 1) {
  76.         Puts(psz);
  77.     }
  78.  
  79.     Puts("出力方法2");
  80.     for (i = 0; i < argc; i++) {
  81.         argv[i] = szReturn + nArgv[i];
  82.     }
  83.     for (i = 0; i < argc; i++) {
  84.         Puts(argv[i]);
  85.     }
  86. }
  87.  
  88. /*-------------------------------------------------------*
  89.  * 情報 API の使用例 comwin.dll のバージョンを得る。     *
  90.  * 戻り値の上位バイトに16進数バージョン番号が返されます。*
  91.  *-------------------------------------------------------*
  92.  */
  93. void DisplayVersion(void)
  94. {
  95.     long lVer;
  96.     char szBuf[80];
  97.  
  98.     Puts("comwin.dll のバージョン番号を取得します。");
  99.  
  100.     lVer = GetComWinLong(CW_GETVER, 0);
  101.     wsprintf(szBuf, "ComWin version number = %04X", HIWORD(lVer));
  102.     Puts(szBuf);
  103. }
  104.  
  105. /*--------------------------*
  106.  * コンソールの諸属性を得る *
  107.  *--------------------------*
  108.  */
  109. void DisplayConsoleInfo(void)
  110. {
  111.     CW_S_CONSOLE_INFO ci;
  112.     CW_S_ISATTY ia;
  113.     char szBuf[0x100];
  114.     static char szConsole[] = "コンソール";
  115.     static char szFile[] = "ファイル";
  116.  
  117.     memset(&ci, 0, sizeof(ci));
  118.     ci.lMessage = CW_M_CONSOLE_INFO;
  119.     ci.lSize = sizeof(ci);
  120.     ci.lMode = CW_MODE_GET;
  121.     GetComWinLong(CW_GETMSG, (LONG)(LPLONG)&ci);
  122.  
  123.     wsprintf(szBuf, "サポート標準入出力関数の数 = %d\n", ci.lFuncMax);
  124.     Fputs(szBuf, NULL);
  125.     wsprintf(szBuf, "コンソール最大入力文字数   = %d\n", ci.lBufMax);
  126.     Fputs(szBuf, NULL);
  127.     wsprintf(szBuf, "コンソールのハンドル       = %08lX\n", ci.hwnd);
  128.     Fputs(szBuf, NULL);
  129.     wsprintf(szBuf, "コンソールの桁行 = (%ld,%ld)\n", ci.lColumns,ci.lLines);
  130.     Fputs(szBuf, NULL);
  131.     wsprintf(szBuf, "コンソールの横縦 = (%ld,%ld)\n", ci.lWidth,ci.lHeight);
  132.     Fputs(szBuf, NULL);
  133.  
  134.     memset(&ia, 0, sizeof(ia));
  135.     ia.lMessage = CW_M_ISATTY;
  136.     ia.lSize = sizeof(ia);
  137.     ia.lMode = CW_MODE_GET;
  138.     GetComWinLong(CW_GETMSG, (LONG)(LPLONG)&ia);
  139.  
  140.     wsprintf(szBuf, "標準入力は%sです。\n",
  141.              (ia.lStdIn == TRUE) ? (LPSTR)szConsole : (LPSTR)szFile);
  142.     Fputs(szBuf, NULL);
  143.     wsprintf(szBuf, "標準出力は%sです。\n",
  144.              (ia.lStdOut == TRUE) ? (LPSTR)szConsole : (LPSTR)szFile);
  145.     Fputs(szBuf, NULL);
  146.     wsprintf(szBuf, "標準エラー入力は%sです。\n",
  147.              (ia.lStdErrIn == TRUE) ? (LPSTR)szConsole : (LPSTR)szFile);
  148.     Fputs(szBuf, NULL);
  149.     wsprintf(szBuf, "標準エラー出力は%sです。\n",
  150.              (ia.lStdErrOut == TRUE) ? (LPSTR)szConsole : (LPSTR)szFile);
  151.     Fputs(szBuf, NULL);
  152. }
  153.  
  154. /*-------------------------------------------------------*
  155.  * 入出力関数(Fputs, gets)の使用例                       *
  156.  *-------------------------------------------------------*
  157.  */
  158. void DisplaySum(void)
  159. {
  160.     int i;
  161.     int n;
  162.     int sum;
  163.     char szBuf[80];
  164.  
  165.     Puts("入出力関数(Fputs, gets)の使用例");
  166.     Puts("1からNまでの合計を求めます。");
  167.     Fputs("N=", NULL);
  168.     Fgets(szBuf, 80, NULL);
  169.     n = atoi(szBuf);
  170.     for (i = 1, sum = 0; i <= n; i++) {
  171.         sum += i;
  172.         wsprintf(szBuf, "i = %d, sum = %d", i, sum);
  173.         Puts(szBuf);
  174.     }
  175. }
  176.  
  177. /*----------------------------------------------*
  178.  * 環境変数操作関数(cwPutenv, cwGetenv)の使用例 *
  179.  *----------------------------------------------*
  180.  */
  181. void DisplayEnv(void)
  182. {
  183.     LPSTR lpEnv;
  184.  
  185.     cwPutenv("sample=sample1.c");
  186.     lpEnv = cwGetenv("sample");
  187.     if (lpEnv != NULL) {
  188.         Puts(lpEnv);
  189.     }
  190.     lpEnv = (LPSTR)GetComWinLong(CW_GETENV, 0);
  191.     if (lpEnv != NULL) {
  192.         for (; *lpEnv != '\0'; lpEnv += lstrlen(lpEnv) + 1) {
  193.             Puts(lpEnv);
  194.         }
  195.     }
  196.     cwPutenv("sample=");
  197. }
  198.  
  199. /*------------------------------*
  200.  * エスケープシーケンスの利用例 *
  201.  *------------------------------*
  202.  */
  203. void DisplayAttr(void)
  204. {
  205.     int x, y, color;
  206.     char szAttr[80];
  207.  
  208.     Fputs("\x1b[2J", (LPVOID)-1);
  209.     Fputs("\x1b[46m", (LPVOID)-1);
  210.     Fputs("\x1b[25;1H", (LPVOID)-1);
  211.     Fputs("Press Enter to stop", (LPVOID)-1);
  212.  
  213.     x = 0; y = 0; color = 0;
  214.     while (LOWORD(Inkey()) != VK_RETURN) {
  215.         wsprintf(szAttr, "\x1b[%dm", color+41);
  216.         Fputs(szAttr, (LPVOID)-1);
  217.         wsprintf(szAttr, "\x1b[%d;%dH", y+1, x+1);
  218.         Fputs(szAttr, (LPVOID)-1);
  219.         Fputs("ComWin Ver. 3.80", (LPVOID)-1);
  220.         x++; x = (x + 41) % 41;
  221.         y++; y = (y + 20) % 20;
  222.         if (y == 0) {
  223.             color++; color = (color + 7) % 7;
  224.         }
  225.     }
  226.     Fputs("\x1b[m", (LPSTR)-1);
  227.     Fputs("\x1b[25;1H", (LPSTR)-1);
  228.     Fputs("\n", (LPSTR)-1);
  229. }
  230.  
  231. /*--------------------------------------*
  232.  * ComWin の応用例 (グラフィックを描く) *
  233.  *--------------------------------------*
  234.  */
  235. void DisplayGraph(void)
  236. {
  237.     HWND hwnd;
  238.     HDC  hdc;
  239.     HPEN hPen, hPenOld;
  240.     HBRUSH hBrush, hBrushOld;
  241.     RECT rect;
  242.     short cx;
  243.     char szDummy[80];
  244.  
  245.     Fputs("", NULL);   /* おまじない (改行コードをフラッシュする) */
  246.  
  247.     hwnd = (HWND)GetComWinLong(CW_GETHWND, 0);
  248.  
  249.     GetClientRect(hwnd, &rect);
  250.     hdc = GetDC(hwnd);
  251.  
  252.     hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
  253.     hPenOld = SelectObject(hdc, hPen); 
  254.  
  255.     hBrush = CreateSolidBrush(RGB(0, 0, 0));
  256.     hBrushOld = SelectObject(hdc, hBrush);
  257.  
  258.     Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
  259.  
  260.     SelectObject(hdc, hPenOld);
  261.     DeleteObject(hPen);
  262.     SelectObject(hdc, hBrushOld);
  263.     DeleteObject(hBrush);
  264.  
  265.     hPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
  266.     hPenOld = SelectObject(hdc, hPen);
  267.  
  268.     for (cx = 0; cx < rect.right - rect.left; cx += 10) {
  269.         MoveToEx(hdc, rect.left + cx, rect.top, NULL);
  270.         LineTo(hdc, rect.right - cx, rect.bottom);
  271.     }
  272.  
  273.     SelectObject(hdc, hPenOld);
  274.     DeleteObject(hPen);
  275.  
  276.     ReleaseDC(hwnd, hdc);
  277.     Fgets(szDummy, 80, NULL);
  278. }
  279.  
  280. /*------------------*
  281.  * Pause (一時停止) *
  282.  *------------------*
  283.  */
  284.  
  285. void Pause(void)
  286. {
  287.     char szBuffer[80];
  288.  
  289.     Fputs("continue ? <Y/N>", (LPSTR)-1);
  290.     if (Fgets(szBuffer, sizeof(szBuffer), NULL) == NULL) {
  291.         exit(0);
  292.     }
  293.     switch (szBuffer[0]) {
  294.         case 'N': case 'n':
  295.             exit(0);
  296.     }
  297. }
  298.