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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Win32 API

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

Q&A

解決済

1回答

2703閲覧

windowsコマンドプロンプトでC言語のリソースファイルを使用する方法もしくは使わないでリソースを使用する方法

dendenmushi

総合スコア98

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Win32 API

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

0グッド

0クリップ

投稿2021/04/29 02:01

編集2021/04/29 02:03

前提・実現したいこと

ビットマップ表示方法のサイト
こちらのサイトを元にC言語でビットマップ画像を表示をしたいと思っております。

開発環境はwindows10でVSCodeを使用し実装しております。
ソースファイルのコンパイル方法はコマンドプロンプトにてgccを使用し以下コマンドを使っています。

cmd

1gcc bmp_display.c -o bmp_display -lgdi32

該当のソースコード

rc?

//リソーススクリプト KITTY BITMAP "neko.bmp"

bmp_display

c

1#include <windows.h> 2 3LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { 4 HDC hdc , hBuffer; 5 PAINTSTRUCT ps; 6 static HBITMAP hBitmap; 7 8 switch (msg) { 9 case WM_DESTROY: 10 DeleteObject(hBitmap); 11 PostQuitMessage(0); 12 return 0; 13 case WM_CREATE: 14 hBitmap = LoadBitmap( 15 ((LPCREATESTRUCT)lp)->hInstance , 16 TEXT("KITTY") 17 ); 18 return 0; 19 case WM_PAINT: 20 hdc = BeginPaint(hwnd , &ps); 21 hBuffer = CreateCompatibleDC(hdc); 22 SelectObject(hBuffer , hBitmap); 23 24 BitBlt(hdc , 0 , 0 , 400 , 120 , hBuffer , 70 , 80 , SRCCOPY); 25 26 DeleteDC(hBuffer); 27 EndPaint(hwnd , &ps); 28 return 0; 29 } 30 return DefWindowProc(hwnd , msg , wp , lp); 31} 32 33int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , 34 PSTR lpCmdLine , int nCmdShow ) { 35 HWND hwnd; 36 MSG msg; 37 WNDCLASS winc; 38 39 winc.style = CS_HREDRAW | CS_VREDRAW; 40 winc.lpfnWndProc = WndProc; 41 winc.cbClsExtra = winc.cbWndExtra = 0; 42 winc.hInstance = hInstance; 43 winc.hIcon = LoadIcon(NULL , IDI_APPLICATION); 44 winc.hCursor = LoadCursor(NULL , IDC_ARROW); 45 winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 46 winc.lpszMenuName = NULL; 47 winc.lpszClassName = TEXT("KITTY"); 48 49 if (!RegisterClass(&winc)) return -1; 50 51 hwnd = CreateWindow( 52 TEXT("KITTY") , TEXT("Kitty on your lap") , 53 WS_OVERLAPPEDWINDOW | WS_VISIBLE , 54 CW_USEDEFAULT , CW_USEDEFAULT , 55 CW_USEDEFAULT , CW_USEDEFAULT , 56 NULL , NULL , 57 hInstance , NULL 58 ); 59 60 if (hwnd == NULL) return -1; 61 62 while(GetMessage(&msg , NULL , 0 , 0)) { 63 TranslateMessage(&msg); 64 DispatchMessage(&msg); 65 } 66 return msg.wParam; 67}

発生している問題・エラーメッセージ

試したこと

・neko.bmpを用意し、リソースファイルの2行をクラス内外に記載。
・別のrc拡張子のファイルを作成しリソースファイルの内容を記載し同フォルダに配置。
・gcc resource.rc -o resourceコマンド

全てうまくいきませんでした。

画像認識系の参考書購入(3冊)しましたが、それらしきリソースファイルの取り扱いの記載が見当たらなく、
Google検索などでリソースファイルをコンパイルするには他のアプリが必要という記事やC++に関する記事が多く、C言語によるrcファイルのコンパイルの方法について見つけることができませんでした。

もしくはリソースファイルを使わない方法の記載でも構いません。
何かアドバイス頂けないでしょうか。よろしくお願い致します。

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

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

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

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

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

itagagaki

2021/04/29 02:59

Visual Studio 2019 Community Edition とかではダメなんですか?
dendenmushi

2021/04/29 03:06 編集

ありがとうございます。VSCodeだけで当初考えていました。リソースファイルなどをコンパイルするとなるとそれらコマンドだけで行うよりもVisual studio 2019を使う方が効率がいいということでしょうか。まだそちら試しておりません。C++ではなくスピード重視のC言語で作成希望です。
itagagaki

2021/04/29 03:04

まあ王道なので参考になるサンプルも容易に見つかりますし手っ取り早いと思います。
dendenmushi

2021/04/29 03:08

ありがとうございます。王道というのはC言語開発の際にVisual studio 2019を使うという意味でしょうか?
itagagaki

2021/04/29 03:13

C開発というよりもWindowsアプリ開発一般にはVisual Studioが定番かな?ということです。ほかの方法を使うのも全然ありだと思いますけどハードルもやや上がりますし。 Visual StudioでもCでの開発はもちろんできますよ。
dendenmushi

2021/04/29 03:18

そうなのですね。ありがとうございます。
dodox86

2021/04/29 03:19

お使いのgccは、MinGWでしょうか。それであればそれでも作ることができます。
dodox86

2021/04/29 03:24

そのgccを実行しているコマンドプロンプト上で、MinGWのリソースコンパイラであるwindresコマンドを実行できれば、それを使うことができます。 当方での実行例: C> windres --version GNU windres (GNU Binutils) 2.30 Copyright (C) 2018 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) any later version. This program has absolutely no warranty.
dodox86

2021/04/29 03:29

あ、既にasmさんが回答されていました。(気が付かなかった)大変失礼しました。
dendenmushi

2021/04/29 03:30

このようなバージョン状態でした。windresコマンド実行できました。ありがとうございます。 windres --version GNU windres (GNU Binutils) 2.28 Copyright (C) 2017 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) any later version. This program has absolutely no warranty.
guest

回答1

0

ベストアンサー

sh

1windres -i resource.rc -o res.o 2gcc bmp_display.o res.o -lgdi32

ただし、参考サイトの本文にも書かれている通り
BitBltの転送範囲については画像に合わせて調整する必要がある点に留意が必要です。
(なんでサンプルコードなのに変なところがコピー元の始点になってんだろう)


リソースを使わずに直接bmpファイルを読み込ませる方法としては

c

1hBitmap = LoadImage(0, "neko.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

LoadBitmapの代わりに使うとよい

投稿2021/04/29 03:03

編集2021/04/29 04:33
asm

総合スコア15149

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

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

dendenmushi

2021/04/29 03:21

ありがとうございます。今一行目は実行できres.oファイル作成できました。二行目なのですが、display.oがないと表示されてしまい、これはその前提に gcc bmp_display.c -o display.o ldgi32 などのコマンドで.oファイルを作成しあとで結合するということなのでしょうか。
asm

2021/04/29 03:22

ファイル名めんどくさかったから省略してたの忘れてました。
dendenmushi

2021/04/29 03:25

gcc bmp_display.o res.o -lgdi32 bmp_display.o: file not recognized: File format not recognized collect2.exe: error: ld returned 1 exit status となってしまいました。(強引に.oに拡張子変えました…) つまりこれは gcc bmp_display.c res.o -lgdi32 ということでしょうか。今実行したところコンパイルは通ったようですが、exe実行しますと真っ白な画面のみになってしまいました。リソースファイルと連結できていないような症状でした。
dendenmushi

2021/04/29 03:29

同じように.o拡張子を作るものだと解釈し同様にソースの方も行って前準備をしようとしたところエラーになってしまいました。 windres -i bmp_display.c -o bmp_display.o windres: bmp_display.c:6: syntax error bmp_display.c:2:0: fatal error: when writing output to : Broken pipe compilation terminated. windres: preprocessing failed.
asm

2021/04/29 03:39 編集

>(強引に.oに拡張子変えました…) いえ、gcc -c bmp_display.cでbmp_display.oが出力されます。 > ということでしょうか。 まぁ、それでも大丈夫ですが > 真っ白な画面のみになってしまいました。 回答中でも提示した通りBitBltの転送範囲を調整する必要があります。 とりあえず70,80を0,0に変えると左上が始点になるでしょう。
dendenmushi

2021/04/29 03:47

非常に勉強になります。ありがとうございます。 70→0,80→0に変更 gcc -c bmp_display.c gcc bmp_display.o res.o -lgdi32 a.exeが出来上がりました。 a.exeを実行したところ先ほどと同じ真っ白な画面のみでした。 他にも30 30にしてみるなど試みましたが同様の症状でした。何かケアレスをしていないかもう一度行ってみます。
asm

2021/04/29 05:04

neko.bmpに問題があるのではないでしょうか? 拾い物のCC0を加工したものですが https://xfs.jp/Ye23P
dendenmushi

2021/04/29 10:22

映りました。bmpが原因でした。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問