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 >
Wrap
C/C++ Source or Header
|
1997-08-25
|
8KB
|
298 lines
/*----------------------*
* ComWin の API 使用例 *
*----------------------*
*/
#include <windows.h>
#include <stdlib.h>
#include "comwin.h"
#define SIZE 80
#define BUFSIZE 80
/*----------*
* 内部関数 *
*----------*
*/
void DisplayArgument(HINSTANCE hInstance, LPSTR lpszCmdParam);
void DisplayVersion(void);
void DisplayConsoleInfo(void);
void DisplaySum(void);
void DisplayEnv(void);
void DisplayAttr(void);
void DisplayGraph(void);
void Pause(void);
/*------------*
* メイン関数 *
*------------*
*/
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow)
{
DisplayArgument(hInstance, lpszCmdParam);
Pause();
DisplayVersion();
Pause();
DisplayConsoleInfo();
Pause();
DisplaySum();
Pause();
DisplayEnv();
Pause();
DisplayAttr();
Pause();
DisplayGraph();
return 0;
}
/*------------------------------------------------*
* コマンドラインの文字列を argc, argv 形式にする *
* MakeArgument の使用例 *
*------------------------------------------------*
*/
void DisplayArgument(HINSTANCE hInstance, LPSTR lpszCmdParam)
{
int argc;
int nArgv[SIZE];
char *argv[SIZE];
char szReturn[SIZE*2];
char szBuffer[BUFSIZE];
char *psz;
int i;
argc = MakeArgument(hInstance, "sample1", lpszCmdParam,
nArgv, szReturn, sizeof(szReturn));
wsprintf(szBuffer, "パラメーターの数は%d個です。", argc - 1);
Puts(szBuffer);
if (argc <= 1) {
Puts("パラメーターを指定してください。");
}
Puts("出力方法1");
for (psz = szReturn; *psz != '\0'; psz += lstrlen(psz) + 1) {
Puts(psz);
}
Puts("出力方法2");
for (i = 0; i < argc; i++) {
argv[i] = szReturn + nArgv[i];
}
for (i = 0; i < argc; i++) {
Puts(argv[i]);
}
}
/*-------------------------------------------------------*
* 情報 API の使用例 comwin.dll のバージョンを得る。 *
* 戻り値の上位バイトに16進数バージョン番号が返されます。*
*-------------------------------------------------------*
*/
void DisplayVersion(void)
{
long lVer;
char szBuf[80];
Puts("comwin.dll のバージョン番号を取得します。");
lVer = GetComWinLong(CW_GETVER, 0);
wsprintf(szBuf, "ComWin version number = %04X", HIWORD(lVer));
Puts(szBuf);
}
/*--------------------------*
* コンソールの諸属性を得る *
*--------------------------*
*/
void DisplayConsoleInfo(void)
{
CW_S_CONSOLE_INFO ci;
CW_S_ISATTY ia;
char szBuf[0x100];
static char szConsole[] = "コンソール";
static char szFile[] = "ファイル";
memset(&ci, 0, sizeof(ci));
ci.lMessage = CW_M_CONSOLE_INFO;
ci.lSize = sizeof(ci);
ci.lMode = CW_MODE_GET;
GetComWinLong(CW_GETMSG, (LONG)(LPLONG)&ci);
wsprintf(szBuf, "サポート標準入出力関数の数 = %d\n", ci.lFuncMax);
Fputs(szBuf, NULL);
wsprintf(szBuf, "コンソール最大入力文字数 = %d\n", ci.lBufMax);
Fputs(szBuf, NULL);
wsprintf(szBuf, "コンソールのハンドル = %08lX\n", ci.hwnd);
Fputs(szBuf, NULL);
wsprintf(szBuf, "コンソールの桁行 = (%ld,%ld)\n", ci.lColumns,ci.lLines);
Fputs(szBuf, NULL);
wsprintf(szBuf, "コンソールの横縦 = (%ld,%ld)\n", ci.lWidth,ci.lHeight);
Fputs(szBuf, NULL);
memset(&ia, 0, sizeof(ia));
ia.lMessage = CW_M_ISATTY;
ia.lSize = sizeof(ia);
ia.lMode = CW_MODE_GET;
GetComWinLong(CW_GETMSG, (LONG)(LPLONG)&ia);
wsprintf(szBuf, "標準入力は%sです。\n",
(ia.lStdIn == TRUE) ? (LPSTR)szConsole : (LPSTR)szFile);
Fputs(szBuf, NULL);
wsprintf(szBuf, "標準出力は%sです。\n",
(ia.lStdOut == TRUE) ? (LPSTR)szConsole : (LPSTR)szFile);
Fputs(szBuf, NULL);
wsprintf(szBuf, "標準エラー入力は%sです。\n",
(ia.lStdErrIn == TRUE) ? (LPSTR)szConsole : (LPSTR)szFile);
Fputs(szBuf, NULL);
wsprintf(szBuf, "標準エラー出力は%sです。\n",
(ia.lStdErrOut == TRUE) ? (LPSTR)szConsole : (LPSTR)szFile);
Fputs(szBuf, NULL);
}
/*-------------------------------------------------------*
* 入出力関数(Fputs, gets)の使用例 *
*-------------------------------------------------------*
*/
void DisplaySum(void)
{
int i;
int n;
int sum;
char szBuf[80];
Puts("入出力関数(Fputs, gets)の使用例");
Puts("1からNまでの合計を求めます。");
Fputs("N=", NULL);
Fgets(szBuf, 80, NULL);
n = atoi(szBuf);
for (i = 1, sum = 0; i <= n; i++) {
sum += i;
wsprintf(szBuf, "i = %d, sum = %d", i, sum);
Puts(szBuf);
}
}
/*----------------------------------------------*
* 環境変数操作関数(cwPutenv, cwGetenv)の使用例 *
*----------------------------------------------*
*/
void DisplayEnv(void)
{
LPSTR lpEnv;
cwPutenv("sample=sample1.c");
lpEnv = cwGetenv("sample");
if (lpEnv != NULL) {
Puts(lpEnv);
}
lpEnv = (LPSTR)GetComWinLong(CW_GETENV, 0);
if (lpEnv != NULL) {
for (; *lpEnv != '\0'; lpEnv += lstrlen(lpEnv) + 1) {
Puts(lpEnv);
}
}
cwPutenv("sample=");
}
/*------------------------------*
* エスケープシーケンスの利用例 *
*------------------------------*
*/
void DisplayAttr(void)
{
int x, y, color;
char szAttr[80];
Fputs("\x1b[2J", (LPVOID)-1);
Fputs("\x1b[46m", (LPVOID)-1);
Fputs("\x1b[25;1H", (LPVOID)-1);
Fputs("Press Enter to stop", (LPVOID)-1);
x = 0; y = 0; color = 0;
while (LOWORD(Inkey()) != VK_RETURN) {
wsprintf(szAttr, "\x1b[%dm", color+41);
Fputs(szAttr, (LPVOID)-1);
wsprintf(szAttr, "\x1b[%d;%dH", y+1, x+1);
Fputs(szAttr, (LPVOID)-1);
Fputs("ComWin Ver. 3.80", (LPVOID)-1);
x++; x = (x + 41) % 41;
y++; y = (y + 20) % 20;
if (y == 0) {
color++; color = (color + 7) % 7;
}
}
Fputs("\x1b[m", (LPSTR)-1);
Fputs("\x1b[25;1H", (LPSTR)-1);
Fputs("\n", (LPSTR)-1);
}
/*--------------------------------------*
* ComWin の応用例 (グラフィックを描く) *
*--------------------------------------*
*/
void DisplayGraph(void)
{
HWND hwnd;
HDC hdc;
HPEN hPen, hPenOld;
HBRUSH hBrush, hBrushOld;
RECT rect;
short cx;
char szDummy[80];
Fputs("", NULL); /* おまじない (改行コードをフラッシュする) */
hwnd = (HWND)GetComWinLong(CW_GETHWND, 0);
GetClientRect(hwnd, &rect);
hdc = GetDC(hwnd);
hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
hPenOld = SelectObject(hdc, hPen);
hBrush = CreateSolidBrush(RGB(0, 0, 0));
hBrushOld = SelectObject(hdc, hBrush);
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
SelectObject(hdc, hPenOld);
DeleteObject(hPen);
SelectObject(hdc, hBrushOld);
DeleteObject(hBrush);
hPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
hPenOld = SelectObject(hdc, hPen);
for (cx = 0; cx < rect.right - rect.left; cx += 10) {
MoveToEx(hdc, rect.left + cx, rect.top, NULL);
LineTo(hdc, rect.right - cx, rect.bottom);
}
SelectObject(hdc, hPenOld);
DeleteObject(hPen);
ReleaseDC(hwnd, hdc);
Fgets(szDummy, 80, NULL);
}
/*------------------*
* Pause (一時停止) *
*------------------*
*/
void Pause(void)
{
char szBuffer[80];
Fputs("continue ? <Y/N>", (LPSTR)-1);
if (Fgets(szBuffer, sizeof(szBuffer), NULL) == NULL) {
exit(0);
}
switch (szBuffer[0]) {
case 'N': case 'n':
exit(0);
}
}