Created
April 21, 2025 07:09
-
-
Save bg1bgst333/33290a876223a98e906d1bebe2d2ed2a to your computer and use it in GitHub Desktop.
GetTextExtentPoint32
This file contains hidden or 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
// ヘッダファイルのインクルード | |
#include <windows.h> // 標準WindowsAPI | |
#include <tchar.h> // TCHAR型 | |
#include <string.h> // C文字列処理 | |
#include <cstdio> // C標準入出力 | |
// 関数のプロトタイプ宣言 | |
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // ウィンドウメッセージに対して独自の処理をするように定義したコールバンク関数WindowProc. | |
// _tWinMain関数の定義 | |
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd){ | |
// 変数の宣言 | |
HWND hWnd; // CreateWindowで作成したウィンドウのウィンドウハンドルを格納するHWND型変数hWnd. | |
MSG msg; // ウィンドウメッセージ情報を格納するMSG構造体型変数msg. | |
WNDCLASS wc; // ウィンドウクラス情報をもつWNDCLASS構造体型変数wc. | |
// ウィンドウクラスの設定 | |
wc.lpszClassName = _T("GetTextExtentPoint32"); // ウィンドウクラス名は"GetTextExtentPoint32". | |
wc.style = CS_HREDRAW | CS_VREDRAW; // スタイルはCS_HREDRAW | CS_VREDRAW. | |
wc.lpfnWndProc = WindowProc; // ウィンドウプロシージャは独自の処理を定義したWindowProc. | |
wc.hInstance = hInstance; // インスタンスハンドルは_tWinMainの引数. | |
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // アイコンはアプリケーション既定のもの. | |
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソルは矢印. | |
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景は白ブラシ. | |
wc.lpszMenuName = NULL; // メニューはなし. | |
wc.cbClsExtra = 0; // 0でいい. | |
wc.cbWndExtra = 0; // 0でいい. | |
// ウィンドウクラスの登録 | |
if (!RegisterClass(&wc)){ // RegisterClassでウィンドウクラスを登録し, 0が返ったらエラー. | |
// エラー処理 | |
MessageBox(NULL, _T("RegisterClass failed!"), _T("GetTextExtentPoint32"), MB_OK | MB_ICONHAND); // MessageBoxで"RegisterClass failed!"とエラーメッセージを表示. | |
return -1; // 異常終了(1) | |
} | |
// ウィンドウの作成 | |
hWnd = CreateWindow(_T("GetTextExtentPoint32"), _T("GetTextExtentPoint32"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // CreateWindowで, 上で登録した"GetTextExtentPoint32"ウィンドウクラスのウィンドウを作成. | |
if (hWnd == NULL){ // ウィンドウの作成に失敗したとき. | |
// エラー処理 | |
MessageBox(NULL, _T("CreateWindow failed!"), _T("GetTextExtentPoint32"), MB_OK | MB_ICONHAND); // MessageBoxで"CreateWindow failed!"とエラーメッセージを表示. | |
return -2; // 異常終了(2) | |
} | |
// ウィンドウの表示 | |
ShowWindow(hWnd, SW_SHOW); // ShowWindowでSW_SHOWを指定してウィンドウの表示. | |
// メッセージループ | |
while (GetMessage(&msg, NULL, 0, 0) > 0){ // GetMessageでメッセージを取得, 戻り値が0より大きい間はループし続ける. | |
// ウィンドウメッセージの送出 | |
TranslateMessage(&msg); // TranslateMessageで仮想キーメッセージを文字メッセージへ変換. | |
DispatchMessage(&msg); // DispatchMessageで受け取ったメッセージをウィンドウプロシージャ(この場合は独自に定義したWindowProc)に送出. | |
} | |
// プログラムの終了 | |
return (int)msg.wParam; // 終了コード(msg.wParam)を戻り値として返す. | |
} | |
// WindowProc関数の定義 | |
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ // ウィンドウメッセージに対して独自の処理をするように定義したウィンドウプロシージャ. | |
// ウィンドウメッセージに対する処理. | |
switch (uMsg){ // switch-casa文でuMsgの値ごとに処理を振り分ける. | |
// ウィンドウの作成が開始された時. | |
case WM_CREATE: // ウィンドウの作成が開始された時.(uMsgがWM_CREATEの時.) | |
// WM_CREATEブロック | |
{ | |
// ウィンドウ作成成功 | |
return 0; // return文で0を返して, ウィンドウ作成成功とする. | |
} | |
// 既定の処理へ向かう. | |
break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう. | |
// ウィンドウが破棄された時. | |
case WM_DESTROY: // ウィンドウが破棄された時.(uMsgがWM_DESTROYの時.) | |
// WM_DESTROYブロック | |
{ | |
// 終了メッセージの送信. | |
PostQuitMessage(0); // PostQuitMessageで終了コードを0としてWM_QUITメッセージを送信.(するとメッセージループのGetMessageの戻り値が0になるので, メッセージループから抜ける.) | |
} | |
// 既定の処理へ向かう. | |
break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう. | |
// 画面の描画を要求された時. | |
case WM_PAINT: // 画面の描画を要求された時.(uMsgがWM_PAINTの時.) | |
// WM_PAINTブロック | |
{ | |
// このブロックのローカル変数の宣言 | |
HDC hDC; // デバイスコンテキストハンドルを格納するHDC型変数hDC. | |
PAINTSTRUCT ps; // ペイント情報を管理するPAINTSTRUCT構造体型の変数ps. | |
// ウィンドウの描画開始 | |
hDC = BeginPaint(hwnd, &ps); // BeginPaintでこのウィンドウの描画の準備をする. 戻り値にはデバイスコンテキストハンドルが返るので, hDCに格納. | |
// "あいうえお"のテキストと幅と高さを描画. | |
TCHAR tszText[] = _T("あいうえお"); | |
SIZE sz = {0}; | |
int len = lstrlen(tszText); | |
GetTextExtentPoint32(hDC, tszText, len, &sz); // GetTextExtentPoint32で幅と高さを取得. | |
TextOut(hDC, 0, 0, tszText, len); | |
TCHAR tszCX[256] = {0}; | |
TCHAR tszCY[256] = {0}; | |
_stprintf(tszCX, _T("sz.cx = %d"), sz.cx); | |
_stprintf(tszCY, _T("sz.cy = %d"), sz.cy); | |
TextOut(hDC, 0, 20, tszCX, lstrlen(tszCX)); | |
TextOut(hDC, 0, 40, tszCY, lstrlen(tszCY)); | |
// ウィンドウの描画終了 | |
EndPaint(hwnd, &ps); // EndPaintでこのウィンドウの描画処理を終了する. | |
} | |
// 既定の処理へ向かう. | |
break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう. | |
// 上記以外の時. | |
default: // 上記以外の値の時の既定処理. | |
// 既定の処理へ向かう. | |
break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう. | |
} | |
// あとは既定の処理に任せる. | |
return DefWindowProc(hwnd, uMsg, wParam, lParam); // 戻り値も含めDefWindowProcに既定の処理を任せる. | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment