メッセージボックスを表示する(64ビット)

メッセージボックスです。
32ビットと64ビットの両方に対応しています。

win64

resource.h

#pragma once
#define IDR_MENU1  100
#define ID_EXIT   101
#define ID_TEST   102
#define ID_A   103
#define ID_B   104
#define ID_Menu   105
#define ID_Whats  106
#define ID_Help   107
#define ID_STATUS  108

menu.rc

#include "resource.h"

IDR_MENU1 MENU
BEGIN
POPUP "File"
BEGIN
MENUITEM "Exit", ID_EXIT
END
POPUP "Test"
BEGIN
MENUITEM "てすつ", ID_TEST
END
POPUP "Option"
BEGIN
MENUITEM "A", ID_A
MENUITEM "B", ID_B
MENUITEM "めにゅ~", ID_Menu
MENUITEM "whats?", ID_Whats
END
MENUITEM "ヘルプ", ID_Help
END

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib, "comctl32.lib")
#include <GL/freeglut/freeglut.h>
#include "resource.h"
#include <commctrl.h> //CreateStatusWindow()のために必要

//FreeGlutのウインドウプロシージャを置き換える為の変数
WNDPROC WndProc = NULL; //元のウィンドウプロシージャ
HWND hWnd2 = NULL; //ウィンドウハンドル
HMENU hMenu = NULL; //メニュー
HWND hStatusbar;     // ステータスバーのハンドル

//Windowのサイズ
int width = 640;
int height = 480;

//回転用
float anglex = 0.0f;
//白
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };

//置き換えた後のプロシージャ
LRESULT CALLBACK WndProc2(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
    case WM_SIZE:
        SendMessage(hStatusbar, WM_SIZE, wParam, lParam);
        return 0;
    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case ID_EXIT:
            PostQuitMessage(0);
        }
        return 0;
    case WM_DESTROY:
        exit(0);
        break;
    default:
        if (WndProc) {
            return CallWindowProc(WndProc, hWnd, msg, wParam, lParam);
        }
        else {
            return DefWindowProc(hWnd, msg, wParam, lParam);
        }
    }
}

//ウィンドウの検索
BOOL CALLBACK enumWindowsProc(HWND hWnd, LPARAM lParam) {
    HANDLE hModule = (__int64*)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
    if (GetModuleHandle(NULL) == hModule) {
        wchar_t ClassName[256];
        GetClassNameW(hWnd, ClassName, sizeof(ClassName) / sizeof(ClassName[0]));
        if (wcsncmp(ClassName, L"FREEGLUT", wcslen(ClassName)) == 0) {
            hWnd2 = hWnd;
            return FALSE;
        }
    }
    return TRUE;
}

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(30.0, (double)width / (double)height, 1.0, 1000.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    gluLookAt(150.0, 150.0, -150.0,
        0.0, 0.0, 0.0,
        0.0, 1.0, 0.0);

    glMaterialfv(GL_FRONT, GL_DIFFUSE, white);
    //回転
    glRotatef(anglex, 1.0f, 0.0f, 0.0f);//X軸を回転
    glutSolidSphere(40.0, 16, 16);

    glutSwapBuffers();
}
void idle(void) {
    anglex += 2.0f;
    Sleep(1);
    glutPostRedisplay();
}
void Init() {
    glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
    glEnable(GL_DEPTH_TEST);
    //ワイヤーフレーム
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(width, height);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutCreateWindow("メッセージボックス");
    //FreeGlutのウインドウハンドルとウインドウプロシージャを置き換える
    EnumWindows(enumWindowsProc, 0);
    if (hWnd2) {
        WndProc = (WNDPROC)(__int64)GetWindowLongW(hWnd2, GWLP_WNDPROC);
        SetWindowLongW(hWnd2, GWLP_WNDPROC, (LONG)(LRESULT)WndProc2);
    }
    else {
        return false;
    }
    //メニューを作成
    hMenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU1));
    if (hMenu) {
        SetMenu(hWnd2, hMenu);
    }
    else {
        return false;
    }
    // コモンコントロール関係の初期化
    InitCommonControls();
    // ステータスバーを作成
    hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,
        L"ステータスバー", hWnd2, ID_STATUS);

    MessageBox(hWnd2, L"メッセージボックスです。", L"タイトル", MB_OK);
    glutDisplayFunc(display);
    glutIdleFunc(idle);
    Init();
    glutMainLoop();
    return true;
}

 

最終更新:2023年11月28日 15:22
添付ファイル