動的に作成したStatic Textのクリックイベント

[戻る]
たまお 2007/12/25(火) 17:04:46
お世話になります。
VC++にて、
動的に作成したStatic Textのクリックイベントを拾いたいのですが、可能でしょうか?
ご存知の方よろしくお願い致します。

wclrp ( 'o') 2007/12/25(火) 17:10:34
MFCならCStaticの派生クラスを作って
その派生クラスのインスタンス作成やメッセージ処理をする。
#厳密にはクリックじゃなくでボタンダウンかな。

たまお 2007/12/25(火) 21:47:01
ご返答ありがとうございます。
派生クラスのインスタンス作成するのは、良いですが
その後で、どうやって、イベント拾えば良いのでしょうか?
よくわかりません。大変申し訳ありません。
お手間おかけいたしますが、
もう少し具体的に教えていただけないでしょうか?
サンプルソースなどあれば、助かります。
よろしくお願い致します。

wood 2007/12/26(水) 05:48:49
>動的に作成したStatic Textのクリックイベントを拾いたいのですが、可能でしょう
か?
考え方次第で可能じゃないですか
見た目で行けば、ただのラベルですよね?
そこをクリックしたいと言うことですよね
であれば
動的にCreateWindowEx でテキストBOXを入力不可で作成し
その時指定する、コントロールID(IDC_XXXX)のイベントを
処理すれば良いんじゃないですか

動的とは言うものの、ソースプログラム内はスタティックでしょ?
いわゆる固定的処理内容は存在させるんですよね?

コントロールID(IDC_XXXX)はリソースヘッダにしか定義できないわけじゃないよ
余りあちこちに定義しなければ良いだけです
あとはダブらないことね

追伸
>発言される前に「使用上の注意」を必ずお読み下さい。
はお読みになりましたかね

>VC++にて、
バージョン(C++規格が違います、ランタイム関数の記述方法が違います)
技術情報(Win32API/MFC)

>もう少し具体的に教えていただけないでしょうか?
技術情報(Win32API/MFC)
どちらの例がお望みか記述されなければ、自分が参考にしたいものは得られませんよ

誤解を受ける記述方法はおやめください
回答者に乗っ取られるか、あらぬ方向の回答になりかねませんよ

第一発言者の一言が意図しない技術へ導かれることもあります

たいちう 2007/12/26(水) 08:06:53
VC6、MFCの例です。背景色の変更から試した方が理解しやすいと思う。

http://www.athomejp.com/goldfish/mfc/
http://www.athomejp.com/goldfish/mfc/static/onclick.asp

ララ 2007/12/26(水) 08:12:11
派生する必要はありません。

http://athomejp.com/goldfish/mfc/static/onclick.asp

こちらは参考になるでしょうか。

SS_NOTIFY がキーワードです。

ララ 2007/12/26(水) 08:13:17
あら、もろかぶりデスネ^^

たまお 2007/12/26(水) 13:35:40
皆様、ご返答ありがとうございます。
教えて戴いたURLのサンプルは・・・ 

「スタティックをダイアログなどに、配置します。」とありますが、
これは、固定で、Static Textをダイヤログに置いておられるので、
私の知りたい内容と違います。
私が知りたいのは、あらかじめダイヤログにStatic Textを配置するのではなく、
例えば・・・
CStatic        m_cStatic;
m_cStatic.Create("1234567890", WS_CHILD|WS_VISIBLE|SS_CENTER, CRect
(100,100,300,300), pParentWnd);
m_cStatic.ShowWindow(SW_SHOW);

のようにして、動的に作成したコントロールのクリックイベントを拾いたいと
いうことなのです。
また、動的に いくつコントロールを作成するかは、不定です。

言葉足らずで誠に申し訳ありませんでした。 
よろしくお願い致します。

ララ 2007/12/26(水) 14:32:26
m_cStatic.Create("1234567890", WS_CHILD|WS_VISIBLE|SS_CENTER|SS_NOTIFY, CRect
(100,100,300,300), pParentWnd);                             ^^^^^^^^^^^

のようにしてあげれば、親側で通知を受けられるようになると思います。

ララ 2007/12/26(水) 14:50:10
(1)
#define IDC_STATIC5 1234

    m_cStatic.Create("1234567890", 
WS_CHILD|WS_VISIBLE|SS_CENTER|SS_NOTIFY, CRect
(100,100,300,300), this, IDC_STATIC5);
m_cStatic.ShowWindow(SW_SHOW);

ID番号を指示して Create する

(2)
DefWindowProc を実装する

LRESULT CXxxDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
 if (message == WM_COMMAND)
 {
   if ((IDC_STATIC5 == (int)wParam) && ((HWND)lParam == m_cStatic.GetSafeHwnd
()))
   {
     AfxMessageBox("Static Clicked!");
   }
 }
 return CDialog::DefWindowProc(message, wParam, lParam);
}

通りすがり 2007/12/26(水) 14:51:11
イベント拾うなら、pParentWndの後に、nIDもいりませんでしたっけ?

通りすがり 2007/12/26(水) 14:52:10
と思ったら補足されましたね。^^

Q 2007/12/26(水) 15:04:16
"動的"に"不定数"のstaticを生成し、
どれかのstaticがクリックされたことを検出し、
クリックされたstaticを特定するサンプル.
ちょろすぎ。( ̄〜 ̄)ξ

CStaticから派生した自動自己破棄型staticクラス
----- CDynStatic.cpp ------------------------
    :
void CDynStatic::PostNcDestroy()
{
  delete this;
  CStatic::PostNcDestroy();
}
---------------------------------------------

CDynStaticを貼り付けるダイアログ
----- CSampleDlg.cpp ------------------------
    :
#include "CDynStatic.h"
    :
#define IDC_STATIC_FIRST 8000
#define IDC_STATIC_MAX 8999
    :
BEGIN_MESSAGE_MAP(CSampleDlg, CDialog)
    :
  //}}AFX_MSG_MAP
  ON_COMMAND_RANGE( IDC_STATIC_FIRST, IDC_STATIC_MAX, OnStnClickedRange )
END_MESSAGE_MAP()
    :
BOOL CSampleDlg::OnInitDialog()
{
  CDialog::OnInitDialog();
    :
  CFont* pFont = GetFont();
  for( int i = 0; i < 10; i++ )
  {
    CString strText;
    strText.Format(_T("static %d"), i);
    CRect rc;
    rc = CRect(10, 10 + 20*i, 80, 10 + 20*i + 15);
    CDynStatic* pStatic = new CDynStatic;
    pStatic->Create(strText, SS_NOTIFY, rc, this, IDC_STATIC_FIRST + i);
    pStatic->SetFont(pFont);
    pStatic->ShowWindow(SW_SHOW);
  }
  return TRUE;
}

void CSampleDlg::OnStnClickedRange(UINT id)
{
  CString strText;
  strText.Format(_T("static %d がクリックされました"), id - IDC_STATIC_FIRST);
  AfxMessageBox(strText);
}
---------------------------------------------

wclrp ( 'o') 2007/12/27(木) 00:27:38
そうかSS_NOTIFYか
うろ覚えなので書くのやめてた。

わざわざプログラムまで作って回答とはすごいですな。

たまお 2007/12/27(木) 19:01:56
[[解決]]
Q様 ご回答ありがとうございました。
サンプル通りのPGで、見事に実現できました。
感謝いたします。

古いスレッドには追加発言できません。