1989年開業 情報工学部門 文部科学省登録番号 第22082号 公益社団法人日本技術士会会員 東大阪商工会議所会員

≫サンプルプログラム一覧 

オープンソース/C言語サンプルプログラム 画面時計(GUI編)

●小さなウィンドウを開き、時刻を数字で表示する画面時計です。
●システムの時刻を取得し、時刻が変わったら文字列に変換し
 画面に描画します。
 ≫ソースファイルのダウンロード: tokei01-2win.c

【問題】
●文字の色やフォント、サイズを変えてみよう。
●main関数の中の文、Sleep(990); の値を変更すると、プログラムの
 動作にどのような影響が出るか考察しなさい。
 ※実際にタスクマネージャを起動し、プロセスの様子を確認しよう。
 ※注意:あまり小さい値にすると、CPUに負荷がかかります。
●閉じるボタンを押してから閉じるまでに、約1秒かかるのはなぜか。

/**************/
/*  画面時計  */
/*     GUI版  */
/**************/
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <windows.h>

HWND  hWnd=NULL;                                    // ウィンドウのハンドル
MSG   msg;                                          // ウィンドウ メッセージ
int   endFG=0;                                      // 終了フラグ

void  SETwindow(void);                              // ウィンドウ初期設定
void  byouga(unsigned long);                        // 時計描画
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);  // ウィンドウプロシージャ

void  main( )
{
    unsigned long t,tO=0;
    int  ir;

    SETwindow( );                                   // ウィンドウ初期設定

    tO=time(NULL);                                  // 現在の時刻(秒)
    byouga(tO);                                     // 時計描画

    while( endFG==0 )
      {
        t=time(NULL);                               // 現在の時刻(秒)

        if ( t!=tO )
          {
            byouga(t); tO=t;                        // 時計描画
            Sleep(990);
          }

        ir=PeekMessage(&msg,hWnd,0,0,PM_REMOVE);    // windowsメッセージ取得
        if ( ir==0 ) continue;                      // メッセージなし
        TranslateMessage(&msg);                     // メッセージ変換
        DispatchMessage (&msg);                     // メッセージ送出
        if ( endFG!=0 ) break;
      }

    DestroyWindow(hWnd);                            // ウィンドウ破棄
}


void  SETwindow( )
/*----------------------*/
/*  ウィンドウ初期設定  */
/*----------------------*/
{
  WNDCLASS wc;        // ウィンドウ クラス
  DWORD    Wstyle;    // ウィンドウ・スタイル

    //--ウィンドウクラス設定--
    wc.lpszClassName="画面時計";                    // ウィンドウ・クラス名
    wc.lpszMenuName =NULL;                          // クラス・メニュー・リソース名
    wc.hInstance    =GetModuleHandle(NULL);         // インスタンス・ハンドル
    wc.lpfnWndProc  =WndProc;                       // ウィンドウ・プロシージャ関数名
    wc.hCursor      =LoadCursor(NULL,IDC_ARROW);    // クラス・カーソル
    wc.hIcon        =NULL;                          // クラス・アイコン
    wc.hbrBackground=GetStockObject(BLACK_BRUSH);   // クラス背景ブラシ
    wc.style        =CS_OWNDC|                      // クラス・スタイル
                     CS_BYTEALIGNCLIENT|
                     CS_BYTEALIGNWINDOW;
    wc.cbClsExtra   =0;                             // 補足クラス・メモリ
    wc.cbWndExtra   =0;                             // 補足ウィンドウ・メモリ

    //--ウィンドウ・スタイル設定--
    Wstyle= WS_OVERLAPPED|                          // 自動表示位置
            WS_SYSMENU|                             // 閉じる可能
            WS_MINIMIZEBOX;                         // 最小化可

    RegisterClass(&wc);                             // ウィンドウ・クラス登録

    //--ウィンドウ生成--
    hWnd=CreateWindow(wc.lpszClassName,             // クラス名
                      wc.lpszClassName,             // ウィンドウ名(実行ファイル)
                      Wstyle,                       // ウィンドウ・スタイル
                      0,                            // ウインドウ水平位置
                      0,                            // ウインドウ垂直位置
                      300,                          // ウィンドウXサイズ(枠含)
                      100,                          // ウィンドウYサイズ(枠含)
                      NULL,                         // 親ウィンドウ・ハンドル
                      NULL,                         // メニューハンドル
                      wc.hInstance,                 // アプリケーション・インスタンス・ハンドル
                      NULL);                        // ウィンドウ作成データ

    ShowWindow(hWnd,SW_SHOWDEFAULT);                // ウィンドウ表示状態設定
}

void  byouga(
/*------------*/
/*  時計描画  */
/*------------*/
unsigned long t)
{
    HDC  hdc;                                       // デバイスコンテキストハンドル
    HFONT  hfont;                                   // 論理フォントハンドル
    char  c[128];

    //--表示--
    hdc=GetDC(hWnd);                                // ウィンドウのDC取得

    SetBkMode(hdc,OPAQUE);                          // 文字の背景=不透明
    SetTextColor(hdc,RGB(255,128,  0));             // テキスト色設定
    SetBkColor  (hdc,RGB(  0,  0,  0));             // 背景色=黒

    //--フォント--
    hfont=CreateFont(                               // フォント・オブジェクト生成
            32,                                     // フォントの論理高
            28,                                     // 文字の論理幅
            0,                                      // テキスト行の角度
            0,                                      // ベースラインとx軸の角度
            FW_THIN,                                // フォント太さ(標準)
            FALSE,                                  // イタリック体フラグ
            0,                                      // アンダーラインフラグ
            FALSE,                                  // バーチカルラインフラグ
            SHIFTJIS_CHARSET,                       // 文字セット識別子
            OUT_TT_PRECIS,                          // 出力精度
            CLIP_TT_ALWAYS,                         // クリッピング精度
            PROOF_QUALITY,                          // 出力品質
            FIXED_PITCH|FF_MODERN,                  // ピッチ
            "MS ゴシック");                       // タイプフェイス名
//          "MS 明朝");                           // タイプフェイス名
    SelectObject(hdc,hfont);                        // フォント設定

    sprintf(c,"%.8s",ctime(&t)+11);                 // 時分秒(8文字)
    TextOut(hdc,30,20,c,strlen(c));                 // 文字列描画

    DeleteObject(hfont);                            // フォントオブジェクト削除
    ReleaseDC(hWnd,hdc);                            // ウィンドウのDC解放
}


LRESULT CALLBACK  WndProc(
/*--------------------------*/
/*  ウィンドウプロシージャ  */
/*--------------------------*/
HWND    hwnd,      // ウィンドウ・ハンドル
UINT    uMsg,      // メッセージID
WPARAM  wParam,    // 第1メッセージ・パラメータ(無符号)
LPARAM  lParam)    // 第2メッセージ・パラメータ(有符号)
{
  PAINTSTRUCT hpaint;                               // 描画情報
  BOOL        ir=0;

    switch( uMsg )
      {
        case WM_CLOSE://--ウィンドウ閉--
                PostQuitMessage(0);                 // 実行終了
                endFG=1;
                break;

        case WM_PAINT://--ウィンドウ更新--
        case WM_SETFOCUS://--フォーカス取得--
                break;

        default://--その他--
                ir=DefWindowProc(hwnd,uMsg,wParam,lParam);
      }

    return(ir);
}
   

©著作者からのお願い

●プログラムの著作者、著作権者は佐伯英子です。
●このページで公開するプログラムは、複製、改変、無償再配布できます。
●再配布に当たっては、必ず著作者名を明記し、ソースも公開してください。
●改変後に再配布される場合も、原著作者を明記していただき、ソースも公開してください。
●これらのプログラムを使って、有償サービスをしていただいてもかまいません。
●これらのプログラムは、改変されたものも含めて、無断で有償再配布しないでください。
●これらは、再再配布以降にも引き継がれます。

         【ご利用例】
●ブログやホームページ、印刷物に掲載していただいてもかまいません。(出典明記)
●学校の授業や実習、会社の研修、有料の講座などでお使いいただけます。(出典明記)
無断で販売しないでください。
----------------------------------------
●お問合せはどうぞこちらから
----------------------------------------
■著作権法全文(e-Govウェブサイト)■
法令全般



佐伯英子技術士事務所 〒542-0073 大阪市中央区日本橋 1-14-13 サンオフィス日本橋601  E-mail: yfb22332@nifty.com