リソーススクリプトのコンパイルの仕方が分からない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
素人

リソーススクリプトのコンパイルの仕方が分からない

#1

投稿記事 by 素人 » 6年前

Windows APIの勉強をしている者です。
現在、WinAPIを用いて独自アイコンの表示を行おうとしているのですがVisual Studioでリソーススクリプトを作ることやコンパイルができずに困っています。
リソースを追加すると「RC1015 "winres.h"が開けない」と表示されます。
Windows kitsの中にあるwinres.hを持ってきたとしてもエラーは解消されません。
また、ほかのエディターで開かれているため開くことができないとも表示されます。
サイトで調べたり、環境の初期化を行ってみたりしたのですが、もう自分にはこれからどうしたらいいのかがわかりません。
詳しい方はお力添えをお願いします。

1.したいこと
リソースを用いた画像の表示(アイコン、画像)

2.アイコンの表示に用いるプログラム
一番下に表記

3.困っているもの
リソーススクリプトを開くことも、コンパイルすることもできない

4.知りたいこと
RC1015の解決方法 リソーススクリプトのコンパイル方法

5.現在のCの知識
プログラム勉強歴2年

6.開発環境
IDE:Visual Studio 2017
OS:Windows10
API:Windows API


コード:

#include <Windows.h>
#include <time.h>
#include <math.h>


LRESULT _stdcall proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
	HDC hdc;
	TEXTMETRIC tm;
	PAINTSTRUCT ps;

	static RECT rect;
	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
		break;
	case WM_CREATE:
		hdc = GetDC(hwnd);
		CreateWindowEx(NULL, L"EDIT", NULL, ES_MULTILINE| ES_AUTOHSCROLL| ES_AUTOVSCROLL |WS_CHILD | WS_BORDER | WS_VISIBLE, 0, 0, GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES), hwnd, NULL,((LPCREATESTRUCT)(lp))->hInstance,NULL);
		DeleteDC(hdc);
		SetTimer(hwnd, 10, 1000, NULL);
	case WM_TIMER:
		InvalidateRect(hwnd, NULL, true);
		break;
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		EndPaint(hwnd, &ps);
		break;
	}
	return DefWindowProc(hwnd, msg, wp, lp);
}

int _stdcall WinMain(HINSTANCE hinst, HINSTANCE hi, PSTR ps, int cmd) {
	MSG msg;
	WNDCLASS win = {
		CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS,proc,NULL,NULL,hinst,LoadIcon(NULL,IDI_APPLICATION),LoadCursor(NULL,IDC_ARROW),(HBRUSH)GetStockObject(WHITE_BRUSH),NULL,L"LAIN"
	};
	RegisterClass(&win);
	HWND hwnd;
	hwnd = CreateWindowEx(NULL, L"LAIN", L"LAIN", WS_CAPTION | WS_VISIBLE | WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinst, NULL);
	while (true) {
		if (PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE)) {
			DispatchMessage(&msg);
			TranslateMessage(&msg);
		}
		else {
		}
	}

}
長文失礼しました。
よろしくお願いします。

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: リソーススクリプトのコンパイルの仕方が分からない

#2

投稿記事 by naohiro19 » 6年前

GetDCで取得したデバイスコンテキストは ReleaseDC で解放しなければなりません。
CreateDCで作成したデバイスコンテキストは DeleteDC で削除しなければなりません。
ウィンドウに描画するには BeginPaintで開始し、 EndPaintで描画を終了しなければなりません。
アプリケーションは、GetDC 関数を使ってデバイスコンテキストのハンドルを取得した場合 DeleteDC 関数を呼び出してそのハンドルを削除してはなりません
代わりに、ReleaseDC 関数を呼び出してそのデバイスコンテキストを解放しなければなりません。

sleep

Re: リソーススクリプトのコンパイルの仕方が分からない

#3

投稿記事 by sleep » 6年前

 
文章からは「できない」ということしか分からなかったため、
Windowを表示するだけのコードに、「アイコンを表示する」という作業を追加する手順を示します。

test.cpp

コード:

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		break;
	}

	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	WNDCLASSEX wc = {};
	wc.cbSize        = sizeof(WNDCLASSEX);
	wc.lpfnWndProc   = WindowProc;
	wc.hInstance     = hinst;
	wc.hIcon         = NULL;
	wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
	wc.lpszClassName = "classname";
	wc.hIconSm       = NULL;

	if (RegisterClassEx(&wc) == 0) return 0;

	HWND hwnd = CreateWindowEx(0, "classname", "title", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinst, NULL);
	if (hwnd == NULL) return 0;

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}
各作業別にファイルは同じディレクトリに配置しています。
 01.コマンドラインの場合(アイコンを文字列で指定)
 02.コマンドラインの場合(アイコンをIDで指定)
 03.VSの場合(アイコンを文字列で指定)
 04.VSの場合(アイコンをIDで指定)


01.コマンドラインの場合(アイコンを文字列で指定)
test.cpp

コード:

HICON hIcon = LoadIcon(hinst, "test_ico");  //19行目に追加

wc.hIcon         = hIcon;  //23行目を上書き
wc.hIconSm       = hIcon;  //27行目を上書き
test.rc

コード:

test_ico ICON "test.ico"
ファイルの配置

コード:

test.cpp
test.ico
test.rc
コマンドプロンプト(コンパイルとリンク)

コード:

rc.exe test.rc
⇒test.res が生成される
 
cl.exe test.res test.cpp kernel32.lib user32.lib gdi32.lib
⇒test.obj、test.exe が生成される
 

02.コマンドラインの場合(アイコンをIDで指定)
resource.h

コード:

#define IDI_ICON 101
test.cpp

コード:

#include "resource.h"  //2行目に追加

HICON hIcon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON));  //19行目に追加

wc.hIcon         = hIcon;  //23行目を上書き
wc.hIconSm       = hIcon;  //27行目を上書き
test.rc

コード:

#include "resource.h"

IDI_ICON ICON "test.ico"
ファイルの配置

コード:

resource.h
test.cpp
test.ico
test.rc
コマンドプロンプト(コンパイルとリンク)

コード:

rc.exe test.rc
⇒test.res が生成される
 
cl.exe test.res test.cpp kernel32.lib user32.lib gdi32.lib
⇒test.obj、test.exe が生成される
 

03.VSの場合(アイコンを文字列で指定)・・・「01.コマンドラインの場合(アイコンを文字列で指定)」と同じファイルを使用
新規で[空のプロジェクト C++]を作成し、vcxprojファイルのあるディレクトリに以下のファイルを配置後、[ソリューションエクスプローラー] の [ソースファイル]、[リソースファイル] に[追加(D)]⇒[既存の項目(G)...]から以下を追加

ファイルの配置

コード:

test.cpp
test.ico
test.rc
ソリューションエクスプローラー

コード:

[ソースファイル]
test.cpp
[リソースファイル]
test.ico
test.rc

04.VSの場合(アイコンをIDで指定)・・・「02.コマンドラインの場合(アイコンをIDで指定)」と同じファイルを使用
新規で[空のプロジェクト C++]を作成し、vcxprojファイルのあるディレクトリに以下のファイルを配置後、[ソリューションエクスプローラー] の [ソースファイル]、[ヘッダーファイル]、[リソースファイル] に[追加(D)]⇒[既存の項目(G)...]から以下を追加

ファイルの配置

コード:

resource.h
test.cpp
test.ico
test.rc
ソリューションエクスプローラー

コード:

[ソースファイル]
test.cpp
[ヘッダーファイル]
resource.h
[リソースファイル]
test.ico
test.rc

hファイル と rcファイルについて
オフトピック
VSの場合、[ソリューションエクスプローラー] の プロジェクト に [追加(D)]⇒[新しい項目(W)...] から [Visual C++]⇒[リソース]⇒[リソースファイル(.rc)] を選択することで「resource.h」、「Resource.rc」という2つのファイルを自動生成することができます。
「resource.h」、「Resource.rc」を [コードの表示(C)] で開き、上記 resource.h、test.rc に記したことと同様のことをファイルに追記すれば同じ結果になります。
 

素人

Re: リソーススクリプトのコンパイルの仕方が分からない

#4

投稿記事 by 素人 » 6年前

お二方、ご教授感謝します。
おかげでプログラムを実行でき、アイコンもちゃんと表示されました。
しかし、初めに申した通りVisual Studioからリソーススクリプトを開くことができません。
開こうとすると、ほかのエディターが開いていると表示され、編集ができません。
メモ帳からなら編集ができるのですが、なぜVisual Studioはリソーススクリプトを開いてくれないのでしょうか?

sleep

Re: リソーススクリプトのコンパイルの仕方が分からない

#5

投稿記事 by sleep » 6年前

素人 さんが書きました: しかし、初めに申した通りVisual Studioからリソーススクリプトを開くことができません。
開こうとすると、ほかのエディターが開いていると表示され、編集ができません。
メモ帳からなら編集ができるのですが、なぜVisual Studioはリソーススクリプトを開いてくれないのでしょうか?
大変申し訳ないのですが、あなたがどのような環境構築を行い、その結果、そのような状況に陥ったとおっしゃっているのか文章から読み取れません。
つまり、問題に陥ったとされる原因を探るためのヒント及び情報があなたの文章には一切ありません。

とりあえず、「ほかのエディターで開かれているため開くことができない」についてはお答えできるかもしれません。

「ファイル」は、ただ閲覧するだけの「読み込み」が目的であれば、複数のアプリケーションで共有して開くことができます。
しかし、編集など「書き込み」が目的であれば、複数のアプリケーションで共有して開くことは基本的に許可しません。
なぜなら、編集が競合するからです。どちらか後に更新した結果のみファイルには反映される(残る)ので同時に開くことは普通許可しません。(先に更新した編集が徒労に終わるので)
おそらく、rcファイルがリソースビューで使用されてるのではありませんか?
VSのメッセージボックスに従い、ドキュメントを閉じてあげれば開けるはずです。

素人

Re: リソーススクリプトのコンパイルの仕方が分からない

#6

投稿記事 by 素人 » 6年前

いじっていたらリソーススクリプトが開けるようになりました。
皆さん。ありがとうございました。
今度質問をする際はより詳細に質問するように注意します。


後学の人のために一応記しておきます。
今開いているソースファイルなどのファイルをすべて閉じるとソーススクリプトは開けるようになります。

返信

“C言語何でも質問掲示板” へ戻る