サンプルコードコーナー
ここでは、本サイトのレベル(初心者)を超えるようなものでリクエストの非常に多いものなどを載せるコーナーです。(具体的な解説は行いません)
※ここに置かれているサンプルコードを、ご自由に使用しても構いません。本サンプルコードを使用して不都合が生じても、管理者は責任を負いかねます。各自責任の持てる範囲でご使用ください。


[01](エクスプローラの左側のような)ディレクトリ構造ツリー表示
概要
本サンプルコードは、海外VisualC++サイトcodeguruに書かれていたサンプルを、参考・応用して作成したコードです。通常のSDIアプリを作成し、以下の二つのクラスを新規に追加しています。
CDirTreeCtrlクラス:(CTreeCtrlの派生クラス) ディレクトリツリーのインプリメンテーション
CSortStrArrayクラス:(CStringArrayの派生クラス)文字列配列クラスのインプリメンテーション
なお、codeguruからのサンプルではドイツ語でのコメントがありましたが、日本語でコメントを打ち直しています。なお簡単なところなどはコメントを省略しています。おそらくMDSNがないと理解が不能です(笑)

ビュークラスのメンバにCDirTreeCtrlクラスの変数を追加し、ビュー内部でCreateを呼び、そこでツリーを表示させています。詳しくはコードを見てください。
実行例
ダウンロード
Explorer.lzh (LHA形式:57,344 bytes)
[02]動いている全プロセス情報を取得したい(簡易プロセスビューワー)
概要
ウィンドウズプログラミングを進めていくとかならずプロセスに関するプログラミングに触れることがある。ここではWindowsAPIを用いて全プロセス情報を取得するコードを紹介する。
コーディング
(ShowProcessという関数名は特に意味がない)
void ShowProcess()
{
  HANDLE hSnapShot;
      // スナップショット
  PROCESSENTRY32 pEntry;
  // プロセスエントリ
  FILE *fp; // ファイルポインタ

  hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); // システムのスナップショットを取得
  pEntry.dwSize =sizeof(pEntry); // プロセスントリの前処理(Process32Firstを呼ぶために必要)
 
  // 最初のプロセスの取得(Process32Nextを呼ぶために必要)
  Process32First (hSnapShot,&pEntry);

  // ファイルオープン(プロセス情報記録用)
  fp = fopen("proc.dat","w");

  while(1)
  {
    BOOL hRes = Process32Next (hSnapShot,&pEntry); // プロセスの取得

    // プロセスが取得できなかったらLoopを抜ける
    if(hRes == FALSE) break;

    // プロセス情報の書き込み
    fprintf(fp,"[Exec] = %s\n",pEntry.szExeFile);                  // Exeファイル名
    fprintf(fp,"[ProcessID] = %d\n",pEntry.th32ProcessID);           // プロセスID
    fprintf(fp,"[Thread] = %d\n",pEntry.cntThreads);               // スレッド
    fprintf(fp,"[ParentProcessID] = %d\n",pEntry.th32ParentProcessID);  // 親プロセスID
    fprintf(fp,"[Priority] = %d\n",pEntry.pcPriClassBase);            // 優先度
    fprintf(fp,"\n");
  }
  fclose(fp);
}



実行例(MFC版)
FIG2.GIF - 18,985BYTES
ダウンロード
ProcessViewer for MFC
ProcessViewer for WindowsAPI

[03]カラーボタンを作りたい
概要
ダイアログクラスでOnCtlColorを追加することで、ダイアログやエディットボックスなどのコントロールに色をつけることができる。ダイアログ、エディットボックス、スタティックなどは比較的簡単に背景色をつけることができるが、ボタンの場合はオーナー描画で背景色を設定するために、キャプションやフォーカス状況が表示されず、背景色一色で塗りつぶされてしまう、かっこ悪いボタンになってしまう。そこでダイアログクラスのOnCtlColorを試用しないで、ボタンの色を変更するクラスライブラリ(自作)を紹介する。
クラスライブラリ
CColorButtonクラス:カラーボタンを実装するためのクラスライブラリ(自作)です。CButtonクラスから派生しているので、CButtonクラスのメンバは使用可能です。
準備
1.colorbtn.h/colorbtn.cppの2つのファイルをプロジェクトに追加する(追加されるとclassviewにCColorButtonが表示される)
2.使用するファイルでcolorbtn.hをインクルードする

使用方法
(1)インスタンス生成
CColorButtonを使用するクラス内でインスタンスを生成(変数を定義)します。一般的にはヘッダにメンバとして記述するのが普通です。特にダイアログであれば、ダイアログクラスのヘッダにメンバ変数として定義します。
(2)アタッチ
カラーをつけたいボタンは通常CButtonクラスの変数であるため、CColorButtonとして利用するためには関連付けが必要となります。これをサブクラス化というのですが、AutoLoadという関数で実現します。AutoLoad関数の引数には、コントロールIDと親ウィンドウが必要ですが、通常ダイアログの中のボタンに適用する場合には、親ウィンドウにはthisを与えればよいです。
(3)カラー設定(任意)
キャプションの色(通常時と無効時)と背景色の色を設定します。設定しなくてもディフォルトで色をつけていますが、ディフォルト色は通常のボタンと変わらないので、各自設定してください。
注意
ボタンはオーナー描画ボタンでなくてはなりません。
実行例
FIG3.GIF - 3,692BYTES
ダウンロード
CColorButtonクラスライブラリ(使用解説書付き)
実行例ソース

Back to index