画素のデータをマウスカーソルの近くで表示するには?


GAKU  2010-03-20 23:05:29  No: 71486  IP: [192.*.*.*]

visual studio 2005 C++ MFC Dialog画面

Dialog画面にPictureControlを貼り付けて画像を表示しています。
マウスを画像の適当な場所に当ててRGBのピクセル値を取得して3個の
Edit Controlに表示しているのですが、マウスカーソルとEdit Controlの
場所がちょっと離れていて見づらいので、マウスカーソルの所で表示しようとしているのですがなかなかうまくいきません。
tooltipで表示する方法を試みたのですがうまくいきません。
他のBUTTON ControlやEdit Controlではうまくtooltipが表示されるのですが
pictureBoxに持ってきても何もでません。
pictureBoxではtooltipは表示されないのでしょうか?
もしくは他になにかうまい方法はないでしょうか?

よろしくお願いします。

編集 削除
 2010-03-21 13:22:09  No: 71487  IP: [192.*.*.*]

環境がないので試していませんけど
http://home.att.ne.jp/banana/akatsuki/doc/mfc/mfc22/index.html
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TOOLTIP.html
こんな感じで出来るのでは?

編集 削除
GAKU  2010-03-21 18:33:07  No: 71488  IP: [192.*.*.*]

やって見ましたがうまくいきませんでした。
IDC_BUTTON1とかIDC_EDIT1などは正常に出るのですが
IDC_PICTURE1では何の反応もありません。
PICTURE BOXは特別なのでしょうか?

編集 削除
 URL  2010-03-22 10:37:47  No: 71489  IP: [192.*.*.*]

失礼しました。VS6で試してみました。
PictureControlのプロパティで、通知(SS_NOTIFY)
を付けてみてください。(2005のプロパティ名が分かりません)
もしくは、OnInitDialog()あたりに
m_pict.ModifyStyle( 0, SS_NOTIFY);
を追加します。

これでPictureControlでWM_MOUSEMOVEとかクリックのイベントが
受け取れるようになるはずです。

BOOL ChogeDlg::PreTranslateMessage(MSG* pMsg) 
{
    if(pMsg->hwnd == m_pict.m_hWnd) {
        switch(pMsg->message){
        case WM_LBUTTONDOWN: 
        case WM_LBUTTONUP: 
        case WM_MOUSEMOVE: 
            m_ToolTip.RelayEvent(pMsg);
            break;
        }
    }
}

編集 削除
GAKU  2010-03-22 17:24:06  No: 71490  IP: [192.*.*.*]

ご指摘のようにやって見ました。
m_pict.ModifyStyle( 0, SS_NOTIFY);はpictureコントロールプロパティのNotifyをTRUEにしたのと同じ効果のようです。
結果としてツールチップは出るようになりました。
またPreTranslateMessage(MSG* pMsg)でマウスイベントも受信できています。有難う御座いました。
ただまだ思ったようには動作していません。
CToolTipCtrl m_tooltip;をヘッダファイルで宣言して
OnInitDialog()内で
  m_tooltip.Create(this);
  m_PICTURE1.ModifyStyle( 0, SS_NOTIFY);
  // コントロールにツールヒントを割り当てる。
  m_tooltip.AddTool(&m_PICTURE1, globalStr);
  m_tooltip.Activate(TRUE);
のようにグローバル変数globalStrの中身を表示するようにしているのですが
初期化時のCString globalStr = ("abc");から変わってくれません。
globalStrは下記のようにcase WM_LBUTTONDOWN: の中で求めて入れています。実際に書き換わっているのは確認できるのですが何故か反映してくれません。
case WM_LBUTTONDOWN: 
  ここでMSG* pMsgよりマウスの位置を求めてglobalStrに入れている。
  globalStrのデータが更新されているのは確認済み。
  m_tooltip.Pop();これは一度ツールチップを消すために入れている。
  break;
//case WM_LBUTTONUP: 
case WM_MOUSEMOVE:
  m_tooltip.RelayEvent(pMsg);
  break;

変数に入れるタイミングかなにか悪いのでしょうか?それとも
OnInitDialog()内で一度抱えてしまうと内部に持ってしまうのでしょうか?

あと一息なのですが、なかなか思うように進みません。
  
なにか案があれば教えて頂きたいのですが。
よろしくお願いします。

編集 削除
 2010-03-22 22:27:11  No: 71491  IP: [192.*.*.*]

CToolTipCtrlの内部の変数にでも文字列をコピーしているのでしょう。
なので、globalStrの内容を変えただけでは駄目だと思います。

case WM_LBUTTONDOWN: 
の所でAddToolでglobalStrを再設定する事で出来ませんか?(未確認)

もしくは初めのリンク先の
http://home.att.ne.jp/banana/akatsuki/doc/mfc/mfc22/index.html
「動的なツールヒント」でglobalStrの内容を設定してしまえば良いかと。

編集 削除