Last active
January 30, 2023 08:29
-
-
Save Myoga1012/5bdaf22c6c4fcfb228bb to your computer and use it in GitHub Desktop.
C++(Win32フォームアプリ(Win32 API))でカレンダーを出力するソースコードです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 名前 : Myoga Screw-bright (旧名:Myoga S. Tomonaka) | |
// Twitter : https://twitter.com/Myoga1012 | |
#include <windows.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <tchar.h> | |
#define MAX_LOADSTRING 100 | |
TCHAR szTitle[MAX_LOADSTRING] = _T( "Calendar" ); // タイトル バーのテキスト | |
TCHAR szWindowClass[MAX_LOADSTRING] = _T( "Calendar" ); // メイン ウィンドウ クラス名 | |
// ウィンドウクラスの作成と初期化 | |
int InitWindow( HINSTANCE, int ); | |
#define WC_INIT_COMPLETED 0 | |
#define WC_INIT_FAILED -1 | |
// ウィンドウ プロシージャ関数 | |
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); | |
// カレンダー用 | |
struct Cal { int First, Last; }; | |
Cal GetCal(); | |
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { | |
// ウィンドウの初期化を行います。 | |
if( InitWindow( hInstance, nCmdShow ) ) { | |
MessageBox( NULL, _T( "初期化に失敗したためアプリを終了します。" ), szTitle, MB_ICONEXCLAMATION | MB_OK ); | |
return 1; | |
} | |
// メインのループです。 | |
MSG msg; | |
while( GetMessage( &msg, NULL, 0, 0 ) ) { | |
TranslateMessage( &msg ); | |
DispatchMessage( &msg ); | |
} | |
return 0; | |
} | |
// ウィンドウクラスの作成と初期化 | |
int InitWindow( HINSTANCE hInstance, int nCmdShow ) { | |
// ウィンドウクラスを作成し、設定します。 | |
WNDCLASSEX wcex; | |
wcex.cbSize = sizeof( WNDCLASSEX ); | |
wcex.style = CS_HREDRAW | CS_VREDRAW; | |
wcex.lpfnWndProc = WndProc; | |
wcex.cbClsExtra = 0; | |
wcex.cbWndExtra = 0; | |
wcex.hInstance = hInstance; | |
wcex.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_APPLICATION ) ); | |
wcex.hCursor = LoadCursor( NULL, IDC_ARROW ); | |
wcex.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH ); | |
wcex.lpszMenuName = NULL; | |
wcex.lpszClassName = szWindowClass; | |
wcex.hIconSm = LoadIcon( wcex.hInstance, MAKEINTRESOURCE( IDI_APPLICATION ) ); | |
// ウインドウクラスを登録します。 | |
RegisterClassEx( &wcex ); | |
// ウィンドウを作成します。 | |
HWND hWnd = CreateWindow( szWindowClass, szTitle, | |
WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_DLGFRAME | WS_MINIMIZEBOX, | |
CW_USEDEFAULT, 0, 320, 240, NULL, NULL, hInstance, NULL ); | |
if( !hWnd ) | |
return WC_INIT_FAILED; | |
// ウインドウを表示します。 | |
ShowWindow( hWnd, nCmdShow ); | |
UpdateWindow( hWnd ); | |
return WC_INIT_COMPLETED; | |
} | |
// ウィンドウ プロシージャ関数 | |
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { | |
PAINTSTRUCT ps; | |
HDC hdc; | |
// 以下はカレンダー出力用オブジェクトです。 | |
tagRECT rect = { 0, 0, 0, 0 }; | |
Cal cal = GetCal(); | |
const int XArea = 40, YArea = 30, XOFF = 2, YOFF = 10; | |
TCHAR days[64] = { _T( '\0' ) }; | |
switch( message ) { | |
case WM_PAINT: | |
hdc = BeginPaint( hWnd, &ps ); | |
// カレンダーを出力します。 | |
SetBkMode( hdc, TRANSPARENT ); | |
for( int seq = cal.First, day = 1; day <= cal.Last; seq++, day++ ) { | |
rect.left = ( seq % 7 ) * XArea + XOFF, rect.top = ( seq / 7 ) * YArea + YOFF; | |
rect.right = ( seq % 7 + 1 ) * XArea + XOFF, rect.bottom = ( seq / 7 + 1 ) * YArea + YOFF; | |
wsprintf( days, _T( "%2d" ), day ); | |
SetTextColor( hdc, seq % 7 == 0 ? RGB( 0xFF, 0, 0xFF ) : ( seq % 7 == 6 ? RGB( 0, 0xCC, 0xFF ) : RGB( 0xFF, 0xFF, 0xFF ) ) ); | |
DrawText( hdc, days, -1, &rect, DT_RIGHT ); | |
} | |
EndPaint( hWnd, &ps ); | |
break; | |
case WM_DESTROY: | |
PostQuitMessage( 0 ); | |
break; | |
default: | |
return DefWindowProc( hWnd, message, wParam, lParam ); | |
break; | |
} | |
return 0; | |
} | |
// 現在の日時から当月1日の曜日と当月末日を求めます。 | |
Cal GetCal() { | |
SYSTEMTIME now; | |
GetLocalTime( &now ); | |
Cal cal; | |
cal.First = ( ( 7 - ( now.wDay % 7 + 6 - now.wDayOfWeek ) % 7 ) % 7 ); | |
if( now.wMonth == 2 ) | |
cal.Last = now.wYear % 4 == 0 ? 29 : 28; | |
else | |
cal.Last = ( now.wMonth <= 7 && now.wMonth % 2 == 1 || now.wMonth >= 8 && now.wMonth % 2 == 0 ) ? 31 : 30; | |
return cal; | |
} | |
// Calendar.cpp ( フォームアプリ ( Win32 API ) ) | |
// Copyright (c) 2014 Myoga-TN.net All Rights Reserved. | |
// This software is released under the MIT License. | |
// http://opensource.org/licenses/mit-license.php |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment