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

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

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

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

C++

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

Q&A

3回答

5763閲覧

Win32APIでBMPファイルを読み込む方法

退会済みユーザー

退会済みユーザー

総合スコア0

Win32 API

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

C++

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

0グッド

0クリップ

投稿2016/12/04 07:15

編集2016/12/04 12:09
#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; } コード ```[問題のソースコード](http://k3tec.net/neko_wiki/index.php?Win32API%20bmp%A5%D5%A5%A1%A5%A4%A5%EB%C6%C9%A4%DF%B9%FE%A4%DF) このサイトのソースコードをVisualStudio2015で実行したところプリコンパイルヘッダーを検索中に不明なEOFが見つかりました。#include "stdafx.h"をソースに追加しましたか?というエラーが出ました。どうすればビルドできるようになるでしょうか?

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

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

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

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

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

MasahikoHirata

2016/12/04 07:20

ソースコードの開示には、コードの先頭と終わりに"'''"を付けたらソースが見えやすくなります。原状では回答されるにも難読だと思います。
退会済みユーザー

退会済みユーザー

2016/12/04 07:37

使い始めたばかりなもので…すみません。よろしくお願いします
MasahikoHirata

2016/12/04 10:57

質問の編集の際に左上側に‘<code>‘が有ると思います。これを押してソースを張り付ける(コピペ)。すると整形されたソースが質問文に反映されます。またvisual studioでのプロジェクトの作成の際に何を選択したのか?が明示されると現在の回答されている方も正確な回答を入力しやすくなります。まだ正答が得られていないと解釈して老婆心ながらの依頼です。
退会済みユーザー

退会済みユーザー

2016/12/04 12:09

ご親切にありがとうございます。まだ解決できていないのでよろしくお願いします。
MasahikoHirata

2016/12/04 14:13

他の回答者さまの言われるように、先頭に’#include <stdafx.h>"を追加してコンパイルしてみてください。
guest

回答3

0

少し、省略します。

以下のようにヘッダーファイルを作成して。

class createBMP{ public: int LoadBMP(HWND hWnd, LPCTSTR name); int ShowBMP(int m, int x, int y, int w, int h, int x2, int y2); int DeleteBMP(); private: HDC hdc, hdc_mem; HBITMAP hbmp; //class 内では static 型は扱えません int v = 0, b = 0; BITMAP bmp_info; }; int createBMP::LoadBMP(HWND hWnd, LPCTSTR name){ hbmp = (HBITMAP)LoadImage(NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); GetObject(hbmp, (int)sizeof(BITMAP), &bmp_info); v = bmp_info.bmWidth; b = bmp_info.bmHeight; hdc = GetDC(hWnd); hdc_mem = CreateCompatibleDC(hdc); SelectObject(hdc_mem, hbmp); return 0; } int createBMP::ShowBMP(int m, int x, int y, int w = 1, int h = 1, int x1 = 0, int y2 = 0){ if (m == 0) BitBlt(hdc, x, y, w, h, hdc_mem, x1, y2, SRCCOPY); if (m == 1) StretchBlt(hdc, x, y, v * w, b * h ,hdc_mem, x1, y2, v, b, SRCCOPY); return 0; } int createBMP::DeleteBMP(){ DeleteDC(hdc_mem); DeleteObject(hbmp); return 0; }

このヘッダーファイルをinclude し、以下のようにCALLBACK()を作り直してみてください。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg){ case WM_CREATE: bmp.LoadBMP(hWnd, TEXT("gandam.bmp")); return 0; case WM_PAINT: bmp.ShowBMP(1, 0, 0); break; case WM_DESTROY: bmp.DeleteBMP(); PostQuitMessage(0); break; } return DefWindowProc(hWnd, msg, wp, lp); }

わたしはこれで成功しました。

win32 project はvisual C++ → win32プロジェクト→ 空のプロジェクトにチェックを入れて、プログラミングしてみてください。
stdafx.h は必要ありません。
これは有名な自作ヘッダーです。
.#include <windows.h>だけinlcude してビルドボタンを押せば大丈夫です。
確認してみてください。

投稿2016/12/05 02:02

編集2016/12/05 02:18
strike1217

総合スコア651

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

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

0

VCで新規プロジェクトを作成すると、デフォルトでプリコンパイル済ヘッダというものを使う設定になります。この設定のためのファイルが欠けていると、エラーになります。
プリコンパイル済ヘッダは、コンパイル時間の短縮のために用いられ、大規模なソフトウェア開発ではそれなりに便利なのですが、初心者には邪魔になると思っています。
直し方は2種類あり、プロジェクトの設定でプリコンパイル済ヘッダを使用しない設定に切り換えるか、プリコンパイル済ヘッダを作成して該当のソースファイルにインクルード貼りつけるとokです。

投稿2016/12/04 08:00

編集2016/12/04 08:03
majiponi

総合スコア1720

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

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

0

まさに、エラーメッセージ通りに .cpp ファイルの先頭に stdafx.h をインクルードしましょう。

投稿2016/12/04 07:37

mugicya

総合スコア1046

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

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

mugicya

2016/12/04 07:40

追記:普通にプロジェクトを作成して、そのプロジェクトにリンク先のソースを登録しましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問