動的に作成したStatic Textのクリックイベント – プログラミング – Home

動的に作成したStatic Textの...
 
通知
すべてクリア

[解決済] 動的に作成したStatic Textのクリックイベント


たまお
 たまお
(@たまお)
ゲスト
結合: 14年前
投稿: 20
Topic starter  

お世話になります。
VC++にて、
動的に作成したStatic Textのクリックイベントを拾いたいのですが、可能でしょうか?
ご存知の方よろしくお願い致します。


引用未解決
トピックタグ
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 15年前
投稿: 287
 

MFCならCStaticの派生クラスを作って
その派生クラスのインスタンス作成やメッセージ処理をする。
#厳密にはクリックじゃなくでボタンダウンかな。


返信引用
たまお
 たまお
(@たまお)
ゲスト
結合: 14年前
投稿: 20
Topic starter  

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 20年前
投稿: 895
 

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

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

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

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

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

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

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

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 19年前
投稿: 662
 

VC6、MFCの例です。背景色の変更から試した方が理解しやすいと思う。

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


返信引用
ララ
 ララ
(@ララ)
ゲスト
結合: 19年前
投稿: 93
 

派生する必要はありません。

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

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

SS_NOTIFY がキーワードです。


返信引用
ララ
 ララ
(@ララ)
ゲスト
結合: 19年前
投稿: 93
 

あら、もろかぶりデスネ^^


返信引用
たまお
 たまお
(@たまお)
ゲスト
結合: 14年前
投稿: 20
Topic starter  

皆様、ご返答ありがとうございます。
教えて戴いた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);

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

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


返信引用
ララ
 ララ
(@ララ)
ゲスト
結合: 19年前
投稿: 93
 

m_cStatic.Create(1234567890, WS_CHILD|WS_VISIBLE|SS_CENTER|SS_NOTIFY, CRect
(100,100,300,300), pParentWnd); ^^^^^^^^^^^

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


返信引用
ララ
 ララ
(@ララ)
ゲスト
結合: 19年前
投稿: 93
 

(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);
}


返信引用
通りすがり
 通りすがり
(@通りすがり)
ゲスト
結合: 21年前
投稿: 92
 

イベント拾うなら、pParentWndの後に、nIDもいりませんでしたっけ?


返信引用
通りすがり
 通りすがり
(@通りすがり)
ゲスト
結合: 21年前
投稿: 92
 

と思ったら補足されましたね。^^


返信引用
Q
 Q
(@Q)
ゲスト
結合: 21年前
投稿: 45
 

動的に不定数の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')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 15年前
投稿: 287
 

そうかSS_NOTIFYか
うろ覚えなので書くのやめてた。

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


返信引用
たまお
 たまお
(@たまお)
ゲスト
結合: 14年前
投稿: 20
Topic starter  

Q様 ご回答ありがとうございました。
サンプル通りのPGで、見事に実現できました。
感謝いたします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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