トップページ > 記事閲覧
私は困った。カレンダーを使用したスケジュール保存プログラムを作成したい
名前:LuvDxLib 日時: 2023/11/15 20:03

以下のコードはカレンダーを作成して出力するコードです(誰かのコードメモ) カレンダーで各日付をクリックすると to-do listを出力し、やるべきことを入力してチェックできるカレンダープラン?作りたい 現在のコードは、キーボードで日付を選択できる状態です。マウスクリックで可能であればいいのですが、キーボードで選ぶ方法も悪くないと思います。 DxLibでは難しいことがわかりますが、Cに戻るライブラリがこれだけだと思います。 プログラムはVisual StudioのC ++を使用しましたが、Cコードで書かれています((C言語を使用する予定です) DxLibは最強だと思います よろしくお願いします #include <stdio.h> #include "DxLib.h" int Zeller(DATEDATA& dd) { return (dd.Year + dd.Year / 4 - dd.Year / 100 + dd.Year / 400 + (13 * dd.Mon + 8) / 5 + 1) % 7; } int DaysInMonth(DATEDATA& dd) { if (dd.Mon == 2) return dd.Year % 4 == 0 ? 29 : 28; else return (dd.Mon <= 7 && dd.Mon % 2 == 1 || dd.Mon >= 8 && dd.Mon % 2 == 0) ? 31 : 30; } // カレンダーを表示する関数 void DrawCalendar(DATEDATA& currentDate, int selectedDay) { // YYYY年MM月とタイトルバーに表示 char windowTitle[64]; sprintf_s(windowTitle, "%4d年%02d月", currentDate.Year, currentDate.Mon); SetMainWindowText(windowTitle); const char* dayOfWeek[] = { "日", "月", "火", "水", "木", "金", "土" }; // 曜日を表示 for (int i = 0; i < 7; ++i) { DrawFormatString( 10 + i * 30, 48, 0xFFFFFF, dayOfWeek[i] ); } DrawFormatString(62, 20, 0xFFFFFF, "%4d年 %02d月", currentDate.Year, currentDate.Mon); DrawFormatString(25, 20, 0xFFFFFF, "←"); DrawFormatString(170, 20, 0xFFFFFF, "→"); // セルを埋めるための空白の計算 int startOffset = Zeller(currentDate); int xOffset = 30; // 各セルの横サイズ int yOffset = 20; // 各セルの縦サイズ int last = DaysInMonth(currentDate); // カレンダー表示 for (int seq = startOffset, day = 1; day <= last; seq++, day++) { // 日曜日は赤、土曜日は青、その他は白 unsigned int textColor = seq % 7 == 0 ? 0xFF0000 : (seq % 7 == 6 ? 0x0000FF : 0xFFFFFF); DrawFormatString( 10 + (seq % 7) * xOffset, 70 + (seq / 7) * yOffset, textColor, "%2d", day ); // ボックス表示 if (day == selectedDay) { DrawBox( 10 + (seq % 7) * xOffset - 2, 70 + (seq / 7) * yOffset - 2, 10 + (seq % 7) * xOffset + 30 + 2, 70 + (seq / 7) * yOffset + 20 + 2, 0xFF0000, FALSE ); } } } // 前の月に移動する関数 void MoveToPreviousMonth(DATEDATA& currentDate) { currentDate.Mon--; if (currentDate.Mon < 1) { currentDate.Mon = 12; currentDate.Year--; } } // 次の月に移動する関数 void MoveToNextMonth(DATEDATA& currentDate) { currentDate.Mon++; if (currentDate.Mon > 12) { currentDate.Mon = 1; currentDate.Year++; } } // 前の週に移動する関数 void MoveToPreviousWeek(DATEDATA& currentDate, int& selectedDay) { selectedDay -= 7; // 1週間前 (上) if (selectedDay < 1) { // 1未満なら移動キャンセル selectedDay = selectedDay + 7; } } // 次の週に移動する関数 void MoveToNextWeek(DATEDATA& currentDate, int& selectedDay) { selectedDay += 7; // 1週間後 (下) if (selectedDay > DaysInMonth(currentDate)) { // 月の日数を超えたら移動キャンセル selectedDay = selectedDay - 7; } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { SetMainWindowText("カレンダー"); ChangeWindowMode(TRUE); SetGraphMode(320, 240, 16); SetOutApplicationLogValidFlag(false); if (DxLib_Init() == -1) return -1; SetDrawScreen(DX_SCREEN_BACK); DATEDATA currentDate; GetDateTime(&currentDate); int selectedDay = currentDate.Day; // 選択された日付 int leftKeyPrevState = 0; int rightKeyPrevState = 0; int upKeyPrevState = 0; int downKeyPrevState = 0; while (ProcessMessage() == 0) { ClearDrawScreen(); DrawCalendar(currentDate, selectedDay); ScreenFlip(); // ← キーを押すと前の月に移動 int leftKeyState = CheckHitKey(KEY_INPUT_LEFT); if (leftKeyState == 1 && !leftKeyPrevState) { // キー入力状態確認 selectedDay--; // 1日前に移動 if (selectedDay < 1) { // 1日未満の場合 MoveToPreviousMonth(currentDate); // 前の月に移動 selectedDay = DaysInMonth(currentDate); // 前の月の最終日に設定 } } leftKeyPrevState = leftKeyState; // → キーを押すと次の月に移動 int rightKeyState = CheckHitKey(KEY_INPUT_RIGHT); if (rightKeyState == 1 && !rightKeyPrevState) { // キー入力状態確認 selectedDay++; // 1日後に移動 if (selectedDay > DaysInMonth(currentDate)) { // 月の最終日を超えたら MoveToNextMonth(currentDate); // 次の月に移動 selectedDay = 1; // 次の月の初日に設定 } } rightKeyPrevState = rightKeyState; // ↑ キーを押すとボックスを上に移動 int upKeyState = CheckHitKey(KEY_INPUT_UP); // キー入力確認 if (upKeyState == 1 && !upKeyPrevState) { MoveToPreviousWeek(currentDate, selectedDay); // 上に移動する関数を実行 } upKeyPrevState = upKeyState; // ↓ キーを押すとボックスを下に移動 int downKeyState = CheckHitKey(KEY_INPUT_DOWN); // キー入力確認 if (downKeyState == 1 && !downKeyPrevState) { MoveToNextWeek(currentDate, selectedDay); // 下に移動する関数を実行 } downKeyPrevState = downKeyState; if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) { break; } } DxLib_End(); return 0; } 能力者を探す
メンテ

Page: 1 |

Re: 私は困った。カレンダーを使用したスケジュール保存プログラムを作成したい ( No.1 )
名前:管理人 日時:2023/11/15 20:08

すみません、プログラム作成の丸投げ依頼にはお応えできません
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存