お世話になります。
VC++にて、
動的に作成したStatic Textのクリックイベントを拾いたいのですが、可能でしょうか?
ご存知の方よろしくお願い致します。
MFCならCStaticの派生クラスを作って
その派生クラスのインスタンス作成やメッセージ処理をする。
#厳密にはクリックじゃなくでボタンダウンかな。
ご返答ありがとうございます。
派生クラスのインスタンス作成するのは、良いですが
その後で、どうやって、イベント拾えば良いのでしょうか?
よくわかりません。大変申し訳ありません。
お手間おかけいたしますが、
もう少し具体的に教えていただけないでしょうか?
サンプルソースなどあれば、助かります。
よろしくお願い致します。
>動的に作成したStatic Textのクリックイベントを拾いたいのですが、可能でしょう
か?
考え方次第で可能じゃないですか
見た目で行けば、ただのラベルですよね?
そこをクリックしたいと言うことですよね
であれば
動的にCreateWindowEx でテキストBOXを入力不可で作成し
その時指定する、コントロールID(IDC_XXXX)のイベントを
処理すれば良いんじゃないですか
動的とは言うものの、ソースプログラム内はスタティックでしょ?
いわゆる固定的処理内容は存在させるんですよね?
コントロールID(IDC_XXXX)はリソースヘッダにしか定義できないわけじゃないよ
余りあちこちに定義しなければ良いだけです
あとはダブらないことね
追伸
>発言される前に「使用上の注意」を必ずお読み下さい。
はお読みになりましたかね
>VC++にて、
バージョン(C++規格が違います、ランタイム関数の記述方法が違います)
技術情報(Win32API/MFC)
>もう少し具体的に教えていただけないでしょうか?
技術情報(Win32API/MFC)
どちらの例がお望みか記述されなければ、自分が参考にしたいものは得られませんよ
誤解を受ける記述方法はおやめください
回答者に乗っ取られるか、あらぬ方向の回答になりかねませんよ
第一発言者の一言が意図しない技術へ導かれることもあります
VC6、MFCの例です。背景色の変更から試した方が理解しやすいと思う。
http://www.athomejp.com/goldfish/mfc/
http://www.athomejp.com/goldfish/mfc/static/onclick.asp
派生する必要はありません。
http://athomejp.com/goldfish/mfc/static/onclick.asp
こちらは参考になるでしょうか。
SS_NOTIFY がキーワードです。
あら、もろかぶりデスネ^^
皆様、ご返答ありがとうございます。
教えて戴いた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);
のようにして、動的に作成したコントロールのクリックイベントを拾いたいと
いうことなのです。
また、動的に いくつコントロールを作成するかは、不定です。
言葉足らずで誠に申し訳ありませんでした。
よろしくお願い致します。
m_cStatic.Create(1234567890, WS_CHILD|WS_VISIBLE|SS_CENTER|SS_NOTIFY, CRect
(100,100,300,300), pParentWnd); ^^^^^^^^^^^
のようにしてあげれば、親側で通知を受けられるようになると思います。
(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);
}
イベント拾うなら、pParentWndの後に、nIDもいりませんでしたっけ?
と思ったら補足されましたね。^^
動的に不定数の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);
}
---------------------------------------------
そうかSS_NOTIFYか
うろ覚えなので書くのやめてた。
わざわざプログラムまで作って回答とはすごいですな。
Q様 ご回答ありがとうございました。
サンプル通りのPGで、見事に実現できました。
感謝いたします。