• ベストアンサー

オプションウィンドウ作成について

オプションウィンドウ作成について質問です。 メインのウィンドウがあって、 オプションをクリックするとオプションウィンドウが 開くというものを作りたいのですが、 どうすれば出来るのでしょうか? ちなみに、実行ファイルは1つにしたいので、 別のプロジェクトは作らないようにしたいです。 開発環境 XP Visual Studio 2005 C、C++

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

 こんばんは。補足頂きました。  ダイアログリソースが無いから開かないのでしょう。リソーススクリプト無しでプロパティシートを使うのは自殺行為の様なものです。  非常に厄介なモノなので、リソーススクリプトは使った方が無難です。 #include<windows.h> #include<tchar.h> #include"resource.h" #pragma comment(lib, "comctl32.lib") static HPROPSHEETPAGE s_hPage[2] = {NULL, NULL}; /*必須ではない //プロパティシートコールバック int CALLBACK PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam) { switch(uMsg) { case PSCB_INITIALIZED : break; case PSCB_PRECREATE : break; } return 0; } //プロパティシートページコールバック UINT CALLBACK PropSheetPageProc(HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp) { const LPNMHDR pnmh = (LPNMHDR)ppsp->lParam; switch(uMsg) { case WM_NOTIFY: if(pnmh->code == PSN_QUERYCANCEL) { } return FALSE; } return FALSE; } */ //プロパティダイアログ const PROPSHEETHEADER InitPropHDR(HWND hParent, HINSTANCE hInst, LPCTSTR pszTitle, HPROPSHEETPAGE phpage[], INT nPages, PFNPROPSHEETCALLBACK pfnCallback = NULL) { PROPSHEETHEADER psh = {sizeof(PROPSHEETHEADER)}; psh.dwFlags = PSH_DEFAULT | PSH_PROPTITLE;// | PSH_MODELESS; psh.dwFlags |= pfnCallback != NULL ? PSH_USECALLBACK : 0; psh.hwndParent = hParent; psh.hInstance = hInst; psh.pfnCallback = pfnCallback;//無くてもよい psh.pszCaption = pszTitle;//プロパティダイアログのタイトル psh.phpage = phpage;//ページハンドル配列の先頭 psh.nPages = nPages;//ページの個数 return psh; } //プロパティシートページ const PROPSHEETPAGE InitPropPage(HINSTANCE hInst, LPCTSTR pszTitle, UINT uiDialogID, UINT uiIconID, DLGPROC pfnDlgProc, LPFNPSPCALLBACK pfnCallback = NULL, LPARAM lParam = 0) { PROPSHEETPAGE psp = {sizeof(PROPSHEETPAGE)}; psp.dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEICONID; psp.dwFlags |= pfnCallback != NULL ? PSP_USECALLBACK : 0; psp.pszTitle = pszTitle;//ページのタイトル psp.pszIcon = MAKEINTRESOURCE(uiIconID);//アイコンのID psp.pszTemplate = MAKEINTRESOURCE(uiDialogID);//ダイアログのID psp.hInstance = hInst; psp.pfnDlgProc = pfnDlgProc;//ダイアログプロシージャ psp.pfnCallback = pfnCallback;//無くてもよい psp.lParam = lParam;//無くてもよい return psp; } //ダイアログ1 INT WINAPI DlgProc1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return 0; } //ダイアログ2 INT WINAPI DlgProc2(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return 0; } //設定ウィンドウを開く static void InitPage(HWND hParent, HPROPSHEETPAGE ahPage[], int count) { HINSTANCE hInstance = ::GetModuleHandle(NULL); LPCTSTR aTitles[2] = {TEXT("Dialog1"), TEXT("Dialog2")}; UINT auiIconID[2] = {0, 0}; UINT auiDlgID[2] = {IDD_DIALOG1, IDD_DIALOG2}; DLGPROC aProc[2] = {::DlgProc1, ::DlgProc2}; for(int i = 0; i < count; ++i) { PROPSHEETPAGE page = ::InitPropPage(hInstance, aTitles[i], auiDlgID[i], auiIconID[i], aProc[i]); ahPage[i] = ::CreatePropertySheetPage(&page); } } //ウィンドウクラス登録 static ATOM Regist(LPCTSTR szClassName, WNDPROC wndProc) { WNDCLASSEX wndclass = {sizeof(wndclass)}; wndclass.hCursor = ::LoadCursor(NULL,IDC_ARROW); wndclass.hIcon = NULL; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szClassName; wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH); wndclass.hInstance = ::GetModuleHandle(NULL); wndclass.style = 0; wndclass.lpfnWndProc = wndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; return ::RegisterClassEx(&wndclass); } //ウィンドウを作成して開く static HWND OpenWindow(LPCTSTR szClassName, LPCTSTR szTitleName, INT w, INT h) { HINSTANCE hInst = ::GetModuleHandle(NULL); HWND hWnd = ::CreateWindowEx(WS_EX_TOOLWINDOW, szClassName, szTitleName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, w, h, NULL, NULL, hInst, NULL); return hWnd; } //開いた static LRESULT OnCreate(HWND hWnd) { return 0; } //xボタン static LRESULT OnClose(HWND hWnd) { ::DestroyWindow(hWnd); return 0; } //ウィンドウが無くなる static LRESULT OnDestroy(HWND hWnd) { ::PostQuitMessage(0); return 0; } //左クリック static LRESULT OnLButtonDown(HWND hWnd) { ::InitPage(hWnd, s_hPage, 2); PROPSHEETHEADER header = ::InitPropHDR(hWnd, ::GetModuleHandle(NULL), TEXT("hello world"), s_hPage, 2); HWND hWndSheet = (HWND)::PropertySheet(&header); //消してはいけない // for(int i = 0; i < 2; ++i) // ::DestroyPropertySheetPage(s_hPage[i]); return 0; } LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: return ::OnCreate(hWnd); case WM_CLOSE: return ::OnClose(hWnd); case WM_DESTROY: return ::OnDestroy(hWnd); case WM_LBUTTONDOWN: return ::OnLButtonDown(hWnd); } return ::DefWindowProc(hWnd, uMsg, wParam, lParam); }; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInstancePrev, LPSTR lpCmdLine, int nShowCmd) { MSG msg; const TCHAR tstrClassName[] = TEXT("test resize frame"); const TCHAR tstrTitleName[] = TEXT("title"); //初期化 ::InitCommonControls(); //ウィンドウクラスの登録 ::Regist(tstrClassName, &::WndProc); //ウィンドウを作成して開く HWND hWnd = ::OpenWindow(tstrClassName, tstrTitleName, 800, 600); //ウィンドウの表示 ::ShowWindow(hWnd, SW_SHOW); //メッセージ回転 while(::GetMessage(&msg, NULL, 0, 0) == TRUE) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } //終了 return msg.wParam; }

noname#154655
質問者

お礼

出来ました。 リソーススクリプトが無かったから出来なかっただけだったんですね。 リソーススクリプト無しでは難しいんですか。 ですけど出来てよかったです。 ソースまで付けて頂きありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

ソースコードを掲載してもらうと早いです。 あとは、丸写しのプログラムを作ってみて動作を確認後に動かないプログラムと差を確認しましょう。動く見本があるんだから、そんなに難しい問題ではないはずですよ。

noname#154655
質問者

お礼

補足欄をすでに使っているのでこちらに書かせていただきます。 紹介して頂いたサイトのプログラムをそのまま使って動かしてみました。 そしたら、同じようにウィンドウは出るのですが、 すぐに消えました。 サイトを見る限りでは、リソースファイルを使うようなのですが、 リソースファイルを作っていないのですが、 それが原因なのでしょうか? ちなみに、サイトのプログラムをそのまま使おうとしたら エラーが出たので、「#pragma comment(lib, "comctl32.lib") 」 を入れました。 リソースファイルは使わないようにしたいのですが、 どうすればいいのでしょうか?

noname#154655
質問者

補足

ソースコード全てだと長いので一部だけ載せます。 不足がありましたら追加で書きます。 LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch (*message) { case WM_CREATE : return (main_window->WindowCreate(&hwnd, &message, &wparam, &lparam)); case WM_NCRBUTTONDOWN : return (main_window->WindowRightClick(&hwnd, &message, &wparam, &lparam)); default : return (main_window->Else(&hwnd, &message, &wparam, &lparam)); } return (DefWindowProc(hwnd, message, wparam, lparam)); } LRESULT MainWindow::WindowCreate(HWND *hwnd, UINT *message, WPARAM *wparam, LPARAM *lparam) { InitCommonControls(); return (0); } LRESULT MainWindow::WindowRightClick(HWND *hwnd, UINT *message, WPARAM *wparam, LPARAM *lparam) { PROPSHEETPAGE psp; PROPSHEETHEADER psh; HPROPSHEETPAGE hPsp[2]; psp.dwSize = sizeof (PROPSHEETPAGE); psp.dwFlags = PSP_DEFAULT; psp.pszIcon = TEXT("PAGEICON"); psp.pszIcon = NULL; psp.hInstance = (HINSTANCE)GetWindowLong(*hwnd , GWL_HINSTANCE); psp.pszTemplate = TEXT("Page1"); psp.pfnDlgProc = (DLGPROC) PageProc1; hPsp[0] = CreatePropertySheetPage(&psp); psp.pszTemplate = TEXT("Page2"); psp.pfnDlgProc = (DLGPROC) PageProc2; hPsp[1] = CreatePropertySheetPage(&psp); psh.dwSize = sizeof (PROPSHEETHEADER); psh.dwFlags = PSH_DEFAULT; psh.hwndParent = *hwnd; psh.hIcon = LoadIcon(NULL , IDI_ASTERISK); psh.pszCaption = "TITLE"; psh.nPages = 2; psh.phpage = hPsp; PropertySheet(&psh); return (0); } LRESULT MainWindow::Else(HWND *hwnd, UINT *message, WPARAM *wparam, LPARAM *lparam) { return (DefWindowProc(*hwnd, *message, *wparam, *lparam)); } BOOL CALLBACK PageProc1(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { return (FALSE); } BOOL CALLBACK PageProc2(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { return (FALSE); } http://wisdom.sakura.ne.jp/system/winapi/common/common12.html​ を参考にしました。 一応、丸写しのプログラムで試してみようと思います。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

 こんばんは。  ページが複数あるウィンドウを開きたいのであれば、ウィンドウプロシージャ内でオプションがクリックされた時に、プロパティシート等を作成すれば良いのではないでしょうか。  http://wisdom.sakura.ne.jp/system/winapi/common/common12.html

noname#154655
質問者

補足

表示はされたのですが、すぐに消えてしまいます。 追加した部分は、「WM_RBUTTONUP」の所に書いてある部分と、 「InitCommonControls();」です。 他に何か追加しないといけないものはあるのでしょうか? それとも、戻り値に問題があるのでしょうか? プロパティシートのコールバック関数に 行くと思うのですが行きませんでした。 どういう原因があるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

MFCならダイアログクラスを新規に追加するだけ。 WindowsAPIなら、このあたりを参考に。 http://www.kumei.ne.jp/c_lang/sdk/sdk_67.htm 少し複雑すぎるかもしれませんが。

noname#154655
質問者

お礼

2回目の回答のお礼の欄が使っているのでこちらに書かせていただきます。 出来ました。 リソーススクリプトを作っていなかったから出来なかっただけでした。 ありがとうございました。

noname#154655
質問者

補足

WindowsAPIを使用しています。 必要そうな所は追加して表示はされたのですが、 すぐに消えてしまいます。 何が原因か調べようとしたのですが分かりませんでした。 何か原因があるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • visual c++環境でのコンソールアプリ実行について。

    visual c++の開発環境を使ってC言語の勉強をしようと思っています。 下記のような手順でデバッグを実行しようと思っているのですが、上手くいかずこまっています。 1 Sample.cを、あらかじめ、/Visual C++ 2005/Projects/Sample/Sample.cのように格納しておく。 2 統合開発環境で、「ファイル」→「新規作成」→「既存のコードからプロジェクトを作成」を選択する。 3 既存のコードからプロジェクトを作成ウインドウが開き、「作成するプロジェクトの種類を入力してください」が「Visual C++」になっているので、そのまま「次へ」をクリックする。 4 プロジェクトの場所とソースファイルの指定ウインドウで、「参照」ボタンを利用して、「プロジェクトファイルの場所」欄に、「・・・/Projects/Sample」と入れ、「プロジェクト名」欄に「Sample」と入力する。「次のフォルダからプロジェクトにファイルを追加します」のチェックをそのままにして、「次へ」をクリックする。 5 プロジェクト設定の指定ウインドウで、「プロジェクトのビルド方法」の「Visual C++を使用する」のチェックをそのままにし、「プロジェクトの種類」を「コンソールアプリケーション」にする。それ以降にはチェックを付けないで、「完了」をクリックする。 6 統合開発環境の「ソリューションエクスプローラ」部から「Sample.c」を選んでダブル・クリックすると、コードが表示される。 7 これでデバッグするとコンソール(Visual c++のDOS窓)が一瞬表示され消えてしまいます。 間違っている所やこのようにしたらなど、意見よろしくお願い時ます。

  • WINDOWS98とWINDOWSの互換性について

    プログラム初心者なのでとても初歩的な質問かもしれないですが、よろしくお願いいたします。 WINDOWSXP上で開発環境はVISUAL STUDIO.NETを利用したプログラミングを行っています。 VC++とC言語を利用してプログラムを書いているのですが、ファイルの新規作成・ファイルを開くダイアログの部分でなかなかうまく動作してくれません。 具体的には、XP上では新規作成・ファイルを開くことができるにもかかわらず、WINDOWS98上では新規作成・ファイルを開くを選択しても何も変化しないといった状況に陥っております(警告もでず、コンパイラも通ります)。 ちなみに、警告が出たDLLファイルは全てWINDOWS98に入れました。 WINDOWS98上で新規作成・ファイルを開くことができるようにするにはどうしたらよいのでしょうか? とても抽象的になってしまったのですが、よろしくおねがいします。

  • FindFirstFileについて教えてください。

    Visual Studio C++ 2010 Expressを利用して、C言語のプログラムを作成しています。 その中でFindFirstFileを使っています。 Visual Studio上でWin32コンソールアプリのプロジェクトを作成して、このプログラムをコンパイルしました。 プロジェクトのプロパティは変更していません。 コンパイルしたものを実行すると戻り値としてINVALID_HANDLE_VALUEが返ってきて、ファイルのリストを取得できませんでした。 一方で、コマンドプロンプト上でMakefileを作成し、同じソースをコンパイルした場合は、ファイルのリストを正常に取得することが出来ます。 従いまして、おそらくプログラムは問題ないと思います。 Visual Studioのプロジェクトで、何かプロパティの設定が必要でしょうか? 実行環境は、Windows7 64-bitです。 何かご存知の方いらっしゃいましたら、教えて頂けますか?

  • .NetでのDirectDrawの使用について

    現在会社のプロジェクトでC++でDirectDrawを使った業務用アプリケーションを開発しようとしているのですが,普段DirectDrawを用いたアプリケーションはwindows APIを使って開発を行なうことが多いと思うのですが,visual studio 2005 +.Netを用いてdirectdrawを使ったアプリケーションを作成することは可能なのでしょうか. お答えいただけると幸いです. 開発環境 visual studio 2005 .NET Framework 2.0 DirectX 7.0

  • Visual Studio 2008 に"開始"メニュがない

     こんにちは、Cを"Microsoft Visual Studio 2008"を使って勉強中の初心者です、宜しくお願いします。  初めて、"Microsoft Visual Studio 2008"を使うのですが、プロジェクトをどのように作成したらよいのでしょうか。  プロジェクトの種類が一杯ありすぎてどこからどれを選択してやればよいのか良く分かりません。  また、それらしきものを作成してやっても、メニュから、実行とか、デバッグなしで開始とかが見当たらないのですが、 これはプロジェクトとか、ファイルとかが正常に作成されていないと言うことでしょうか。 宜しくお願いします。

  • モジュールの開発方法について

    どなたかご教授ください。 現在、 メインウィンドウにて操作した内容(マウスのクリックなど)をメインウィンドウとは別のウィンドウに詳細を表示するといったモジュールの開発が必要となっているのですが、開発初心者であり、どのような開発を行えばよいかわからない状況です。 機能として必要な内容としては、下記のようなものとなります。 ・exeファイルではなくdllファイルなどのモジュール ・開発環境はVisual studio 2010で言語はC# ・メインウィンドウ操作で行った内容をモジュールで開発した別ウィンドウに詳細を表示するため、  GUI付きのモジュール開発が必要  (例:マウスクリックの座標位置をモジュール上で開発したラベルなどに表示させる) つきましては、どなたか開発のためのアドバイスや、参考サイト・書籍がありましたら、ご教授いただければ幸いと存じます。

  • ウィンドウ作成時のメモリ使用量を減らす方法について。

    ウィンドウ作成時のメモリ使用量を減らす方法について。 開発環境 XP SP3 Visual Studio 2005 C/C++、Win32 API ウィンドウ作成時のメモリ使用量を減らしたいと思っているのですが、 減らすことは出来るのでしょうか? http://wisdom.sakura.ne.jp/system/winapi/win32/index.html このサイトに書かれている方法でウィンドウを作成しています。 使用量が約7000kあるのですが、 私が良く使わせてもらっているソフトは約2000kしかないソフトもあるので、 出来ないことはないとは思うのですが、 調べても見つけることが出来ませんでした。 出来ないのでしょうか? もし出来るのであれば教えて頂ければと思います。 もしかしたら、他の言語では出来るのかもしれませんが。

  • MDIでプロジェクトを作成しSDIとして使用する方法

    次の開発環境でWindowsアプリを作成するにあたり、 アプリケーションの種類をSDIとすべきかMDIと すべきか迷っています。  WindowsXP Professional  Visual Studio.NET 2002  VC++ MFC そこで、質問なのですがアプリケーションの種類を MDIとしてプロジェクトを作成した後にSDIと同じ動き となるようにコードを書く(変更する)ことがで きますか。 例えば、プロジェクトを起動させると、常に1つの ドキュメントがメインウィンドウ全体に表示される。 ご存じの方すいませんがよろしくお願いします。

  • Visual Studio 2008コマンドプロンプトのinclude

    Visual Studio 2008コマンドプロンプトのincludeファイルのパス設定について、教えてください。 C言語で書かれたOpencvのサンプルコード「ヒストグラムの描画」を実行するとエラーが出ます。 http://opencv.jp/sample/histogram.html#hist 「fatal error C1083: includeファイルを開けません。'cv.h':No such file or directory.」 画像を表示する、という別のコードはVisual Studioで実行できましたので、Visual Studioの環境設定は正常ではないかと思います。 環境変数のパスの設定や(マイコンピュータ→システムのプロパティ→詳細→環境変数)、Visual Studioでのライブラリやインクルードファイルの設定も完了しており(ツール→オプション→プロジェクトおよびソリューション)、Visual Studio 2008のIDE環境でビルトすると、別のサンプルコードは実行できました。このふたつめのサンプルコードは一瞬コマンド画面が表示されて、何も結果が出ずに消えてしまいます。 なぜでしょうか? D/Lし直したり、設定しなおしましたが、事象は変わらずとても困っています。 もし何かお心当たりがあればぜひ教えてください。 どうぞ宜しくお願い致します。

  • プロジェクトの新規作成

    質問が重なり大変恐縮です。 VisualStudio2005を購入したのですが、 プロジェクトの新規作成が出来ません。 下記の手順踏んで、プロジェクト名を記入後、 OKボタンが押せる状態になりません。。 開発ツールを使用するのは初めてなのですが、 全く別のソフトで、普通に新規作成や保存、など 普通に考えていましたが、なんかとても有り得ない状況でつまずいてます。。 ヘルプを参照すると下記の手順なのですが。 1[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。 2[新しいプロジェクト] ダイアログ ボックスが表示されます。 3[プロジェクトの種類] ペインで、[Visual C++ プロジェクト] フォルダを選択します。[テンプレート] ペインに C++ のすべての種類のプロジェクト アイコンが表示されます。 4[テンプレート] ペインでアイコンを選択して、プロジェクトの種類を指定します。両方のペインの下に、作成するプロジェクトの種類を示すメッセージが表示されます。 5プロジェクトのプロパティを指定するか、またはこの手順を省略して Visual Studio の既定のプロジェクトのプロパティを使用します。詳細については、「コンテナとしてのプロジェクト」を参照してください。 6[OK] をクリックすると、プロジェクトの種類に対応したウィザードが開きます。 OKを押して雛形のテンプレート(例えばMFCなど)が開くイメージでしたが。。 オブジェクト名に拡張子をつけたり色々とやってみましたが、どうしてもプロジェクト新規作成が出来ません。 初めて使う際は特別な手順が別途必要なのでしょうか?