STATIC TEXTコントロールを動的に生成したいのですが – プログラミング – Home

STATIC TEXTコントロールを動...
 
通知
すべてクリア

[解決済] STATIC TEXTコントロールを動的に生成したいのですが


若葉マーク
 若葉マーク
(@若葉マーク)
ゲスト
結合: 17年前
投稿: 6
Topic starter  

今日は、宜しくお願いします。
先回「カスタムコントロールにスクロールバーを付加したい 」で、お世話になりました
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200801/08010018.txt
今回は、STATIC TEXTコントロールに関しての質問がございます。

・環境
Windows XP SP2 / MFC

・ ダイアログのレイアウト
OKボタン
キャンセルボタン
カスタムコントロール
スクロールバーコントロール

・行いたいこと
カスタムコントロール上に、CWndクラスから、継承したSTATIC TEXTコントロールを
動的に生成して、文字を表示したい。

・問題点
テキスト表示ができません。

・お聞きしたいこと
間違いの原因と、解決方法を教えていただけませんか。

・Implement
void ShowText()
{
CStatic m_cStatic;
m_cStatic.Create( VC++ ラウンジ , WS_CHILD|WS_VISIBLE|SS_CENTER, CRect
(100,100,300,300), this);
m_cStatic.ShowWindow(SW_SHOW);
}


引用未解決
トピックタグ
若葉マーク
 若葉マーク
(@若葉マーク)
ゲスト
結合: 17年前
投稿: 6
Topic starter  

お世話になります。
自己レスです、動的と書いておきながら、動的に生成してませんでした(^^;
このように、しましたら表示できるようになったのですが、newで生成したオブジェクト
を、明示的に消滅させるべく、デスクトラクタで、deleteしたいのですが、アクセスバイ
オレーションが発生します
ブレークを張って、デバッグしますと
delete this->m_cStatic;
の部分で
m_cStatic 0xcccccccc {CStatic hWnd=???} CStatic *
既に、ハンドルは握っていません、どうすべきなのでしょうか?

// デスクトラクタ
Foo::~Foo()
{
if(m_cStatic)
delete this->m_cStatic;
};

void Foo::ShowText()
{
CStatic* m_cStatic = new CStatic();
m_cStatic->Create( VC++ ラウンジ , WS_CHILD|WS_VISIBLE|SS_CENTER,
CRect
(100,100,300,300), this);
m_cStatic->ShowWindow(SW_SHOW);
}


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

void Foo::ShowText()
{
CStatic* m_cStatic = new CStatic();

このm_cStaticはメンバ変数じゃなくて
Foo::ShowText(void)内で用意した局所変数じゃん。
それに値が0xccccccccということは初期化もしていないくさい。

面倒なんだけど
Foo::Foo(略) : m_cStatic(NULL) { 略 }
あるいは
Foo::Foo(略) { m_cStatic = NULL; }
とする。

void Foo::ShowText()
{
m_cStatic = new CStatic();

}


返信引用
若葉マーク
 若葉マーク
(@若葉マーク)
ゲスト
結合: 17年前
投稿: 6
Topic starter  

wclrp ( 'o') さん、お世話になります。
コンストラクタを、明示的に初期化してやらなければ、ならないんですね
ありがとうございます。

それから、申し訳ないのですが、もう一点だけ教えて頂きたいことがあります。それは、
同じオブジェクトを、複数生成させたい場合、オーバーライドさせれば出来ると
思うのですが、もう少し簡単に複製を作る方法はないでしょうか?
ためしにCreate関数の、5番目の引数である、nIDにコントロール ID を指定したら出来る
かと思い
#define IDC_STATIC_FIRST 8000
#define IDC_STATIC_SECOND 8001
として、
m_cStatic->Create( VC++ ラウンジ , WS_CHILD|WS_VISIBLE|SS_CENTER, CRect
(100,100,300,300), this, IDC_STATIC_FIRST );

m_cStatic->Create( VC++ ラウンジ 別館 , WS_CHILD|WS_VISIBLE|SS_CENTER, CRect
(200,200,250,250), this, IDC_STATIC_SECOND );

この様な感じでやってみたのですが、二つ目のインスタンスをCreateする部分で、落ちて
しまいます。
宜しくご教示願います。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

複数のオブジェクト(テキスト)を作るにはオブジェクト(若葉マークさんのコードで
はm_cStatic)を複数用意する必要があります。


返信引用
若葉マーク
 若葉マーク
(@若葉マーク)
ゲスト
結合: 17年前
投稿: 6
Topic starter  

maruさん、先回はお世話になりました、宜しくお願いします。
複数のオブジェクトが、同じポインタを使いまわすなんて(deleteしないで)、
無理だと思ったんですが、ひょっとしてMFCなら、あるのではと思い
お聞きしました、wclrp ( 'o')さん、maruさん、ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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