完璧!

#include <windows.h>
#include <vector>
#include <sstream>

const int WINDOW_WIDTH = 200;
const int WINDOW_HEIGHT = 400;
const int LINE_HEIGHT = 20;
const int TOTAL_LINES = 20;
const int VISIBLE_LINES = 10;

HWND g_hWnd;
int g_scrollPosition = 0;
int g_selectedIndex = 0;

void ShowSelectedMessage(HWND hWnd, int selectedIndex) {
    std::wstring message = L"Selected Line: " + std::to_wstring(selectedIndex + 1);
    MessageBox(hWnd, message.c_str(), L"Selected Line", MB_OK | MB_ICONINFORMATION);
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
    case WM_CREATE: {
        // スクロールバーをウィンドウに追加
        SetScrollRange(hWnd, SB_VERT, 0, TOTAL_LINES - VISIBLE_LINES, TRUE);
        return 0;
    }
    case WM_PAINT: {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        RECT rect;
        GetClientRect(hWnd, &rect);

        // 表示する行数を計算
        int startIndex = g_scrollPosition;
        int endIndex = min(startIndex + VISIBLE_LINES, TOTAL_LINES);

        // 行ごとに描画
        for (int i = startIndex; i < endIndex; ++i) {
            rect.top = (i - g_scrollPosition) * LINE_HEIGHT;
            rect.bottom = rect.top + LINE_HEIGHT;

            // テキストを描画
            wchar_t text[16];
            swprintf_s(text, L"%d", i + 1); // 番号を文字列に変換
            DrawText(hdc, text, -1, &rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE);

            // 選択された行は色で示す
            if (i == g_selectedIndex) {
                // 選択された行は黄色で描画
                FillRect(hdc, &rect, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
            }
        }

        EndPaint(hWnd, &ps);
        return 0;
    }
    case WM_KEYDOWN: {
        switch (wParam) {
        case VK_UP:
            if (g_selectedIndex > 0)
                --g_selectedIndex;
            if (g_selectedIndex < g_scrollPosition)
                --g_scrollPosition;
            InvalidateRect(hWnd, NULL, TRUE);
            return 0;
        case VK_DOWN:
            if (g_selectedIndex < TOTAL_LINES - 1)
                ++g_selectedIndex;
            if (g_selectedIndex >= g_scrollPosition + VISIBLE_LINES)
                ++g_scrollPosition;
            InvalidateRect(hWnd, NULL, TRUE);
            return 0;
        case VK_RETURN:
            ShowSelectedMessage(hWnd, g_selectedIndex);
            return 0;
        }
        break;
    }
    case WM_DESTROY: {
        PostQuitMessage(0);
        return 0;
    }
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszClassName = L"WindowClass";

    RegisterClass(&wc);

    g_hWnd = CreateWindowEx(0, L"WindowClass", L"Selectable Window", WS_OVERLAPPEDWINDOW | WS_VSCROLL,
        CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);

    ShowWindow(g_hWnd, nCmdShow);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

ウィンドウで操作中、main関数のwhile文で処理

#include <windows.h>
#include <iostream>

// グローバル変数
HWND g_hWnd;
bool g_running = true;

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
    case WM_DESTROY: {
        PostQuitMessage(0);
        return 0;
    }
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

int main() {
    HINSTANCE hInstance = GetModuleHandle(NULL);

    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = L"WindowClass";

    RegisterClass(&wc);

    g_hWnd = CreateWindowEx(0, L"WindowClass", L"Interactive Window", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 400, 200, NULL, NULL, hInstance, NULL);

    ShowWindow(g_hWnd, SW_SHOW);

    MSG msg;
    while (g_running) {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) {
                g_running = false;
            }
            else {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        else {
            // ここにメインの処理を記述する
            // 例えば、キー入力をチェックしてescキーが押されたら g_running を false に設定する
            if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) {
                g_running = false;
            }

            if (GetAsyncKeyState(VK_UP) & 0x8000) {
                std::cout << "やっほー"<< std::endl;
            }

            // ここに追加の処理を記述する
            // この例では、何か重要な処理を行っていると仮定し、その結果を表示する
            //std::cout << "Processing..." << std::endl;

            // 少し待機する(適切なウェイト処理を行うことが望ましい)
            Sleep(100);
        }
    }

    // プログラムの終了処理などを行う

    return 0;
}

10行分スクロール

#include <iostream>
#include <windows.h>
#include <conio.h>

const int WINDOW_HEIGHT = 10;
const int TOTAL_LINES = 20;

void setConsoleWindowSize(int width, int height) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SMALL_RECT rect = { 0, 0, static_cast<SHORT>(width - 1), static_cast<SHORT>(height - 1) };
    SetConsoleWindowInfo(hConsole, TRUE, &rect);
}

void setConsoleCursorPosition(int x, int y) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos = { static_cast<SHORT>(x), static_cast<SHORT>(y) };
    SetConsoleCursorPosition(hConsole, pos);
}

void displayData(int startIndex) {
    system("cls"); // 画面をクリア

    for (int i = startIndex; i < startIndex + WINDOW_HEIGHT; ++i) {
        std::cout << "Line " << i + 1 << std::endl;
    }
}

int main() {
    int scrollPosition = 0;

    // コンソールウィンドウのサイズを設定
    setConsoleWindowSize(80, WINDOW_HEIGHT);

    while (true) {
        displayData(scrollPosition);

        // キー入力を待機し、上下キーでスクロール
        int key = _getch();
        if (key == 224) { // 上下キーの場合
            key = _getch(); // 2回_getch()を呼び出してキーコードを取得
            if (key == 72 && scrollPosition > 0) { // 上キー
                --scrollPosition;
            }
            else if (key == 80 && scrollPosition < TOTAL_LINES - WINDOW_HEIGHT) { // 下キー
                ++scrollPosition;
            }
        }
    }

    return 0;
}

WORD

#include <iostream>
#include <cstdio>
#include <windows.h>
#include <stdio.h>

void main()
{
    SYSTEMTIME st, lt;

    GetSystemTime(&st);
    GetLocalTime(&lt);

    printf("The system time is: %02d:%02d\n", st.wHour, st.wMinute);
    printf(" The local time is: %02d:%02d\n", lt.wHour, lt.wMinute);

    WORD wordVariable = 42; // 例として42を使用しますが、適切な値に置き換えてください

// WORD型の変数をint型にキャストして%02dに代入して出力
    printf("Formatted WORD variable: %02d\n", static_cast<int>(wordVariable));

}

メール作成

【Mail_Setting.xlsm】

Sub SendEmail()

    Dim OutlookApp As Object
    Dim MailItem As Object
    
    Dim mail_list As Variant
    Dim i As Integer
    
    Dim LastRow As Long
    
    ' C列の最終行を取得
    LastRow = Cells(Rows.Count, "C").End(xlUp).Row
    
    ReDim mail_list(0 To LastRow - 2) ' 配列のサイズを指定

    For i = 2 To LastRow Step 1
        mail_list(i - 2) = Cells(i, 3).Value
    Next
    
    ' 配列を1つの文字列に結合
    Dim EmailAddresses As String
    
    ' BCCのメールアドレスを設定
    For i = 0 To LastRow - 2 Step 1
        EmailAddresses = Join(mail_list, "; ")
'        If i = 0 Then
'            EmailAddresses = mail_list(0)
'        Else
'            EmailAddresses = EmailAddresses & "; " & mail_list(i)
'        End If
    Next
    
    
    ' メール本文の設定
    MailBody = Range("メール!B2").Value
    
    ' Outlook アプリケーションを取得
    On Error Resume Next
    Set OutlookApp = GetObject(, "Outlook.Application")
    On Error GoTo 0
    
    If OutlookApp Is Nothing Then
        Set OutlookApp = CreateObject("Outlook.Application")
    End If
    
    ' メール作成
    Set MailItem = OutlookApp.CreateItem(0)
    
    ' メール設定
    With MailItem
        .BCC = EmailAddresses ' BCC
        .subject = Range("メール!B1").Value ' 件名
        .Body = Range("メール!B2").Value ' 本文
        .Display ' メールを表示
        '.Send ' メールを直接送信する場合はコメントを外す
    End With

    Set MailItem = Nothing
    Set OutlookApp = Nothing
    
    ThisWorkbook.Save
    Application.Quit
    
End Sub

 

【RunExcelMacro.vbs】

Dim obj
Set obj = WScript.CreateObject("Excel.Application")

obj.Visible = false

obj.Workbooks.Open WScript.Arguments(0)
obj.Application.Run WScript.Arguments(1)

 

【メール自動生成はここをクリック.bat】

@echo off
setlocal enabledelayedexpansion
cd %~dp0

RunExcelMacro.vbs %~dp0\Mail_Setting.xlsm SendEmail

 

 

スペイン

日程   観光エリア 移動等 宿エリア 宿
04/26 日本発      
04/27 マドリード マドリード市内 マドリード SLEEP'N Atocha - B Corp Certified
04/28 トレド 午後トレド マドリード SLEEP'N Atocha - B Corp Certified
04/29 セゴビア 午前セゴビア マドリード SLEEP'N Atocha - B Corp Certified
04/30 コルドバ コルドバセビリア セビリア オスタル サン フランシスコ
05/01 セビリア セビリアグラナダ グラナダ ホテル イングラテラ
05/02 グラナダ グラナダ観光 バルセロナ ブティック ホテル H10 カタルーニャ プラザ
05/03 バルセロナ バルセロナ市内 バルセロナ ブティック ホテル H10 カタルーニャ プラザ
05/04 バルセロナ バルセロナ市内 バルセロナ ブティック ホテル H10 カタルーニャ プラザ
05/05 バルセロナ バルセロナ市内 バルセロナ ブティック ホテル H10 カタルーニャ プラザ
05/06 日本着      

 

 

starmiy307

文字選択による結果(簡易化)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>
#include <vector>

// 選択された文字列のインデックス
int selectedIndex = 0;

// 選択肢の文字列
std::vector<std::string> options = { "おはよう", "こんにちは", "こんばんは", "おやすみ" };

int key_mode;
void key_sel_paint(HWND hwnd);
void key_sel_keydown(HWND hwnd, WPARAM wParam);
void display_mode(int sel);

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
    case WM_CREATE:
        break;
    case WM_PAINT:
        switch (key_mode) {
        case 1:
            key_sel_paint(hwnd);
            break;
        }
        break;
    case WM_KEYDOWN:
        switch (key_mode) {
        case 1:
            key_sel_keydown(hwnd, wParam);
            break;
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int main() {
    // ウィンドウクラスの登録
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = WndProc;
    wc.hInstance = GetModuleHandle(NULL);
    wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 0, 255)); // 背景色を青に設定
    wc.lpszClassName = "MyWindowClass";
    RegisterClass(&wc);

    // ウィンドウ作成
    HWND hwnd = CreateWindow("MyWindowClass", "選択してください", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, GetModuleHandle(NULL), NULL);

    // ウィンドウ表示
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);

    display_mode(1);

    // メッセージループ
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

void display_mode(int sel) {
    switch (sel) {
    case 1:
        key_mode = 1;
        break;
    }
}

void key_sel_paint(HWND hwnd) {
    //key_mode = 0;

    PAINTSTRUCT ps;
    HDC hdc = GetDC(hwnd);
    RECT rect;
    HFONT hFont;
    GetClientRect(hwnd, &rect);
    int lineHeight = (rect.bottom - rect.top) / options.size();

    // フォントの設定
    hFont = CreateFont(20, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Arial");
    SelectObject(hdc, hFont);

    hdc = BeginPaint(hwnd, &ps);
    for (size_t i = 0; i < options.size(); ++i) {
        // 選択された文字列と背景色を設定
        if (selectedIndex == i) {
            SetBkColor(hdc, RGB(255, 255, 0));  // 背景色を黄色に設定
            SetTextColor(hdc, RGB(0, 0, 255));  // 文字色を青色に設定
        }
        else {
            SetBkColor(hdc, RGB(0, 0, 255));     // 背景色を青色に設定
            SetTextColor(hdc, RGB(0, 255, 255)); // 文字色を水色に設定
        }
        // 選択肢の表示位置を設定
        rect.top = i * (lineHeight - 30);
        rect.bottom = (i + 1) * lineHeight;

        //InvalidateRect(hwnd, NULL, NULL);
        //UpdateWindow(hwnd);

        // 選択肢の描画
        DrawText(hdc, options[i].c_str(), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    }
    EndPaint(hwnd, &ps);
}

void key_sel_keydown(HWND hwnd,WPARAM wParam) {
    // 上キーが押されたら selectedIndex を減らし、下キーが押されたら増やして、ウィンドウを再描画
    if (wParam == VK_UP) {
        selectedIndex = (selectedIndex - 1 + options.size()) % options.size();
        InvalidateRect(hwnd, NULL, NULL);
        UpdateWindow(hwnd);
    }
    else if (wParam == VK_DOWN) {
        selectedIndex = (selectedIndex + 1) % options.size();
        InvalidateRect(hwnd, NULL, NULL);
        UpdateWindow(hwnd);
    }
    // Enterキーが押されたら選択結果を表示してウィンドウを閉じる
    else if (wParam == VK_RETURN) {
        std::cout << "選択されたのは: " << options[selectedIndex] << std::endl;
        DestroyWindow(hwnd);
    }
}