タイマーに設定画面を付けたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ノダッシー

タイマーに設定画面を付けたい

#1

投稿記事 by ノダッシー » 10年前

前回作ったタイマーに
画像
画像のような設定(?)コンポーネント(?)を取り付けて
音をならす時刻・アラーム音・表示されるメッセージの変更、フォントの変更を可能にしたいと思いますが
DXライブラリで作る事は可能でしょうか?
開発の手掛かりになるような事でもありましたら教えて下さい

今考えているのはWinwosフォームアプリケーションで作成したタイマーを設定するプログラムをテキストファイルに出力して
タイマーのプログラムでテキストファイルの設定を読み込んで表示するのかなぁと考えているのですが、どうでしょうか

ノダッシー

Re: タイマーに設定画面を付けたい

#2

投稿記事 by ノダッシー » 10年前

失礼しました
前回のURLとタイマーのソースです
http://dixq.net/forum/viewtopic.php?f=3&t=15762

コード:

#pragma warning(disable : 4819)
#include "DxLib.h"
 
// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    //int SetAlwaysRunFlag(TRUE);//ウインドウが非アクティブの状態でも処理し続ける
    //int StartTime; //起動時の時間を格納する変数
    //int hour, minute, second; //表示する時間
    //int set_hour = 0, set_minute = 0, set_second = 0; //セットする時間
    int minute;
 
    SetOutApplicationLogValidFlag(FALSE); //ログ出力をするか否か
    ChangeWindowMode(TRUE); // ウインドウモードかフルスクリーンか
    SetGraphMode(640, 480, 16); //画面サイズを設定します
 
    if (DxLib_Init() == -1) // DXライブラリ初期化処理
    {
        return -1; // エラーが起きたら直ちに終了
    }
 
    SetBackgroundColor(0xFF, 0xFF, 0xFF); //背景の色を設定します
 
    int moziNoIro = GetColor(0, 0, 0);
    int keikaZikanNoIro = GetColor(217, 150, 148);
    int nokoriZikanNoIro = GetColor(0, 176, 80);
    int geeziNoKyoukaiSenNoIro = GetColor(56, 93, 138);
    int migiNoSenNoIro = GetColor(106 ,106, 106);
    int hidariNoSenNoIro = GetColor(63, 93, 141);
 
    DATEDATA Date;
 
    int A = 640; //最大の値
    int B = 0; //最小の値
    int C = 0;//???
    int D = 0; //カウントダウン
    int E = 0; //表示用
    int X1 = 0;
    int X2 = 640;
    int Y1 = 50;
    //int Y2 = 50;
    int g_Lagefont = CreateFontToHandle("メイリオ", 50, -1, DX_FONTTYPE_ANTIALIASING);
    int jikann;
    int gogo;
    //int Handle;//背景画像描画用
    //int Handle_wav;
 
    //bool SiteiSitaZikanNiNariKoukaonWoNarasita = false;
    int maeNiOtoWoNarasitaZikantai = -1;
    bool saisyoNoFureemuDeAru = true;
 
    //Handle_wav = LoadSoundMem("test.wav"); // サウンド/up.wavをロードし、識別番号をHandleに格納
 
    //StartTime = GetNowCount(); //起動時の時間を取得
 
    while (1){
        if (ProcessMessage() == -1)break; //ウインドウのメッセージを処理する
        GetDateTime(&Date);
 
        /*
        second = (GetNowCount() - StartTime) / 1000; //秒に変換
 
        minute = second / 60; //分に変換
        second %= 60;
 
        hour = minute / 6; //時間に変換
        minute %= 6;
        */
 
        /*
        // テスト用
        // 時刻を60倍の速さで進ませる
        Date.Hour = Date.Min % 24;
        Date.Min = Date.Sec;
        Date.Sec= 0;
        //*/
 
        SetDrawScreen(DX_SCREEN_BACK); //描画する画面を設定します
        ClearDrawScreen(); //画面に描画されている内容を消します
 
 
 
 
        //時間に合わせてメッセージが変わる
        const char* messages[18] = {
            "",
            " ",
            " ",
            " ",
            " ",
            " ", // 5
            " ",
            " ",
            "おはようございます",
            "おはようございます",
            "今日も一日頑張りましょう!", // 10
            "もうすぐお昼休みだ!",
            "休憩時間です!",
            "午後も頑張りましょう",
            "こんにちは",
            "こんにちは", // 15
            "もうすぐで終わりです",
            "お疲れ様でした"
        };
        // 基準時刻
        int kizyunZikoku[12][2] = {
            { 9,  0}, { 9, 55},
            {10,  0}, {10, 55},
            {11,  0}, {12,  0},
            {12, 40}, {13, 40},
            {13, 45}, {14, 50},
            {14, 55}, {16,  0}
        };
        // その基準時刻と次の基準時刻の間でゲージを動かすか
        bool zikanWoHyouziSuru[12] = {
            true, true,
            true, true,
            true, false,
            false, true,
            true, true,
            true, false
        };
 
        // 今の時刻がどこに該当するかを計算する
        int imaNoZikoku = 60 * (60 * Date.Hour + Date.Min) + Date.Sec;
        int maeNoKizyunZikoku = 0;
        int tugiNoKizyunZikoku = 0;
        int imaNoZikantai = -1;
        for (int i = 0; i < 12; i++) {
            int miteiruKizyunZikoku = 60 * (60 * kizyunZikoku[i][0] + kizyunZikoku[i][1]);
            if (imaNoZikoku < miteiruKizyunZikoku) {
                if (i > 0) {
                    imaNoZikantai = i - 1;
                    maeNoKizyunZikoku = 60 * (60 * kizyunZikoku[i - 1][0] + kizyunZikoku[i - 1][1]);
                    tugiNoKizyunZikoku = 60 * (60 * kizyunZikoku[i][0] + kizyunZikoku[i][1]);
                }
                break;
            }
        }
        if (saisyoNoFureemuDeAru) {
            maeNiOtoWoNarasitaZikantai = imaNoZikantai;
            saisyoNoFureemuDeAru = false;
        }
 
        // 経過時間と残り時間を計算し、ゲージのパラメータを設定する
        if(imaNoZikantai >= 0 && zikanWoHyouziSuru[imaNoZikantai]) {
            // 表示する時間
            minute = (imaNoZikoku - maeNoKizyunZikoku) / 60;
            E = (tugiNoKizyunZikoku - maeNoKizyunZikoku) / 60;
            D = (tugiNoKizyunZikoku - imaNoZikoku) / 60;
            // ゲージのパラメータ
            A = tugiNoKizyunZikoku;
            B = maeNoKizyunZikoku;
            C = imaNoZikoku;
        } else {
            // 表示する時間
            minute = 99;
            E = 99;
            D = 99;
            // ゲージのパラメータ
            A = 640;
            B = 0;
            C = 0;
        }
 
        // 午前と午後を分ける
        if (Date.Hour >= 13){
            jikann = Date.Hour - 12;
            gogo = 1;
        }
        else{
            jikann = Date.Hour;
            gogo = 0;
        }
 
        //壁紙
        //Handle = LoadGraph("sora.jpg"); // 画像をロード
        //DrawGraph(0, 0, Handle, TRUE); // データハンドルを使って画像を描画
 
        DrawFormatStringToHandle(40, 180, keikaZikanNoIro, g_Lagefont, "経過時間"); //説明
        DrawFormatStringToHandle(350, 180, nokoriZikanNoIro, g_Lagefont, "残り時間"); //説明
        DrawFormatStringToHandle(70, 250, keikaZikanNoIro, g_Lagefont, "%d分", minute); //経過時間を描画します
        DrawFormatStringToHandle(230, 250, moziNoIro, g_Lagefont, "/%d分/", E); //全体の時間を描画します
        DrawFormatStringToHandle(450, 250, nokoriZikanNoIro, g_Lagefont, "%d分", D); //残り時間
 
        /*
        bool OtoWoNarasuBeki = false;
        if (Date.Hour == 9 && Date.Min == 0){
            //9時の時に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 9 && Date.Min == 55){
            //9時55分に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 10 && Date.Min == 55){
            //10時55に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 11 && Date.Min == 0){
            //11時に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 12 && Date.Min == 0){
            //12時に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 12 && Date.Min == 40){
            //12時40に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 13 && Date.Min == 40){
            //13時40に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 13 && Date.Min == 45){
            //13時45分に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 14 && Date.Min == 50){
            //14時50に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 14 && Date.Min == 55){
            //14時55分に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 14 && Date.Min == 55){
            //14時55に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        if (Date.Hour == 16 && Date.Min == 0){
            //16時に音を鳴らす
            //PlaySoundMem(Handle, DX_PLAYTYPE_BACK);
            OtoWoNarasuBeki = true;
        }
        */
        if (maeNiOtoWoNarasitaZikantai != imaNoZikantai) {
            maeNiOtoWoNarasitaZikantai = imaNoZikantai;
        //if (imaNoZikoku == maeNoKizyunZikoku) {
            //if (!SiteiSitaZikanNiNariKoukaonWoNarasita) {
                //SiteiSitaZikanNiNariKoukaonWoNarasita = true;
            PlaySoundFile("test.wav", DX_PLAYTYPE_BACK);
            //}
        }
        //else {
        //  SiteiSitaZikanNiNariKoukaonWoNarasita = false;
        //}
 
        DrawFormatStringToHandle(150, 400, moziNoIro, g_Lagefont, "%s%d時%d分", gogo ? "午後" : "午前", jikann, Date.Min);
        /*
        if (gogo = 0){
            DrawFormatStringToHandle(150, 400, GetColor(255, 255, 255), g_Lagefont, "午前%d時%d分", jikann, Date.Min);
        }
        else{
            DrawFormatStringToHandle(150, 400, GetColor(255, 255, 255), g_Lagefont, "午後%d時%d分", jikann, Date.Min);
        }
        */
 
        if (1 <= Date.Hour && Date.Hour <= 17) {
            DrawFormatStringToHandle(0, 0, moziNoIro, g_Lagefont, messages[Date.Hour], D); //メッセージを表示
        }
        //ゲージの描画
        DrawBox(0, 50, 640, 150, nokoriZikanNoIro, TRUE);
        int geeziNoKawarime = X1 + (X2 - X1)*(C - B) / (A - B);
        //C = A - (hour * 360 + minute * 60 + second);
        //if (C < B) C = B;
        //      0   50  0    640    0       0    640  0
        DrawBox(X1, Y1, geeziNoKawarime, 150, keikaZikanNoIro, TRUE);
        DrawLine(0, Y1    , X2, Y1    , geeziNoKyoukaiSenNoIro);
        DrawLine(0, Y1 - 1, X2, Y1 - 1, geeziNoKyoukaiSenNoIro);
        DrawLine(0, Y1 + 1, X2, Y1 + 1, geeziNoKyoukaiSenNoIro);
        DrawLine(0, 150    , X2, 150    , geeziNoKyoukaiSenNoIro);
        DrawLine(0, 150 - 1, X2, 150 - 1, geeziNoKyoukaiSenNoIro);
        DrawLine(0, 150 + 1, X2, 150 + 1, geeziNoKyoukaiSenNoIro);
        DrawLine(geeziNoKawarime    , Y1, geeziNoKawarime    , 150, geeziNoKyoukaiSenNoIro);
        DrawLine(geeziNoKawarime - 1, Y1, geeziNoKawarime - 1, 150, geeziNoKyoukaiSenNoIro);
        DrawLine(geeziNoKawarime + 1, Y1, geeziNoKawarime + 1, 150, geeziNoKyoukaiSenNoIro);
        DrawLine(0    , Y1, 0    , 150, hidariNoSenNoIro);
        DrawLine(0 + 1, Y1, 0 + 1, 150, hidariNoSenNoIro);
        DrawLine(0 + 2, Y1, 0 + 2, 150, hidariNoSenNoIro);
 
        // 画面右の線の描画
        DrawLine(640 - 3, 0, 640 - 3, 480, migiNoSenNoIro);
        DrawLine(640 - 2, 0, 640 - 2, 480, migiNoSenNoIro);
        DrawLine(640 - 1, 0, 640 - 1, 480, migiNoSenNoIro);
 
        //Dに残り時間[分]を設定
        //D = C / 60;
        ScreenFlip(); //DX_SCREEN_BACKに描画した画像を表示します
 
 
    }
 
    DxLib_End(); // DXライブラリ使用の終了処理
 
    return 0; // ソフトの終了 
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: タイマーに設定画面を付けたい

#3

投稿記事 by みけCAT » 10年前

ノダッシー さんが書きました:前回作ったタイマーに
画像
画像のような設定(?)コンポーネント(?)を取り付けて
音をならす時刻・アラーム音・表示されるメッセージの変更、フォントの変更を可能にしたいと思いますが
DXライブラリで作る事は可能でしょうか?
可能だと思います。
ノダッシー さんが書きました:開発の手掛かりになるような事でもありましたら教えて下さい
欲しい見た目のUIを自分で描画します。
GetOpenFileName関数(Windows API)やKeyInputString関数(DXライブラリ)などが使えるかもしれません。
ノダッシー さんが書きました:今考えているのはWinwosフォームアプリケーションで作成したタイマーを設定するプログラムをテキストファイルに出力して
タイマーのプログラムでテキストファイルの設定を読み込んで表示するのかなぁと考えているのですが、どうでしょうか
Winwosフォームアプリケーションではなく、Windowsフォームアプリケーションなら妥当だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
lbfuvab
記事: 72
登録日時: 14年前

Re: タイマーに設定画面を付けたい

#4

投稿記事 by lbfuvab » 10年前

データ形式はINIとか割と便利ですよ。
保存しておくデータ構造としては
<ヘッダ部分>
・データ数
<本文部分>
(1)音をならす時刻
(2)アラーム音(リソースにwaveを仕込んでプリセットからの選択orファイル名)
(3)表示されるメッセージ
(4)使用するフォント名
をを1セクションとしてデータ数分
とかで良さげですね。

ノダッシー

Re: タイマーに設定画面を付けたい

#5

投稿記事 by ノダッシー » 10年前

レスありがとうございます

>>みけCATさん
Windows APIをググってみましたが、自分の今のレベルじゃ理解できそうにないのでWindowsフォームアプリケーション(VB.NET)で作りたいと思います

>>lbfuvabさん
iniファイルを調べてみました
管理しやすそうなのですが、構造がよくわからないのでテキストファイルを出力してタイマーに読み込ませる所から始めようと思います

閉鎖

“C言語何でも質問掲示板” へ戻る