home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1996 February / VPR9602A.ISO / fwindows / comwp260 / samples / sample1.c < prev    next >
C/C++ Source or Header  |  1995-10-09  |  7KB  |  277 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.  * 情報関数の引数は現在 (0, 0) しか定義されていません。  *
  91.  * 戻り値の上位バイトに16進数バージョン番号が返されます。*
  92.  *-------------------------------------------------------*
  93.  */
  94. void DisplayVersion(void)
  95. {
  96.     long lVer;
  97.     char szBuf[80];
  98.  
  99.     Puts("comwin.dll のバージョン番号を取得します。");
  100.  
  101.     lVer = GetComWinLong(CW_GETVER, 0);
  102.     wsprintf(szBuf, "ComWin version number = %04X", HIWORD(lVer));
  103.     Puts(szBuf);
  104. }
  105.  
  106. /*--------------------------*
  107.  * コンソールの諸属性を得る *
  108.  *--------------------------*
  109.  */
  110. void DisplayConsoleInfo(void)
  111. {
  112.     CW_S_CONSOLE_INFO ci;
  113.     char szBuf[0x100];
  114.  
  115.     memset(&ci, 0, sizeof(ci));
  116.     ci.lMessage = CW_M_CONSOLE_INFO;
  117.     ci.lSize = sizeof(ci);
  118.     ci.lMode = CW_MODE_GET;
  119.     GetComWinLong(CW_GETMSG, (LONG)(LPLONG)&ci);
  120.  
  121.     wsprintf(szBuf, "サポート標準入出力関数の数 = %d\n", ci.lFuncMax);
  122.     Fputs(szBuf, NULL);
  123.     wsprintf(szBuf, "コンソール最大入力文字数   = %d\n", ci.lBufMax);
  124.     Fputs(szBuf, NULL);
  125.     wsprintf(szBuf, "コンソールのハンドル       = %08lX\n", ci.hwnd);
  126.     Fputs(szBuf, NULL);
  127.     wsprintf(szBuf, "コンソールの桁行 = (%ld,%ld)\n", ci.lColumns,ci.lLines);
  128.     Fputs(szBuf, NULL);
  129.     wsprintf(szBuf, "コンソールの横縦 = (%ld,%ld)\n", ci.lWidth,ci.lHeight);
  130.     Fputs(szBuf, NULL);
  131. }
  132.  
  133. /*-------------------------------------------------------*
  134.  * 入出力関数(Fputs, gets)の使用例                       *
  135.  *-------------------------------------------------------*
  136.  */
  137. void DisplaySum(void)
  138. {
  139.     int i;
  140.     int n;
  141.     int sum;
  142.     char szBuf[80];
  143.  
  144.     Puts("入出力関数(Fputs, gets)の使用例");
  145.     Puts("1からNまでの合計を求めます。");
  146.     Fputs("N=", NULL);
  147.     Fgets(szBuf, 80, NULL);
  148.     n = atoi(szBuf);
  149.     for (i = 1, sum = 0; i <= n; i++) {
  150.         sum += i;
  151.         wsprintf(szBuf, "i = %d, sum = %d", i, sum);
  152.         Puts(szBuf);
  153.     }
  154. }
  155.  
  156. /*----------------------------------------------*
  157.  * 環境変数操作関数(cwPutenv, cwGetenv)の使用例 *
  158.  *----------------------------------------------*
  159.  */
  160. void DisplayEnv(void)
  161. {
  162.     LPSTR lpEnv;
  163.  
  164.     cwPutenv("sample=sample1.c");
  165.     lpEnv = cwGetenv("sample");
  166.     if (lpEnv != NULL) {
  167.         Puts(lpEnv);
  168.     }
  169.     lpEnv = (LPSTR)GetComWinLong(CW_GETENV, 0);
  170.     if (lpEnv != NULL) {
  171.         for (; *lpEnv != '\0'; lpEnv += lstrlen(lpEnv) + 1) {
  172.             Puts(lpEnv);
  173.         }
  174.     }
  175.     cwPutenv("sample=");
  176. }
  177.  
  178. /*------------------------------*
  179.  * エスケープシーケンスの利用例 *
  180.  *------------------------------*
  181.  */
  182. void DisplayAttr(void)
  183. {
  184.     int x, y, color;
  185.     char szAttr[80];
  186.  
  187.     Fputs("\x1b[2J", NULL);
  188.     Fputs("\x1b[46m", NULL);
  189.     Fputs("\x1b[25;1H", NULL);
  190.     Fputs("Press Enter to stop", NULL);
  191.  
  192.     x = 0; y = 0; color = 0;
  193.     while (LOWORD(Inkey()) != VK_RETURN) {
  194.         wsprintf(szAttr, "\x1b[%dm", color+41);
  195.         Fputs(szAttr, NULL);
  196.         wsprintf(szAttr, "\x1b[%d;%dH", y+1, x+1);
  197.         Fputs(szAttr, NULL);
  198.         Fputs("ComWin Ver. 2.60", NULL);
  199.         x++; x = (x + 41) % 41;
  200.         y++; y = (y + 20) % 20;
  201.         if (y == 0) {
  202.             color++; color = (color + 7) % 7;
  203.         }
  204.     }
  205.     Fputs("\x1b[m", NULL);
  206.     Fputs("\x1b[25;1H", NULL);
  207.     Fputs("\n", NULL);
  208. }
  209.  
  210. /*--------------------------------------*
  211.  * ComWin の応用例 (グラフィックを描く) *
  212.  *--------------------------------------*
  213.  */
  214. void DisplayGraph(void)
  215. {
  216.     HWND hwnd;
  217.     HDC  hdc;
  218.     HPEN hPen, hPenOld;
  219.     HBRUSH hBrush, hBrushOld;
  220.     RECT rect;
  221.     short cx;
  222.     char szDummy[80];
  223.  
  224.     Fputs("", NULL);   /* おまじない (改行コードをフラッシュする) */
  225.  
  226.     hwnd = (HWND)GetComWinLong(CW_GETHWND, 0);
  227.  
  228.     GetClientRect(hwnd, &rect);
  229.     hdc = GetDC(hwnd);
  230.  
  231.     hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
  232.     hPenOld = SelectObject(hdc, hPen); 
  233.  
  234.     hBrush = CreateSolidBrush(RGB(0, 0, 0));
  235.     hBrushOld = SelectObject(hdc, hBrush);
  236.  
  237.     Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
  238.  
  239.     SelectObject(hdc, hPenOld);
  240.     DeleteObject(hPen);
  241.     SelectObject(hdc, hBrushOld);
  242.     DeleteObject(hBrush);
  243.  
  244.     hPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
  245.     hPenOld = SelectObject(hdc, hPen);
  246.  
  247.     for (cx = 0; cx < rect.right - rect.left; cx += 10) {
  248.         MoveToEx(hdc, rect.left + cx, rect.top, NULL);
  249.         LineTo(hdc, rect.right - cx, rect.bottom);
  250.     }
  251.  
  252.     SelectObject(hdc, hPenOld);
  253.     DeleteObject(hPen);
  254.  
  255.     ReleaseDC(hwnd, hdc);
  256.     Fgets(szDummy, 80, NULL);
  257. }
  258.  
  259. /*------------------*
  260.  * Pause (一時停止) *
  261.  *------------------*
  262.  */
  263.  
  264. void Pause(void)
  265. {
  266.     char szBuffer[80];
  267.  
  268.     Fputs("continue ? <Y/N>", (LPSTR)-1);
  269.     if (Fgets(szBuffer, sizeof(szBuffer), NULL) == NULL) {
  270.         exit(0);
  271.     }
  272.     switch (szBuffer[0]) {
  273.         case 'N': case 'n':
  274.             exit(0);
  275.     }
  276. }
  277.