WinAPIでタブ付きのウィンドウを作成

このQ&Aのポイント
  • 現在WinAPI(C++)でタブ付きのウィンドウを作成しようと思っているのですが、タブコントロールとしてCreateWindowEX関数+WC_TABCONTROLで作成するしかないのでしょうか?
  • タブで切り替えれる+画像の描画可能+サイズの変更可能なウィンドウを作成したいです。
  • また、タブのデザインも変更したいです。Visualやイラストレータのようなドラッグでウィンドウを移動させてタブから切り離し+再度タブ化する機能も実現したいです。開発環境はMicrosoft Visual C++ 2010 Expressです。
回答を見る
  • ベストアンサー

WinAPIでタブ付きのウィンドウを作成

現在WinAPI(C++)でタブ付きのウィンドウを作成しようと思っているのですが、 タブコントロールとしてCreateWindowEX関数+WC_TABCONTROLで作成するしかないのでしょうか? 認識不足なら申し訳ありませんが、これはダイアログボックス内にタブを作成するものでしょうか? 行いたいのは、タブで切り替えれる+画像の描画可能+サイズの変更可能なウィンドウなのですが、 また、タブのデザインも変更できればいいんですが・・・ Visualやイラストレータのようなドラッグでウィンドウを移動させてタブから切り離し+ 再度タブ化するのは、どのように実現しているのでしょうか 開発環境はMicrosoft Visual C++ 2010 Expressです。 状況説明不足で申し訳ありませんが、ご教示お願いします。

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

  • ベストアンサー
  • sygh
  • ベストアンサー率76% (42/55)
回答No.2

タブのデザイン変更はオーナードローあたりに頼ることになるかと思いますが、APIオンリー、Express Editionでドッキング ウィンドウを実現するのは至難の技だと思います。 Visual Studioのスマート ドッキング ウィンドウは、BCGSoft製のMFC拡張ライブラリを使って作られているようです。 OfficeのリボンUIも同様です。 http://www.bcgsoft.com/ BCGSoftのライブラリを逆輸入する形で、Visual Studio 2008 SP1のStandard Edition以上、それとVisual Studio 2010のProfessional Edition以上には、MFC Feature Packが導入されて、スマート ドッキング ウィンドウやリボンUIその他がMFCアプリで使えるようになっています。 有料版にはMFCのソースコードが付いているので、それを参考にしてAPIに落としていくのもありかとは思いますが、MFCを完全に理解していないと読むのが困難な上に、かなりスパゲッティなのでお勧めしません。 Adobeのほうは詳しくは分かりませんが、PhotoshopやIllustratorのスマート ドッキング ウィンドウは、WindowsでもMacでも同じ仕様を確保するため、おそらくQtライブラリ+Adobe独自のクロス プラットフォーム ライブラリで実現されていると思います。 .NET Framework(C++/CLI)を使うのであれば、スマート ドッキング ウィンドウを実現するためのいくつかの無料ライブラリが存在しますが、VC++ 2010ではC++/CLIのインテリセンスが効かないし、そもそもC++/CLI自体GUIアプリ開発には向いていない特殊な言語なので、お勧めしません。 http://dobon.net/vb/dotnet/links/dockingwindow.html

scanfprintf
質問者

お礼

お礼が遅くなり申し訳ございません。 詳細まで記入いただきありがとうございました。 やはりAPIで実現するのは難しいんですね。

その他の回答 (1)

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

>現在WinAPI(C++)でタブ付きのウィンドウを作成しようと思っているのですが、 >タブコントロールとしてCreateWindowEX関数+WC_TABCONTROLで作成するしかないのでしょうか? >認識不足なら申し訳ありませんが、これはダイアログボックス内にタブを作成するものでしょうか? メインウィンドウのWM_CREATEで、クライアント領域内にタブコントロールをCreateWindowEx()…ですかね。 # さらに、タブの中身をCreateWindow()…かと。 http://wisdom.sakura.ne.jp/system/winapi/common/common11.html http://www.kumei.ne.jp/c_lang/sdk/sdk_69.htm ダイアログっぽく見えますがSDI…ですな。 >Visualやイラストレータのようなドラッグでウィンドウを移動させてタブから切り離し+ >再度タブ化するのは、どのように実現しているのでしょうか いろいろと手間が掛かっているようです。 ExpressEditionでなければMFCである程度できる…っぽいですけど。 「ドッキングウィンドウ」辺りで検索…でしょうかね。 フローティングウィンドウはまた違う…かな?

scanfprintf
質問者

お礼

早速のご回答ありがとうございました。 教えていただいたURLは質問前にも確認していましたが、 やはりそうなんですね。タブ付きウィンドウとして作成ではなく、 タブ自体がひとつのウィンドウなんですよね。 ドッキングウィンドウというんですね。 ありがとうございます。

関連するQ&A

  • ボタンの色(WINAPI)

    環境:Windows XP Home、Visual C++ WINAPIにてボタンの色を変更したいと思っております。 ですので、オーナードローで作成しようと思ったのですが、 色だけ変更したいだけなのに文字列やその他といった、 全てを自分で書かなくちゃいけなくなりました。 他に簡単に出来る方法は無いのでしょうか? 以下に一応、したい事を記述します。 ボタンをクリックした時に、 ChooseColorダイアログを表示して、選択させる。 もしOKでダイアログを閉じた場合、 ボタンはそこで選択した色に変更させる。 よろしくお願いします。

  • タブコントロールのタブ選択について

    環境  Visual Studio 2003 C# タブコントロールのタブ選択について質問があります。 Windows Application のForm にタブコントロールを配置。 タブ1からタブ2に選択された時点でメッセージを表示し「はい」であれば、タブ2へ、「いいえ」を選択した場合は、タブ2に遷移せずタブ1のままという動きを実装したいのですが方法がわかりません。 選択前のタブインデックスを記憶して、「いいえ」を選択した場合はそのタブインデックスを選択状態にすれば可能かと思いますが、一旦タブ2に遷移しタブ1に戻る形となり見た目的に良くないような気がします。 Visual Studio 2005 では Selecting イベントで e.Cancel = true; という方法でも一旦タブ2に遷移してしまいます。 どなたか、教えてください。 宜しくお願いします。

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

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

  • WINAPI 他のウインドウを重ねると画像やテキストが消える

    C++とWINAPIで、ウインドウを作成し、テキストや画像を表示しています。 このウインドウに他のウインドウを重ねて、再度、このウインドウを表示すると画像やテキストが消えてしまいます。 case WM_PAINT: BitBlt( hbtn0DC, 0, 0, 40, 40, hbtn0bmpDC, 0, 0, SRCCOPY ); return 0; 再描画するタイミングで表示するようにしています。 他のウインドウが被っても消えないようにする方法を教えてください。 もしくは、 他のウインドウが被っても画像が消えないようにする処理を説明しているページをどこかで見たような気がするのですが、見つかりません。 ご存知でしたら教えてください。

  • 非アクティブウィンドウの作成

    非アクティブウィンドウの作成 Visual C++でプログラミングをしている際に行き詰ったので質問させてください。 現在「最前面に表示されるがクリックされてもアクティブ化しないプログラム」を作成したいのですが、最前面に表示されるところまでは出来てもクリックするとアクティブ化してしまいます。 http://okwave.jp/qa/q1532983.html http://www.arcpit.co.jp/winapi/api_02/ap020214.htm http://d.hatena.ne.jp/kent013/20080304/1204640570 などを参考にして試してみたのですが、ウィンドウメッセージからの操作はうまく適用することができなかったのか通常通りアクティブ化してしまいました。 乱文になってしまいましたが、ご回答いただけるとありがたいです。

  • VB.Net Tabコントロール中のすべてのタブで

    お世話になります。 Visual Studio 2012 を Windows 7 64Bit  にて使用しております。 Tabコントロールの全てのタブのタグ(Tag) に値を設定しており、変数と各タブページに格納してあるTag の値が一致したら、そのタブページのインデックスを取得できればと思っておりますが、 For Each Next 文にてそれをどう実現すればいいか困っております。 以下の文は プロパティ的にはめちゃくちゃですが、ニュアンスとして、こんな感じで実現できればと思っております。 指定タブコントロールの全てのタブの中でTagの値が 123 のタブがあったら、そのタブインデックスを取得する     Dim Flg As Integer = 0     For Each TabPage In Me.TabControl1.TabPages         If TabPage.Tag = 123 Then             Flg = TabPage.Index()             Exit For         End If     Next 何卒よろしくお願いいたします。

  • VS2013でTabControlが無い

    VisualStudio2013でMFCを使ってWindowsアプリケーションを開発しています ダイアログの中に「タブコントロール」を入れようと思ったのですが 「ツールボックス」内の「ダイアログエディター」の中にタブコントロールがありません。 とりあえず、別バージョンの時に作成したリソースから「タブコントロール」をコピペ することができ、コンパイルも通るのでプロジェクトの設定では無いと思います。 なんとか、「ダイアログエディター」内に表示させる方法はないでしょうか? おわかりになられる方がいらっしゃいましたら、よろしくお願いします。 補足: 「ツールボックス アイテムの選択」はいじってみました、「TabControl」にチェックがついている のですが、表示されません。

  • タブコントロール上のピクチャーコントロールへの描画

    お世話になっております。 VC2005を使用しております。 SDIベースです。 ダイアログを作成し、その上にタブコントロール(2ページ)を作成しました。 タブコントロールの1ページ目にピクチャーコントロールを配置し、ピクチャーコントロール上に描画を行おうと思うのですが、正常に動作しません。 OnPaintの中で描画を行っているのですがだめのようです。 タブコントロール外に、ピクチャーコントロールを配置すると描画する事ができます。 どのような、タイミングで描画を行えばよいのでしょうか? 教えてください。 よろしくお願いします。

  • ペイント系ソフトのレイヤーのようなGUIを作りたい

    既出かもしれませんが、質問させて下さい。 質問タイトルの通り、PhotoShopやGIMPのような レイヤーの機能を持つウィンドウ(ダイアログボックス?)や、ツールボックス を作りたいと考えています。 今、自分が用意している開発環境は    OS:Windows7  ソフトウェア開発スイート:Visual Studio 2010 C++  API:WinAPI  言語:C++ ホームページで「猫でもわかるプログラミング」さんをWinAPI開発に参考にさせていただき、 同HPと同じく、空のプロジェクトでAPIを使用しながら一からコードで作成したいと 考えています。 自身の知識としては、C/C++でDirectXを使用しての3D描画くらいで、 GUIの設計は初めてです。 調査不足かもしれませんが、質問させて下さい。 PhotoShopやGIMPのようなレイヤーやツールボックスウィンドウは、 WinAPIのみで作成されているのでしょうか? それとも、他にGUIプログラミング用のAPIがあるのでしょうか? もしあるのならば、APIや参考HPを教えて頂けたら嬉しいです。 プログラミング初心者ですが、どうかよろしくお願い致します。

  • C++とWin32APIでタブコントロールを作成するには

    C++のWin32APIで、MFCを使わずに、 ダイアログボックスの中にタブコントロールを実装したいのですが、 その方法が解らず困っています。 とりあえずウインドウにタブコントロールを 付ける事まではできたものの、 (MFCを使用しない方法で)ダイアログボックスの中に 表示させる方法が見つからないのです・・・。 VisualStudioを使用しているので、 ツールボックスの中にある「Tab Control」というものを ダイアログボックスの中に貼り付けてみましたが、 [Tab1]~[Tab5]までありますが見た目上だけのものなので、 当然実行してもそこには何もありません。 (項目も、タブを切り替える処理も追加してないので 当たり前ですよね^^;) この方法はやはりMFCを使用しないと無理なのでしょうか? もし方法がございましたら、どうかご伝授をよろしくお願いします

専門家に質問してみよう