質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

4518閲覧

Win32API bmpファイル表示について

退会済みユーザー

退会済みユーザー

総合スコア0

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/12/04 12:31

ソースコード

#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); TCHAR szClassName[] = TEXT("template"); //ウィンドウクラス #pragma region InitWindow int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } //ウィンドウ・クラスの登録 ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst;//インスタンス wc.hIcon = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; //メニュー名 wc.lpszClassName = (LPCTSTR)szClassName; wc.hIconSm = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); return (RegisterClassEx(&wc)); } //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, TEXT("Windowsプログラミング"), //タイトルバーにこの名前が表示されます WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドル、クラスメニューを使うときはNULL hInst, //インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } #pragma endregion //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; HDC hdc; // デバイスコンテキストハンドル(描画の出力先(ディスプレイ)へのハンドル) PAINTSTRUCT ps; // 描画構造体 static HDC hMemDC; static HBITMAP hBitmap; // ビットマップハンドル static BITMAP bitmap; // ビットマップ switch (msg) { case WM_CREATE: { hMemDC = CreateCompatibleDC(NULL); hBitmap = (HBITMAP)LoadImage( (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE), BMPFILE,IMAGE_BITMAP, 0,0,LR_LOADFROMFILE); SelectObject(hMemDC,hBitmap); GetObject(hBitmap,sizeof(BITMAP),&bitmap); } break; case WM_PAINT: { hdc = BeginPaint(hWnd,&ps); BitBlt(hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hMemDC,0,0,SRCCOPY); EndPaint(hWnd,&ps); } break; case WM_CLOSE: { id = MessageBox(hWnd, TEXT("終了してもよろしいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if (id == IDYES) DestroyWindow(hWnd); } break; case WM_DESTROY: { DeleteDC(hMemDC); // デバイスコンテキストの削除 DeleteObject(hBitmap); // ビットマップの消去 PostQuitMessage(0); } break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } コード

このソースコードを変更してウインドウにファイルを開くメニューバーを追加して画像ファイルを開けるようにするにはどうすればよいのでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

メニューバーの追加は少し複雑です。
ヘッダーファイルとrcファイルを用意します。

以下ヘッダーファイル

#define IDM_END 101 #define IDM_CAT1 102 #define IDM_CAT2 103 #define IDM_CAT3 104

以下rcファイル

#include "resource.h" ////////////////////////////////////////////////////////////////// // Menu // MYMENU MENU BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "終了(&X)", IDM_END END POPUP "オプション(&O)" BEGIN MENUITEM "BMP1(&1)", IDM_CAT1 MENUITEM "BMP2(&2)", IDM_CAT2 MENUITEM "BMP3(&3)", IDM_CAT3 END END ////////////////////////////////////////////////////////////////// // // Bitmap // MYBMP1 BITMAP "123.bmp" MYBMP2 BITMAP "1234.bmp" MYBMP3 BITMAP "12345.bmp"

以下main()のファイルにresource.hをinclude して、

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc; PAINTSTRUCT ps; HBITMAP hBmp; HDC hdc_memx; switch (msg) { case WM_CREATE: hdc = GetDC(hWnd); // メモリデバイスコンテキストhdc_mem1に // ビットマップリソース「MYBMP1」を読み込む hBmp = LoadBitmap(hInst, TEXT("MYBMP1")); hdc_mem1 = CreateCompatibleDC(hdc); SelectObject(hdc_mem1, hBmp); DeleteObject(hBmp); // メモリデバイスコンテキストhdc_mem2に // ビットマップリソース「MYBMP2」を読み込む hBmp = LoadBitmap(hInst, TEXT("MYBMP2")); hdc_mem2 = CreateCompatibleDC(hdc); SelectObject(hdc_mem2, hBmp); DeleteObject(hBmp); // メモリデバイスコンテキストhdc_mem3に // ビットマップリソース「MYBMP3」を読み込む hBmp = LoadBitmap(hInst, TEXT("MYBMP3")); hdc_mem3 = CreateCompatibleDC(hdc); SelectObject(hdc_mem3, hBmp); DeleteObject(hBmp); ReleaseDC(hWnd, hdc); break; case WM_PAINT: BeginPaint(hWnd, &ps); if (show_no == 1) hdc_memx = hdc_mem1; if (show_no == 2) hdc_memx = hdc_mem2; if (show_no == 3) hdc_memx = hdc_mem3; // ビットマップを転送 BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, hdc_memx, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY); EndPaint(hWnd, &ps); break; case WM_COMMAND: switch (LOWORD(wp)) { case IDM_CAT1: show_no = 1; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_CAT2: show_no = 2; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_CAT3: show_no = 3; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; } break; case WM_DESTROY: DeleteDC(hdc_mem1); // メモリデバイスコンテキストを破棄 DeleteDC(hdc_mem2); // メモリデバイスコンテキストを破棄 DeleteDC(hdc_mem2); // メモリデバイスコンテキストを破棄 PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

コンパイルします。
ダイアログボックスなどを出したい場合はもう少し複雑になります!!

投稿2016/12/05 02:09

strike1217

総合スコア651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問が長い。分解して考えましょう。

  1. ウィンドウにメニューを追加する方法

http://www.kumei.ne.jp/c_lang/sdk/sdk_06.htm
リソースを使う方法が紹介されています。多分いちばん簡単だと思います。注意することは、リソースを作るだけではダメで、そのリソースを使う、と「指定」する必要があることです。

  1. そのメニューのクリックに対応する方法

上のページでクリックを受け取る方法も説明されているので、省略します。

  1. 「開く」ウィンドウの表示

http://www.kumei.ne.jp/c_lang/sdk/sdk_73.htm
APIを利用できます。ライブラリを追加する必要があること(commdlg.hとcomdlg32.lib)が注意点です。

  1. 画像の表示

お任せします。そのまま表示させたいのか、グレースケールにするのか、ヒストグラムにするのか、表示といわれても多種多様な方法があり、日本語の不自由な拙者には分かりかねます。

投稿2016/12/06 22:46

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なんか丸投げに見えます。

どこがわからないのでしょうか。

回答者は質問者ではないので、どこがわからないのかがわかりません。

このソースコードを変更してウインドウにファイルを開くメニューバーを追加して画像ファイルを開けるようにするにはどうすればよいのでしょうか

メニューバー操作 ( 少なくとも設定は必ず。 ) はできますでしょうか?

画像ファイルの読み込み ( 画像を描画するため? ) はできますでしょうか?

どこまで理解しているのかがわかりません。

単体ならわかるが、一気にやろうとしたため無理だったのか、

それぞれわからんなのか、

とか。

画像ファイルの読み込みもメニューバーの追加もそれぞれ入門系のサイトや書籍に載っています。

「Windows API 入門」で検索すると、

Windows API 入門等がヒットします。

もし、調べたけど自分の環境とは違うというなら、まず環境も定義してください。

じゃないと、まったく違う環境 ( MinGW を使っているのに VC++向けの方法を教えられたとか ) の方を教えられる可能性があります。

投稿2017/12/15 05:53

編集2017/12/15 06:05
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問