|
■ 参考書 |
|
|
|
| ■ 開発ツール | |
|
|
| ■ 学習項目 | |
|
C言語の基礎知識
C言語の基本
データ型と変数、数値処理
配列処理
データの入力
|
条件判断と繰り返し
文字列処理関数
関数
ファイル処理
プログラムを書いてみよう
ステップアップのために
|
| ■ コメント | |
|
|
| ■ サンプル | |
|
この講座でのプログラムはこの程度の極めて簡単なものです。
#include <stdio.h> int func(int x,int y); main(){ int a,b,c; printf("べき乗を計算するプログラム\n\n"); printf("数?\n\n"); scanf("%d",&a); printf("何乗?\n\n"); scanf("%d",&b); for(i=0;i<=b;i++){ c=func(a,i); printf("%dの%d乗-->%d\n",a,i,c); } int func(int x,int y){ int i,ans=1; for(i=1;i<=y;i++){ ans=ans*x; } return ans; }
|
|
|
■ 参考書 |
|
|
|
| ■ 開発ツール | |
|
|
| ■ 学習項目 | |
|
|
| ■ コメント | |
|
|
|
■ 参考書 |
|
|
|
| ■ 開発ツール | |
|
|
| ■ 学習項目 | |
書式の慣例
ストリームI/O
演算とデータ型
標準出力
変数
標準入力
選択文if
高度な選択文
反復文
関数
引数
スコープ
配列
|
ポインタ
ポインタと配列
文字列
クラス
アクセス制御
コンストラクタ デストラクタ
継承
多態性
動的変数
動的オブジェクト
演算子の多重定義
|
| ■ コメント | |
|
|
|
■ 参考書 |
|
|
|
| ■ 開発ツール | |
|
|
| ■ 学習項目 | |
|
|
| ■ コメント | |
|
|
|
■ 参考書 |
|
|
|
| ■ 開発ツール | |
|
|
| ■ 学習項目 | |
API
メッセージ
文字列とグラフィックス
キー入力
|
マウス入力
リソース
コントロールとダイアログボックス
AppWizard
|
| ■ コメント | |
|
|
| ■ サンプル | |
|
#include <windows.h>
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
最小のプログラムがこれです。 |
|
|
■ 参考書 |
|
|
|
| ■ 開発ツール | |
|
|
| ■ 学習項目 | |
マルチタスク
|
インターネット
|
| ■ コメント | |
| Win32 SDK, MFC を用いてプログラムを作成します。 | |
|
■ 参考書 |
|
|
|
| ■ 開発ツール | |
|
|
| ■ 学習項目 | |
新Visual C++6.0入門 スーパービギナー編
|
新Visual C++6.0入門 シニア編
|
| ■ コメント | |
|
|
| ■ サンプル |
//グローバルで宣言
#include <string.h>
#include <stdio.h>
#define MAX 50000
char str[255];
DWORD Tid1, Tid2;
HANDLE hThread1,hThread2;
//HANDLE Handle to an object.
DWORD WINAPI MyThread1(LPVOID param)
{
int i;
HDC hdc;
for(i=0; i<MAX; i++) {
sprintf(str, "Thread 1: loop # %5d ", i);
hdc = GetDC((HWND) param);
TextOut(hdc, 1, 1, str, strlen(str));
ReleaseDC((HWND) param, hdc);
}
return 0;
}
DWORD WINAPI MyThread2(LPVOID param)
{
int i;
HDC hdc;
for(i=0; i<MAX; i++) {
sprintf(str, "Thread 2: loop # %5d ", i);
hdc = GetDC((HWND) param);
TextOut(hdc, 1, 20, str, strlen(str));
ReleaseDC((HWND) param, hdc);
}
return 0;
}
//////////////////////////////////////////////////////////////
case WM_LBUTTONDOWN:
hThread1=CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)MyThread1,
(LPVOID) hWnd, 0, &Tid1);
hThread2=CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)MyThread2,
(LPVOID) hWnd, 0, &Tid2);
break;
/*
Return Values
If the function succeeds, the return value is a handle to the new thread.
If the function fails, the return value is NULL. */
case WM_RBUTTONDOWN:
SetThreadPriority(hThread1,THREAD_PRIORITY_HIGHEST);
SetThreadPriority(hThread1,THREAD_PRIORITY_LOWEST);
break;
/*
SetThreadPriority
The SetThreadPriority function sets the priority value for
the specified thread.
This value, together with the priority class of the thread's process,
determines the thread's base priority level.
BOOL SetThreadPriority( HANDLE hThread, // handle to the thread int nPriority // thread priority level );*/ |
| ■ サンプル |
//グローバルで宣言
#include <string.h>
#include <stdio.h>
#define MAX 50000
char str[255];
DWORD Tid1, Tid2;
//DWORD 32-bit unsigned integer.
DWORD WINAPI MyThread1(LPVOID param)
{
//LPVOID 型指定のない 32 ビット ポインタ
int i;
HDC hdc;
for(i=0; i<MAX; i++) {
sprintf(str, "Thread 1: loop # %5d ", i);
hdc = GetDC((HWND) param);
TextOut(hdc, 1, 1, str, strlen(str));
ReleaseDC((HWND) param, hdc);
}
return 0;
}
DWORD WINAPI MyThread2(LPVOID param)
{
int i;
HDC hdc;
for(i=0; i<MAX; i++) {
sprintf(str, "Thread 2: loop # %5d ", i);
hdc = GetDC((HWND) param);
TextOut(hdc, 1, 20, str, strlen(str));
ReleaseDC((HWND) param, hdc);
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////////
case WM_LBUTTONDOWN:
CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)MyThread1,
(LPVOID) hWnd, 0, &Tid1);
CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)MyThread2,
(LPVOID) hWnd, 0, &Tid2);
break;
/*
CreateThread
スレッドを作成します。スレッドは、呼び出し側プロセスのアドレス空間で実行されます。
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
// pointer to thread security attributes
DWORD dwStackSize, // initial thread stack size, in bytes
LPTHREAD_START_ROUTINE lpStartAddress,
// pointer to thread function
LPVOID lpParameter, // argument for new thread
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId // pointer to returned thread identifier
);
LPDWORD Pointer to a DWORD */
|
| ■ サンプル |
// THREAD.C /* マルチスレッドの使用例 */ #include <windows.h> #include <string.h> #include <stdio.h> #define MAX 100000 LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM); DWORD WINAPI MyThread1(LPVOID param); DWORD WINAPI MyThread2(LPVOID param); char szWinName[] = "MyWin"; /* ウィンドウクラスの名前 */ char str[255]; /* 出力文字列を保持する */ DWORD Tid1, Tid2; /* スレッドのID */
HANDLE hThread1,hThread2;
HANDLE hEvent;
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
LPSTR lpszArgs, int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wcl;
HACCEL hAccel;
/* ウィンドウクラスを定義する */ wcl.cbSize = sizeof(WNDCLASSEX); wcl.hInstance = hThisInst; /* このインスタンスのハンドル */ wcl.lpszClassName = szWinName; /* ウィンドウクラスの名前 */ wcl.lpfnWndProc = WindowFunc; /* ウィンドウ関数 */ wcl.style = 0; /* デフォルトのスタイル */ wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* 標準アイコン */ wcl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* 小さいアイコン */ wcl.hCursor = LoadCursor(NULL, IDC_ARROW); /* カーソルのスタイル */ wcl.lpszMenuName = NULL; /* メインメニュー */ wcl.cbClsExtra = 0; /* その他の情報は必要ない */ wcl.cbWndExtra = 0; /* その他の情報は必要ない */ /* ウィンドウの背景を白にする */ wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); /* ウィンドウクラスを登録する */ if(!RegisterClassEx(&wcl)) return 0; /* ウィンドウクラスを登録したので、ウィンドウを作成できる */
hwnd = CreateWindow(
szWinName, /* ウィンドウクラスの名前 */
"Demonstrate Threads", /* タイトル */
WS_OVERLAPPEDWINDOW, /* ウィンドウスタイル - 標準 */
CW_USEDEFAULT, /* X座標 - Windowsに決めさせる */
CW_USEDEFAULT, /* Y座標 - Windowsに決めさせる */
CW_USEDEFAULT, /* 幅 - Windowsに決めさせる */
CW_USEDEFAULT, /* 高さ - Windowsに決めさせる */
HWND_DESKTOP, /* 親ウィンドウはない */
NULL, /* ウィンドウクラスメニューを上書きしない */
hThisInst, /* プログラムのこのインスタンスのハンドル */
NULL /* このほかの引数は必要ない */
);
/* ウィンドウを表示する */ ShowWindow(hwnd, nWinMode); UpdateWindow(hwnd); /* メッセージループを作成する */
while(GetMessage(&msg, NULL, 0, 0))
{
if(!TranslateAccelerator(hwnd, hAccel, &msg)) {
TranslateMessage(&msg); /* キーボードメッセージを変換する */
DispatchMessage(&msg); /* Windows 98に制御を返す */
}
}
return msg.wParam;
}
/* この関数はWindows 98によって呼び出され、
メッセージ待ち行列からメッセージを受け取る
*/
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message) {
case WM_CREATE:
hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
break;
case WM_LBUTTONDOWN: /* プログラムを終了する */
hThread1=CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)MyThread1,
(LPVOID) hwnd, 0, &Tid1);
hThread2=CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)MyThread2,
(LPVOID) hwnd, 0, &Tid2);
break;
case WM_DESTROY: /* プログラムを終了する */
PostQuitMessage(0);
break;
default:
/* 上記のswitchステートメントで指定していない
メッセージは、Windows 98に処理させる */
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
/* プロセス内の1つのスレッド */
DWORD WINAPI MyThread1(LPVOID param)
{
int i;
HDC hdc;
/* アクセスが許可されるのを待つ */
if(WaitForSingleObject(hEvent, 10000)==WAIT_TIMEOUT) {
MessageBox((HWND)param, "Time Out Thread 1",
"Event Error", MB_OK);
return 0;
}
for(i=0; i<MAX; i++) {
sprintf(str, "Thread 1: loop # %5d ", i);
hdc = GetDC((HWND) param);
TextOut(hdc, 1, 1, str, strlen(str));
ReleaseDC((HWND) param, hdc);
}
return 0; } /* プロセス内のもう1つのスレッド */
DWORD WINAPI MyThread2(LPVOID param)
{
int i;
HDC hdc;
for(i=0; i<MAX; i++) {
sprintf(str, "Thread 2: loop # %5d ", i);
hdc = GetDC((HWND) param);
TextOut(hdc, 1, 20, str, strlen(str));
ReleaseDC((HWND) param, hdc);
}
SetEvent(hEvent);
return 0;
}
|
| ■ サンプル |
case WM_LBUTTONDOWN:
HKEY hRegKey;
unsigned long result;
RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\watabe\\Calc",0,
"Calculator1",0,KEY_ALL_ACCESS,NULL,&hRegKey,&result);
/*
RegCreateKeyEx
The RegCreateKeyEx function creates the specified key.
If the key already exists in the registry, the function opens it.
LONG RegCreateKeyEx(
HKEY hKey, // handle to an open key
LPCTSTR lpSubKey, // address of subkey name
DWORD Reserved, // reserved
LPTSTR lpClass, // address of class string
DWORD dwOptions, // special options flag
REGSAM samDesired, // desired security access
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
// address of key security structure
PHKEY phkResult, // address of buffer for opened handle
LPDWORD lpdwDisposition // address of disposition value buffer
);
lpClass Pointer to a null-terminated string that specifies the class (object type) of this key. This parameter is ignored if the key already exists. この値は作成するキーに対してだけ使われるもので、好みの文字を使用できる。 lpdwDisposition
DWORD 型の変数へのポインタを指定します。この変数に、
次に示す処理結果が格納されます。
REG_CREATED_NEW_KEY キーが存在しなかったため、新しく作成されました。
REG_OPENED_EXISTING_KEY キーが存在しており、オープンされました。
*/
//キーが作成された場合
if(result==REG_CREATED_NEW_KEY){
long value=123;
RegSetValueEx(hRegKey,"reged value",0,REG_DWORD,(LPBYTE)&value,
sizeof(DWORD));
/*
RegSetValueEx
The RegSetValueEx function sets the data and
type of a specified value under a registry key.
LONG RegSetValueEx(
HKEY hKey, // handle to key to set value for
LPCTSTR lpValueName, // name of the value to set
DWORD Reserved, // reserved
DWORD dwType, // flag for value type
CONST BYTE *lpData, // address of value data
DWORD cbData // size of value data
);*/
}
//キーがすでに存在していた場合
else{
unsigned long datatype,datasize;
datasize=sizeof(DWORD);
long value;
RegQueryValueEx(hRegKey,"reged value",NULL,&datatype,
(LPBYTE)&value,&datasize);
/*
RegQueryValueEx
The RegQueryValueEx function retrieves the type and data for
a specified value name associated with an open registry key.
LONG RegQueryValueEx(
HKEY hKey, // handle to key to query
LPTSTR lpValueName, // address of name of value to query
LPDWORD lpReserved, // reserved
LPDWORD lpType, // address of buffer for value type
LPBYTE lpData, // address of data buffer
LPDWORD lpcbData // address of data buffer size
);
lpType DWORD 型の変数へのポインタを指定します。 この変数に「値のデータ」の種類が格納されます。 次の値のいずれかが格納されます。 REG_DWORD 32 ビット値です。 REG_SZ NULL で終わる文字列です。 REG_BINARY 任意の形式のバイナリデータです。 lpcbData lpData パラメータで指定したバッファのサイズが入った DWORD 型の変数への ポインタを指定します。関数が制御を返すと、この変数に、 lpData バッファにコピーされたデータのサイズが格納されます。 バッファが小さすぎるときは、必要なバイト数が格納され、関数は ERROR_MORE_DATA を返します。*/ char str[80]; wsprintf(str,"%d",value); MessageBox(hWnd,str,"",MB_OK); } break;
|