AIと戦って、あなたの人生のリスク診断 >>

お世話になります。
VC++ 2008で、CMFCButtonをダイアログに貼り付けています。
マウスが上を通過したとき、ステータスバーに文字列が表示される
しくみがあり、それを使っています。
文字列は、XXXXX\nYYYで、YYYがツールチップ、XXXXXがステータスバーに
表示される文字列としてリソースで定義してあります。
また、そのリソース名をボタンのリソース名としています。
DDXで、メンバーのボタンとリソースIDを関連付けています。
(普通の使い方だと思います)

動作もうまくいっていますが、ステータスバーに表示する説明文を
起動後にダイナミックに変更する必要が出てきました。
ボタンの意味が変わる状況があるからです。

さて、マウスが通過するときの文字列を後から変更するには、どうしたらいいでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

当方は、MFCプログラミングはよく使いますが、2008を所有していないため、CMFCButtonボタンなるクラスは初めて知りました。


MFCButtonなりCButtonのサブクラス化したクラスを作ることで万事解決だと思いますが。。
便利なクラスは開発効率を良くするけど、ちょっと違うことをやろうと思ったら、結局サブクラス化しないとできないことはよくあります。
もちろん、サブクラス化しないで済む方法があれば当然そちらを採用しますが。
2008を持ってないので、別バージョンのVC&MFCで似たようなことをするサンプルプログラムを作ってみました。
サブクラス化したクラスの中で、OnMouseMove()イベントハンドラを追加。
OnMouseMove()イベントハンドラは、マウスが動いている間、何度も呼ばれるから、ステータスバーやツールチップの文字列の変更は一度しか呼び出さない仕組みが必要。
ボタンに割り当てるステータスバーに表示する文字列をボタンもしくはその親であるダイアログなりに保持する。この文字列をAとすると
ここで、ステータスバーの文字列を取得する(GetPaneTextを使う)なりして、Aと比較して、異なれば、ステータスバーの表示を変更。
ステータスバーの文字列は、SetPaneText()関数で変更。
ツールチップは、CMFCButton::SetTooltipで変更。

サブクラス化したクラスを使うときは、リソースエディタでCMFCButtonなりCButtonクラスなりの変数を追加する。
すると、クラスのメンバ変数に、
CMFCButton m_btn1;
なりができているから、
これを
CMFCButtonEx m_btn1;
とするだけで、サブクラス化したクラスにメッセージがいきます。
わざわざSubclassDlgItem()は使わないでもOK。
もちろん、そのヘッダーファイルの中で、サブクラス化したクラスのヘッダーファイルを#includeする必要があります。
文字列リソースを必要な分だけリソースエディタのString Tableで作って、
ボタンに割り当てるツールチップやステータスバーに対する文字列を変更する箇所で、
str1.LoadString(IDS_TEXT_BTN1_STATUSBAR_TEXT1);
とか
str1.LoadString(IDS_TEXT_BTN1_STATUSBAR_TEXT2);
などとして、リソースから適切な文字列を取得。
MFCButtonをサブクラス化したクラスに
SetStatusBarText(LPCTSTR);
みたいな関数を定義して、
m_btn1.SetStatusBarText(str1);みたいにボタンに割り当てるステータスバーに表示するテキストなりを設定する。
この関数はサブクラス化したクラスのユーザー定義メンバ関数で、
void SetStatusBarText(LPCTSTR lpszStatusBarText){m_strSetStatusBarText = lpszStatusBarText;}
のような感じ。

こんな感じでうまくいくと思うんですが。。
ご参考まで。。
    • good
    • 0
この回答へのお礼

ご丁寧な回答ありがとうございました。

お礼日時:2010/04/07 04:23

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qボタンの表示の色、フォントを変更したい

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べて、それらしい関数を見つけるのですが使い方がわかりません。
VCを始めたばかりで、クラスの理解がまだ浅いです。。。
関数の説明は理解できても、「じゃあ、コードはどう書くの?」という状態です。
「○○ は ×× のメンバではありません」と、よく怒られてます。。。

識者の方、ご教授願います。
コードがどうなるのか知りたいので、簡単なサンプルコードがあると助かります。

また、質問ではないのですが、「この関数は○○をする」というのではなく、
「○○をするにはこの関数を使う」という様に調べられる、お勧めの書籍、
Webなどがありましたら教えてください。
今後の勉強に役立てたいと思っています。

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べ...続きを読む

Aベストアンサー

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使っています;;

一番上はBitmapを貼り付けるか、CWndのメンバ関数を使って
塗りつぶすかどうかだと思います。

MFCではなく、C++Builderのページなのですが、少しいじればMFCでも使えるので、参考URLに示しておきます。

参考URL:http://market.agr.tottori-u.ac.jp/ken/tech.html

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使って...続きを読む

Qリソースエディタでスタティックテキストの文字サイズの変更

 VisualStudio を使っています。
 リソースエディタで、作成したダイアログ・ボックス中に貼り付けた、
スタティックテキスト(Static Text)の文字サイズの変更を個別にしたいのです。

 ダイアログのプロパティには、フォントとサイズを変更できるようになっていますが、個々のスタティックテキストには、ありません。

 どうすれば、一番良いのでしょうか?
 教えてください。

 よろしくお願いします。

 

Aベストアンサー

WM_INITDIALOGの中でフォントを指定すればよいでしょう。
(MFCならCStatic::SetFont)

case WM_INITDIALOG:
{
HWND hStatic = GetDlgItem(hWnd , IDC_STATIC1 );
HFONT hFont = CreateFont(16,
0,
0,
0,
FW_REGULAR,
FALSE,
FALSE,
TRUE,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
DEFAULT_PITCH,
_T("MS ゴシック") );
SendMessage(hStatic,WM_SETFONT,(WPARAM)hFont, TRUE);
}

参考URL:http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200211/02110110.txt

QCStaticコントロールの静的イメージ描画

はじめまして、質問させてください。

VC++ 2005 MFC で開発しております。

Picture Control(DDX CStasic型)に
イメージ(外部ファイル JPG)を静的に描画させたいのですが
方法がわかりません。

お詳しい方がおられましたら、ご教授お願いいたします。

ちなみに
CImageを使用して描画はできるのですが
その場合、OnPaintをオーバーライドして
描画更新処理を書かないと一度だけ描画されて終わって
しまうと思います。

CStaic変数にロードしたら
再度ロードされるまで
ずっと描画させていたいです。

以上になります。
宜しくお願いいたします。

Aベストアンサー

SelectObjectで選択するとその時まで選択されていたデバイスハンドルを返してきます
そのハンドルを一時変数に保存しておいて描画後に戻してやるのです

CBitmap* pOld = m_dcMem.SelectObject( &m_bmpMem );
といった具合で記憶して描画処理を行います
使用後に
m_dcMem.SelectObject( pOld );
といった具合にして m_bmpMemをDCからはずします
この後
m_ctlImage.SetBitmap( m_bmpMem );
といった具合に選択してやればできると思います

CStaticのTypeはビットマップで無いとSetBitmapでイメージを表示しません


人気Q&Aランキング