vc++2010でリソースファイルを作成したい

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

vc++2010でリソースファイルを作成したい

#1

投稿記事 by s707 » 7年前

開発環境はvc++ 2010 expressです。

猫でもわかるWindowsプログラミング第2版を
読んでいます。

リソースファイルを作成し
ダイアログボックスをいじろうと
しているのですが、408Pの手順では
作成出来なくなっています。

ご助力の程、よろしくお願いします。

アバター
沖 滉均
記事: 237
登録日時: 9年前
住所: K県F市

Re: vc++2010でリソースファイルを作成したい

#2

投稿記事 by 沖 滉均 » 7年前

Expressにはリソースエディタはついていませんのでrcファイルを直接編集するか
私は使ったことがありませんが、フリーソフトのResEditなどを使用する必要があります。

一応リンクを貼っておきますね。
ResEdit
http://www.forest.impress.co.jp/lib/std ... sedit.html
There is no royal road to learning.
codeタグで指定できる言語
画像

s707

Re: vc++2010でリソースファイルを作成したい

#3

投稿記事 by s707 » 7年前

沖 滉均様、ご返信ありがとうございます。
ResEditを使用してリソースファイルは作成出来ました。

現在デスクトップクロックを作成中です。

加筆修正を加えて右クリックでダイアログボックスを
表示させたいのですが、うまくいきません。

インスタンスハンドルがうまくいってないのでは
ないかと思っていますが。

コード:

//resource.h

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define IDD_DIALOG1                             101
#define IDC_EDIT1                               1002
#define IDC_EDIT2                               1003



//sample.rc

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"




//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG1 DIALOG 0, 0, 186, 95
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "Ms Shell Dlg"
{
    DEFPUSHBUTTON   "OK", IDOK, 33, 77, 50, 14
    PUSHBUTTON      "Cancel", IDCANCEL, 115, 77, 50, 14
    EDITTEXT        IDC_EDIT1, 5, 10, 16, 14, ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2, 31, 10, 16, 14, ES_AUTOHSCROLL
    LTEXT           "Static", IDC_STATIC, 63, 40, 44, 15, SS_LEFT
}


//main.cpp
#include <windows.h>
#include "DxLib.h"
#include "dayData.h"
#include "draw_clock.h"
#include "Setup.h"
#include "resource.h"

#define APP_NAME TEXT("clock")
#define chara_width 64

void jihou(struct dayData* day);
void plan(struct dayData* day);
void Time(struct dayData* day);
void date(struct dayData* day);
void version(struct dayData* day);
int  title(int,struct dayData* day);


HINSTANCE hInst;

BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp){
	switch(msg){
	case WM_COMMAND:
		switch(LOWORD(wp) ){
		case IDOK:
			EndDialog(hDlg,IDOK);
			return TRUE;
		case IDCANCEL:
			EndDialog(hDlg,IDCANCEL);
			return TRUE;
		}
		return FALSE;
	}
	return FALSE;
}

LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	static int top = 0;

	switch(uMsg) {
	case WM_MOVING:
		{		
			LPRECT p = (LPRECT)lParam;
			top = p -> top;
			break;
		}
	case WM_WINDOWPOSCHANGING:		
		{
			WINDOWPOS* p = (WINDOWPOS*)lParam;
			p -> y = top;
			break;
		}
	case WM_NCHITTEST:
		return HTCAPTION;
    case WM_RBUTTONDOWN:
		DialogBox( hInst, "IDD_DIALOG1", hWnd, (DLGPROC)MyDlgProc );
		break;
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	hInst = hInstance;

	struct dayData day[450];
	// マウス状態管理用変数
	int nClickNow = 0 , nClickPrev = 0;
	int nClickNow_R = 0 , nClickPrev_R = 0;
	int nClickR_Count = 0;

	int status = 0,temp = 0;
	bool menu_flg = false;
	
	// 画面モードの変更
	SetGraphMode( 1680 , 1050 , 32 ) ;//パソコンの解像度に合わせる

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );

	SetUseBackBufferTransColorFlag( TRUE );// ウインドウの透過色モードON
	SetWindowStyleMode(0);
	SetAlwaysRunFlag( TRUE );

	SetHookWinProc( WindowProc );
	if ( DxLib_Init( ) == -1 ) return -1;

	SetDrawScreen(DX_SCREEN_BACK);

	Load_Graph();
	Setup_load(day);//設定を読み込む
	plan(day);//予定を音声再生する	

	int NewMouse = 0, OldMouse = GetMouseInput();
	while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {		
		//処理を省略
	}
	DxLib_End( );
	return 0;
}

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: vc++2010でリソースファイルを作成したい

#4

投稿記事 by ISLe » 7年前

#未確認ですが…

DialogBox( hInst, "IDD_DIALOG1", hWnd, (DLGPROC)MyDlgProc );

DialogBox( hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, (DLGPROC)MyDlgProc );
じゃないでしょうか。

アバター
沖 滉均
記事: 237
登録日時: 9年前
住所: K県F市

Re: vc++2010でリソースファイルを作成したい

#5

投稿記事 by 沖 滉均 » 7年前

DialogBox( hInst, "IDD_DIALOG1", hWnd, (DLGPROC)MyDlgProc );
IDD_DIALOG1は#defineで数値で定義されているだけで文字列を指定しても探してくることはできません。

解決方法は既にISLeさんが書かれている通りです。
オフトピック
詳細な解説は…私にはできません…
どなたか詳しい方がいましたらお願いいたしますm(__)m
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: vc++2010でリソースファイルを作成したい

#6

投稿記事 by softya(ソフト屋) » 7年前

一応文字列で指定できるはずです。日頃VisualStudioのMFCでウィザード任せの人なので絶対大丈夫だとは言い切れませんが。

「第13章」 猫winより。
http://www.kumei.ne.jp/c_lang/sdk/sdk_13.htm
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
沖 滉均
記事: 237
登録日時: 9年前
住所: K県F市

Re: vc++2010でリソースファイルを作成したい

#7

投稿記事 by 沖 滉均 » 7年前

softya(ソフト屋) さんが書きました:一応文字列で指定できるはずです。日頃VisualStudioのMFCでウィザード任せの人なので絶対大丈夫だとは言い切れませんが。

「第13章」 猫winより。
http://www.kumei.ne.jp/c_lang/sdk/sdk_13.htm
上記のページといくつかテキスト指定しているサイトを参照しつつ色々試してみたら、なぜかresource.hからIDD_DIALOG1の定義をコメントアウト(削除)したらテキストで指定しても表示されましたね。
内部的に何が行われているのかはさっぱりわかりませんが…

今回の解決方法はISLeさんが書かれている方法か、
resource.hから#define IDD_DIALOG1 101の定義を削除することで対応できそうです

どちらを選ぶかは…お任せ致します。
オフトピック
と、ここまで書いて思ったのだが*.rcの中も#defineでの置き換えが有効になっているのかな?
#define IDD_DIALOG1 101によって
IDD_DIALOG1 DIALOG 0, 0, 186, 95
     ↓
101 DIALOG 0, 0, 186, 95
となって…と考えて"101"にしてみたけどダメ…
リソーススクリプトの扱いがどうなっているのか気になる…
[追記]
置き換わっているのは置き換わっているらしい…
リソーススクリプトの仕様を確認する限り
nameID DIALOG x, y, width, height [optional-statements] {control-statement . . . }
nameID
Unique name or a unique 16-bit unsigned integer value that identifies the dialog box.
こう書かれているので16-bit unsigned intかユニークな名前ってことだし…
ただ、その置き換えが発生しない場合にはUnique name = textという扱いになるのかな?
There is no royal road to learning.
codeタグで指定できる言語
画像

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: vc++2010でリソースファイルを作成したい

#8

投稿記事 by ISLe » 7年前

nameID DIALOG ~
に対して
#resource.hのマクロ置換が行われて、
コンパイル時にnameIDが(アルゴリズムは不明ですが)整数値に変換できないとき文字列とみなされるようです。

ResEditではリソースペインのリソースアイテムの右クリックメニューで『名前の変更』を選ぶと連番か名前のどちらか切り替えることができます。
名前を選ぶとresource.hの置換マクロが生成されません。
ただし名前を選んでも整数値に変換できる名前だとコンパイル時に数値とみなされてしまいます。

VisualStudioのリソースエディタではリソースIDをダブルクォーテーションで囲んで入力すると文字列とみなされたと記憶しています。
こちらもresource.hの置換マクロが生成されないだけなので整数値に変換できる名前だと数値とみなされるはずです。


IDD_DIALOG1という文字列を使うと、ダイアログリソースを追加したときにカブる可能性があるので気を付けてください。

数値に変換される名前で数値を直接設定できるわけですが、保守性を落とすのですべきではないと思います。

s707

Re: vc++2010でリソースファイルを作成したい

#9

投稿記事 by s707 » 7年前

ISLe様、softya(ソフト屋)様もご返信ありがとうございます。

無事に解決しました。
今回もありがとうございます。

閉鎖

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