CDialogの派生クラスの派生クラスについて – プログラミング – Home

CDialogの派生クラスの派生クラス...
 
通知
すべてクリア

CDialogの派生クラスの派生クラスについて


Ryo
 Ryo
(@Ryo)
ゲスト
結合: 23年前
投稿: 252
Topic starter  

現在仕事で画面のデザイナとデザイナでデザインしたものを表示するような
プログラムを組んでいます。

環境:
WindowsXP
VC++9 MFC

今までずっとVC6だけを使っていて戸惑いながらVS2008に移ったのですが、
最新トレンドとは縁遠い仕事ばかりしていて最近の技術からはずいぶんと
取り残された浦島状態です。

実際にやりたい事は、デザイナ(既存のもので、デザインをXML出力する)
から出力された画像と位置情報等からフルスクリーンの画面を表示して
操作してもらうというものです。

このXMLには「ボタン」とか「テキスト」とかいう属性があり、昔であれ
ばビットマップボタンとかを使って実際にオブジェクトを配置していた
のですが、特にステート毎に画像が変わる訳でもないので、全部画像表示
だけにして、自分でヒットテストを作って判定しようかなどと考えてます。

で、どうせなら他のダイアログ(メッセージや入力)なんかもこのデザイナ
を使って表示させたいと思うのですが、そうすると基本動作をクラス化した
方が後々楽そうです。

ところが、CDialogの派生なんかは意識せずとも誰でも使うと思うんです
が、派生したクラス(たとえばCBaseDialog)をさらに派生させて本当に
動くかどうか、というか、そんな使い方をするのかが判断できません。
メッセージマップ等はBaseとHogeのどちらに置くとかの判断も…。
例:
CDialog
+CBaseDialog -- (デザインデータの描画やボタン判定)
+CHogeDlg -- (ボタン判定で判定された個別ボタン処理やその他個別処理)

こんな使い方って普通にするものなのでしょうか。

或いは別にクラスを作っておいて、ダイアログ毎に毎回メンバ関数を呼ぶ
とかの方が普通なのでしょうか。

一人で作っているので、そもそも全画面アプリを作るのにダイアログベース
が適当なのかどうか、とか、悩みだすと無限ループしてしまっています。
SDIだと枠の消し方が分からなかったりしますので…。

長々と書いてしまいましたが、要約すると以下の2点です。

1.各ダイアログの共通化処理はどういう配置をするのが適当?
2.全画面アプリとかをダイアログベースで作るのは変?

それぞれの考え方もあるかとは思いますが、ご意見やアドバイスをお願いいたします。


引用解決済
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

経験上、動的配置を行うフロントエンドクラスはウインドウをまったく意識しない
作りになっていないと機能不全に陥りがちです。このことから、ベースクラスを
何にするかは「後で決定する」で十分であると想像できます。

もっとも、子コントロールを動的に配置するならダイアログリソースなど使えない
ことは自明なので、むしろ通常のウインドウにしない理由を探すほうが難しいとの
ではないでしょうか。

CWndかCDialogか悩む場合、最終的なフロントエンドクラスに至る前のクラスで
CWndとCDialogを継承しなおせるようにダンパー的な保留クラスを設けて
おくのはよくやることで、別に悩む必要はありません。そう実装すればよいだけです。
場合によってはCWndのクライアント領域にCDialogを貼り付けるというあんちょこも
安全な逃げ道です。CDialgが破綻したとき、全て別のCWndまたは親のCWnd
に移行すればすむからです。

こういった大胆な変更がわりと簡単にできるのがC++の良いところでも
あるわけです。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

> 1.各ダイアログの共通化処理はどういう配置をするのが適当?
どういう意味で聞いているかにもよりますが、

普通に共通関数を用意したいだけなら、CBaseDialogクラスに protectedメンバ
関数を用意すればいいだけですし、話の内容からしてその程度のことは分かっ
ていそうなので違いますね。

メッセージとかDDX/DDVの扱いに困っているのだと仮定して、
答は簡単です。
リレーしてしまえばいいんです。

以下の例で十分伝わるでしょう。

void CHogeDlg::DoDataExchange(CDataExchange* pDX)
{
CBaseDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CHogeDlg, CBaseDialog)
END_MESSAGE_MAP()


返信引用
Ryo
 Ryo
(@Ryo)
ゲスト
結合: 23年前
投稿: 252
Topic starter  

ご回答ありがとうございます。

>> 仲澤@失業者 様

いろいろと「確かに…」と思うところがありました。
とりあえずCWndで考えておけばCDialogへの移行も簡単ですしね。

>> bun 様

なるほど。転送してしまえば確かに問題は無いですね。
ただ、毎回派生クラスで同様の手続きを踏まなければならないとなると
結局機能をクラス化してダイアログ等に実装するのとあまり変わらない
のかなぁ?と思ってしまうのは私だけ?(^-^;

---
元々勉強が嫌いなので深く考えず今まで組んできましたけど、基本とか
常識とかが分からない上に、ちょっと深くなると訳がわからなくなって
しまうので、やっぱり最初から勉強しなおさなきゃだめかなぁと思って
いる今日この頃です…。

もう少しいろんな意見が聞ければと思うので、アドバイスお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました