• ベストアンサー
  • 困ってます

ウィンドウの背景に画像を配置する

VS2008(C++)でVS2008ライクなFMCアプリケーションを作成しています。 アプリケーションウィザードのアプリケーション種類はマルチドキュメントです。 起動直後はドキュメントが開いていないため、メインウィンドウの真ん中が何かさみしいので会社のロゴなどを配置してみたいのですが、方法がわかりません。 ご存じの方がいましたら、アドバイスをお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数645
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.2
  • Wr5
  • ベストアンサー率53% (2177/4070)

>はじめに紹介いただいたページは私も見ていましたが、サンプルコードにたどり着く方法がわかりませんでした。 どのクラスの、どのメッセージハンドラに入れればいいのか…って程度かと思われますが…。 MSのサイトの方ので背景色の変更ができる。 かと思われます。 # 記述されている手順に従っていけば背景色が変更できるかと。 以下、VS2008は持っていない(EEのみのためMFCが使えない)のでVS2005で… # VS2005とVS2008で大きな違いはない…でしょう。たぶん。 >1.ClassWizard でジェネリック CWnd クラスを作成します。 クラスビュー内のTreeViewの先頭ノード(プロジェクト名で表示されているノード)で右クリック、 [追加]-[クラス]と進んで、テンプレートからMFCクラスを選択して[追加]ボタンをクリック。 基本クラスはCWndのままクラス名にCNewClientWndを指定して[完了]ボタンをクリック。 >2.CMainFrame クラスに手順 1、CWnd クラスの型を使用してメンバー変数を追加します。 クラスビュー内のCMainFrameで右クリック、 [追加]-[変数の追加]と進んで、変数の種類に1.で追加したクラス名を指定、変数名にm_wndNewClientを指定して[完了]ボタンをクリック。 >3.CMainFrame の OnCreate メンバー関数の呼び出しの後に、基本クラスのCMDIFrameWnd::OnCreate()、SubclassWindow() への呼び出しを追加します。 ソリューションエクスプローラからMainFrame.cppを開いて、OnCreate()の最後に掲示されているコードを追加。 >4.ウィンドウをサブクラス化するたびに、GetSuperWndProcAddr() メンバー関数は、CWnd の記憶域、元のウィンドウ プロシージャのアドレスを提供するためにオーバーライドする必要があります。そのためには、手順 1 で作成した CWnd クラスの実装に次の関数を追加します。 今回はサブクラス化しないので無視。 >5.上に示したコードを使用して、ジェネリックの CWnd クラスに WM_ERASEBKGND メッセージをオーバーライドします。 クラスビュー内のCNewClientWndを選択して右クリック、[プロパティ]を選択してプロパティを表示。 表示されたプロパティのツールバーから「メッセージ」を選択すると、下にメッセージがずらずら出てきているのでWM_ERASEBKGNDを選択して右のコンボボックスのプルダウンボタン(下向きの三角)をクリック。 「<追加> OnEraseBkgnd」を選択してクリックしてメッセージハンドラを追加。 該当ハンドラの編集画面になるので、 CNewClientWnd::OnEraseBkgnd()に掲示されているサンプルコードのBOOL CSampleView::OnEraseBkgnd(CDC* pDC)の中身をコピペ。 # 元々あった return CWnd::OnEraseBkgnd(pDC); は削除。 で、ビルドして実行してみると背景色が変わるかと。 CNewClientWnd::OnEraseBkgnd()内でpDCに対して描画するコードを追加すれば良いかと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

詳しい説明、ありがとうございます。 さっそく明日試してみます。

関連するQ&A

  • MFCのマルチドキュメントで

    VisualC++.net MFCのウィザードでマルチドキュメントのアプリケーションを作成しました。 起動時はウィンドウが1つだけ開いているのですが、起動時に複数のウィンドウを起ち上げるようにするには、どの部分を変更したらよいのでしょうか? ご存知の方おしえてください。

  • ウィンドウについて

    いつもお世話になっております。 VS2005でC++を用いてWindowsアプリケーションの作成をしています。 子ウィンドウを親ウィンドウ内から出すことはできるのでしょうか。 できなければ、実行して最初に出てくるウィンドウ内のメニューを クリックしてまた新たなウィンドウを表示させたいのですが、 どのようにしたらできるのでしょうか。 Webで調べてみたのですが良い情報が得られなかったので質問させていただきます。 調べ不足でしたらごめんなさい。 ご教授お願いいたします。

  • ウィンドウ位置保存ツール

    起動するたびに子ウィンドウの配置が初期化されるアプリケーションに対して、ウィンドウ位置を保存して、そのアプリケーションを起動後に自動で子ウィンドウ配置を変えるようなフリーソフト等をご存知ないでしょうか?

その他の回答 (1)

  • 回答No.1
  • Wr5
  • ベストアンサー率53% (2177/4070)

回答ありませんね…… 「MFC MDI 背景 描画」で検索すると… http://www.mermaid-tavern.com/tomato/pc1/mfc3_0322p.html とか http://support.microsoft.com/kb/103786/ja とか見つかるかと。

共感・感謝の気持ちを伝えよう!

質問者からの補足

貴重なご意見、ありがとうございます。 はじめに紹介いただいたページは私も見ていましたが、サンプルコードにたどり着く方法がわかりませんでした。 このページにサンプルコードはあるのでしょうか。

関連するQ&A

  • VisualC++.net MFCのウィザードで・・・

    当方初心者です。 VisualC++.net MFCのウィザードでシングルドキュメントで作成したアプリケーションをマルチドキュメントに変更するには、どの部分を変更したらよいのでしょうか? はじめからMFCを使って作り直さない方法をご存知の方おしえてください。

  • MDIの子ウィンドウをスクリーンキャプチャ

    最近は少なくなりましたが、昔のOfficeなどMDI(マルチドキュメントインターフェース)のアプリケーションがあります。親ウィンドウの中に複数の子ウィンドウが表示されるインターフェースです。 このようなアプリで、子ウィンドウのみを簡単にキャプチャ出来るツールはないでしょうか?ALT+PrintScreenだと親ウィンドウを含むアプリケーション全体がキャプチャされます。 もちろん矩形指定でキャプチャすることは可能ですが、もっと手軽に出来ないかと。

  • ディスプレイ外のウィンドウ移動

    Windows XP ノートで自宅でデュアルディスプレイを使用していますが、現在移動先です。 あるアプリケーションをいつもセカンドモニタ上で使用していたのですが、ノートだけの画面で起動すると、メインウィンドウは画面上に表示されるのですが、アプリの子ウィンドウが表示されません。 おそらく、セカンドモニタ上の座標に配置されているのだと思うのですが、カーソルをディスプレイ外に移動できないため、表示される場所までウィンドウを移動できません。 子ウィンドウのため、タスクバーに格納することもできません。 ディスプレイ外の子ウィンドウを、現在のウィンドウ上に表示できるようにする方法はないでしょうか?

  • ウィンドウ起動時のカーソル位置について

    お世話になります。 OS:Windows Vista 言語:Visual C++ 2005 で開発しています。 TabControlを配置し、その中にTextBoxを配置した ウィンドウを開きます。 その時、最初に位置付くカーソルが Tabではなく、TabControl内のTextBoxにすることは可能でしょうか? TabIndexの順番をTextBox=0 TabControl=1にしてウィンドウを 起動しても最初のカーソル位置はTabControlに 位置付けられてしまいます。 以上、よろしくお願い致します。

  • [VB6.0]フォーム上に配置したコントロールのフォントサイズが変えられない

    はじめまして。 VB6.0のアプリケーションウィザードを使用してフォームをいくつか作りました。 ウィザード終了後、これらのフォーム上に配置されたラベルなどのfontプロパティ を操作してフォントサイズを変えたいのです。フォームのデザイン上はフォントサ イズを変えることが出来るのですが、実行すると、"コントロールのfontプロパティ のfontサイズ"ではなく、"フォームのfontプロパティのfontサイズ"で統一されて しまいます。つまり、コントロール毎の値は無視されて、フォームの値で統一され てしまうのです。 exe形式にコンパイルしても同じでした。どこかしらのプロパティをいじるのだと 思うのですが、どなたかわかる方はいらっしゃいますか? よろしくお願いします。 (環境)Windows98SE+VB6.0+SP5.0

  • MFCアプリケーションでアイコンが正しく表示されない

    Viisual C++ 6.0 を使ってMFCのSDIアプリケーションを作っているのですが アプリケーションを起動したときにメインウィンドウの左上に表示される はずの小さいアイコンが正しく表示されなくて困っています。 (添付画像に示したように白い四角形が表示されます) なお、アイコンはVisual C++のリソースエディタで作っており、 エクスプローラから実行ファイルを閲覧するとアイコンは正しく表示されます。 (添付画像を参照)なぜメインウィンドウだけ正しく表示されないのでしょう? どうすればメインウィンドウの左上に正しいアイコンが表示されるでしょうか? AppWizardで新しくSDIアプリケーションのプロジェクトを作り直せば、 正しく表示されるようなのですが、これまで作ったソースを丸ごと移動させる のは手間がかかりそうなのでできればそれはしたくないのです。

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

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

  • ツールバーから選択でウィンドウ生成

    下記URLのサンプルコード http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MDI1.html&#8203; を参考に、VC++2005(MFC)にてMDIアプリケーションを作成しています。 サンプルを参照にソースコードを記述し、プログラム起動時に MDIウィンドウを生成することは出来ましたが、 これを『ツールバーからメニューを選択し、ウィンドウを出す』ように 改良したいのです。 下記に起動時にMDIウィンドウを生成するソースコードを記載します。 「☆☆☆追加☆☆☆」で囲まれた箇所が、 上記URL解説を元に自分で追加した箇所で、それ以外はスケルトンです。 解決策ご存知の方おられましたら、お手数ですがご教授お願い致します。 【呼び出し元クラス:CMDITest1App】 BOOL CMDITest1App::InitInstance(){ INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); SetRegistryKey(_T("アプリケーション ウィザードで生成されたローカル アプリケーション")); LoadStdProfileSettings(4); // 標準の INI ファイルのオプションをロードします (MRU を含む) // アプリケーション用のドキュメント テンプレートを登録します。ドキュメント テンプレート // はドキュメント、フレーム ウィンドウとビューを結合するために機能します。 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MDITest1TYPE, RUNTIME_CLASS(CMDITest1Doc), RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム RUNTIME_CLASS(CMDITest1View)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); //☆☆☆追加☆☆☆ CMultiDocTemplate* pDocTemplate2; pDocTemplate2 = new CMultiDocTemplate(IDR_MDITest1TYPE2, RUNTIME_CLASS(CMDITest1Doc), RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム RUNTIME_CLASS(CMDITest1View2)); if (!pDocTemplate2) return FALSE; AddDocTemplate(pDocTemplate2); //☆☆☆追加☆☆☆ // メイン MDI フレーム ウィンドウを作成します。 CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME)) { delete pMainFrame; return FALSE; } m_pMainWnd = pMainFrame; // 接尾辞が存在する場合にのみ DragAcceptFiles を呼び出します。 // MDI アプリケーションでは、この呼び出しは、m_pMainWnd を設定した直後に発生しなければなりません。 // DDE、file open など標準のシェル コマンドのコマンド ラインを解析します。 CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // コマンド ラインで指定されたディスパッチ コマンドです。アプリケーションが // /RegServer、/Register、/Unregserver または /Unregister で起動された場合、False を返します。 if (!ProcessShellCommand(cmdInfo)) return FALSE; // メイン ウィンドウが初期化されたので、表示と更新を行います。 pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); //☆☆☆追加☆☆☆ pMainFrame->OpenView(pDocTemplate2); //☆☆☆追加☆☆☆ return TRUE; } 【呼び出し先クラス:CMainFrame】 //☆☆☆追加☆☆☆ void CMainFrame::OpenView(CDocTemplate *pTemplate){ CDocument* pDoc = MDIGetActive()->GetActiveDocument(); CMDIChildWnd* pNewFrame = (CMDIChildWnd*)pTemplate->CreateNewFrame(pDoc, NULL); if( pNewFrame ) pTemplate->InitialUpdateFrame(pNewFrame, pDoc); } //☆☆☆追加☆☆☆

  • ドラッグ中かどうかを取得したいのですが

    C++でランチャーを作っているのですが、 画面右端に1ピクセルだけ表示させているウィンドウに カーソルが移動するとニョキッとウィンドウが出てくるランチャーとかよくありますよね? で、そこまではいいのですが、実際に起動させたいアプリケーションなどをドラッグ&ドロップで設定したいのですが、 ドラッグ中だとWM_MOUSEMOVEイベントがこないみたいで、ウィンドウが出てきてくれません・・・ どうしたらドラッグ中でもそれを認識することができるのでしょうか? どなたか教えていただけると助かります。

  • HTLMヘルプ オプション項目のカスタマイズ

    HTMLヘルプのオプションのメニューについて質問させていただきます。 Visual Studio .NET にて、 Visual C++ プロジェクトの作成、 MFCアプリケーションウィザード、 高度な機能を選択し、コンテキストヘルプでHTMLヘルプを作成しました。 無事HTMLヘルプは作成する事がでたのですが、 ヘルプの オプションメニューの 「ホーム」 「中止」 「更新」 「インターネットオプション」 を非アクティブにする必要がでてきました。 (非アクティブ・もしくは項目より削除でも可) 色々と調べてみたところ、hhpファイル内の [WINDOWS]セクションが関与しているのではないか、 というところまではたどりついたのですが、 この[WINDOWS]へ実際どのように記載したらよいかが わかりません。 どなたかこの[WINDOWS]に記載する項目の設定方法について ご存じの方がいらっしゃいましたら教えてください。

    • ベストアンサー
    • HTML