0から始めるVisualStudio2022:ソフト開発塾

ダイアログボックスで(8.スクロールバーを表示してみるのような)ウィンドウを作成し
画像(BMPファイル)を表示してみる。
VisualStudio2022を起動して
新しいプロジェクトを選んで
C++の空のプロジェクトを選んで
次に、メニューより
『プロジェクト』『リソースの追加』
「Dialog」で、「新規作成」ボタンを押す。
ダイアログを編集する画面が現れた。
OK と キャンセル を削除する
IDをIDD_DIALOG1から"DIALOGBOX"に(ダブルクォーテーションを両側につけて)
境界線をダイアログ枠からサイズ変更枠に
垂直スクロールバーおよび水平スクロールバーをTrue
ダイアログはこんな感じになります。
ついでにボックスの最大化・ボックスの最小化をTrue
10.ダイアログボックスで、作ったdialog000.cppをコピーして
名前をdialog003.cppにする。
とりあえず、ビルド!!
その前に、いつもの
WINDOWSの場合、リンクでエラーが出てないように
『プロジェクト』『プロパティ』の「リンカー」「システム」
サブシステムを「コンソール」から「Windows」に変える。
実行すると、こんな感じ。
まぁ、何もない。
で、ソースの修正
BOOL CALLBACK MyDlgProc にあるswitch の case を追加

WM_INITDIALOG に、初期処理関係を
WM_PAINT に、BMP表示処理関係を
WM_DESTROY に、後始末を
サイズ変更に対応するなら、WM_SIZE
スクロールに対応するなら、WM_VSCROLL WM_HSCROLLにと
WM_CREATE での処理を、WM_INITDIALOG に、記述すればOKの様だ。

その前に、
表示する、BMPファイルは、ペイントで適当に作成して
C:\softca\dialog\samp.bmp 
に保管して
次に、ダイアログを作成した時の同じ様に
メニューより
『プロジェクト』『リソースの追加』
インポート
すると、リソースビューは
こんな感じで、IDB_BITMAP1 のプロパティは
と、ファイル名が、C:\softca\dialog\samp.bmp となっている。
で、IDを IDB_BITMAP1 から "BITMAP_FILENAME" に(ダブルクォーテーションを両側につけて)
リソースビューは
となった。
dialog003.cpp のソースは以下の通り
#include <Windows.h>

HINSTANCE g_hInst;

BOOL CALLBACK MyDlgProc(
    HWND hDlg,
    UINT msg,
    WPARAM wPara,
    LPARAM lPara
) {
    static HBITMAP mm_hbitmap;
    static BITMAP  mm_bitmap;
    static HDC     mm_hdc_bitmap;

    HDC hdc;
    PAINTSTRUCT ps;

    switch (msg) {
    case WM_INITDIALOG:
        mm_hbitmap = LoadBitmapA(g_hInst,"BITMAP_FILENAME");
        GetObject(mm_hbitmap, sizeof(BITMAP), &mm_bitmap);
        mm_hdc_bitmap = CreateCompatibleDC(NULL);
        SelectObject(mm_hdc_bitmap, mm_hbitmap);
		break;
    case WM_PAINT:
    	hdc = BeginPaint(hDlg, &ps);
        BitBlt(hdc, 0, 0, mm_bitmap.bmWidth, mm_bitmap.bmHeight, mm_hdc_bitmap, 0, 0, SRCCOPY);
        EndPaint(hDlg, &ps);
        break;
    case WM_DESTROY:
        DeleteDC(mm_hdc_bitmap);
        DeleteObject(mm_hbitmap);
        break;
    }
    return FALSE;
}
int WINAPI WinMain(
    _In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR     lpCmdLine,
    _In_ int       nCmdShow) {

	g_hInst = hInstance;

    DialogBoxA(hInstance, "DIALOGBOX", NULL, (DLGPROC)MyDlgProc);

    return 0;
}
今回は、ここまで






Top