質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

1回答

3131閲覧

項目のツールチップ表示後に、キーボードでアイテムを選択しなおすと、ツールチップ表示が一瞬表示してすぐ消えてしまう。

samusaku

総合スコア34

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

1クリップ

投稿2018/01/14 12:15

###前提・実現したいこと
以前、こちらで皆様にツールチップ表示方法について教えていただき、実現できました。
ですが、キーボードの上下押下してアイテムを選択しなおすと、ツールチップが表示したと思ったら、すぐ消えてしまう現象になり、
解決できなく困っております。
キーボードの上下で項目を選択しなおしても、ツールチップ表示がすぐに消えなくなる方法がわからず困っております。
ソースを記載いたしますので、有識者の皆様のご教授いただければと幸いです。

発生手順
1.項目にマウスを合わせる。
2.ツールチップが表示される。
→5秒ほどで表示が消える。(正常)
3.手順2に続いて、キーボードの上下を押下してアイテムを選択しなおす。
4.ツールチップが表示される。
→一瞬表示してすぐ消える。(問題)

※手順3でキーボード左右押下や別キーを押下した場合は、ツールチップが一瞬で消えず、5秒ほどで消えます。
→アイテム選択しなおした場合のみ発生いたします。

OK現象

イメージ説明

NG現象

イメージ説明

上記の画像の動作は以下のソースコードで実現しております。
###該当のソースコード

C++

1 2ツールチップ表示クラス CListCtrlEx(h/cpp) 3 4CListCtrlEx.hの実装 5------------------------------------------------------------------------------------ 6class CListCtrlEx : public CListCtrl 7{ 8 DECLARE_DYNCREATE(CListCtrlEx) 9 10// コンストラクタ 11public: 12 // コンストラクタ 13 CListCtrlEx(); 14 15 // デストラクタ 16 virtual ~CListCtrlEx(); 17 18// void SetDispTooltipColumn(int nColumn); 19 20protected: 21 afx_msg void OnToolTipText(NMHDR* pNMHDR, LRESULT* pResult); 22 23 DECLARE_MESSAGE_MAP() 24private: 25}; 26------------------------------------------------------------------------------------ 27 28CListCtrlEx.h.cppの実装 29------------------------------------------------------------------------------------ 30 31#include "stdafx.h" 32#include "CListCtrlEx.h" 33 34 35IMPLEMENT_DYNAMIC(CListCtrlEx, CListCtrl) 36 37// コンストラクタ 38CListCtrlEx::CListCtrlEx() 39{ 40} 41 42// デストラクタ 43CListCtrlEx::~CListCtrlEx() 44{ 45} 46 47BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl) 48 ON_NOTIFY(TTN_NEEDTEXTA, 0, OnToolTipText) 49 ON_NOTIFY(TTN_NEEDTEXTW, 0, OnToolTipText) 50END_MESSAGE_MAP() 51 52 53// ツールチップ 54void CListCtrlEx::OnToolTipText(NMHDR* pNMHDR, LRESULT* pResult) 55{ 56 // マウス位置座標からクライアント座標に変換 57 CPoint pt(GetMessagePos()); 58 ScreenToClient(&pt); 59 60 LVHITTESTINFO lvhti; 61 ::ZeroMemory(&lvhti, sizeof(lvhti)); //構造体初期化 62 lvhti.pt = pt; 63 64 // マウス位置の行と列を取得する 65 ListView_SubItemHitTest(m_hWnd, &lvhti); 66 int nRow = lvhti.iItem; //行 67 int nColumn = lvhti.iSubItem; //列 68 69 if( NULL != pNMHDR ) { 70   TOOLTIPTEXT* pToolTipText = (TOOLTIPTEXT*)pNMHDR; 71   CString stToolTip = _T(""); 72   if( ((nRow != -1) && (nColumn != -1)) ) { 73     // ツールチップ表示対象列の場合、リストの文字列を取得する 74 stToolTip = GetItemText(nRow, nColumn); 75 // ツールチップ表示文字列設定 76 (void)lstrcpyn(pToolTipText->szText, stToolTip, (stToolTip.GetLength() + 1) ); 77   } 78 } 79} 80------------------------------------------------------------------------------------ 81 82以下はダイアログ画面にリスト表示(ListCtrlを用いて実現)をするクラスです(DispToolTipDlg.h/cpp) 83 84DispToolTipDlg.hの実装 85------------------------------------------------------------------------------------ 86// DispToolTipDlg.h : ヘッダー ファイル 87#pragma once 88#include "afxcmn.h" 89#include "CListCtrlEx.h" 90 91// CDispToolTipDlg ダイアログ 92class CDispToolTipDlg : public CDialogEx 93{ 94// コンストラクション 95public: 96 CDispToolTipDlg(CWnd* pParent = NULL); // 標準コンストラクター 97 98// ダイアログ データ 99#ifdef AFX_DESIGN_TIME 100 enum { IDD = IDD_DISPTOOLTIP_DIALOG }; 101#endif 102 protected: 103 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート 104protected: 105 HICON m_hIcon; 106 107 // 生成された、メッセージ割り当て関数 108 virtual BOOL OnInitDialog(); 109 afx_msg void OnPaint(); 110 afx_msg HCURSOR OnQueryDragIcon(); 111 DECLARE_MESSAGE_MAP() 112private: 113 CListCtrlEx m_listCtrl; 114 void ListInit(void); 115 void ListInsertItem(void); 116 117 118DispToolTipDlg.hの実装 119------------------------------------------------------------------------------------ 120#include "stdafx.h" 121#include "DispToolTip.h" 122#include "DispToolTipDlg.h" 123#include "afxdialogex.h" 124 125#ifdef _DEBUG 126#define new DEBUG_NEW 127#endif 128 129 130// CDispToolTipDlg ダイアログ 131 132void CDispToolTipDlg::DoDataExchange(CDataExchange* pDX) 133{ 134 CDialogEx::DoDataExchange(pDX); 135 DDX_Control(pDX, IDC_LIST1, m_listCtrl); 136} 137 138BOOL CDispToolTipDlg::OnInitDialog() 139{ 140 CDialogEx::OnInitDialog(); 141 142 // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 143 // Framework は、この設定を自動的に行います。 144 SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 145 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 146 147 // TODO: 初期化をここに追加します。 148 // リスト項目設定 149 ListInit(); 150 // アイテム挿入 151 ListInsertItem(); 152 153 return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 154} 155 156void CDispToolTipDlg::ListInit(void) 157{ 158 // 項目タイトル追加 159 LVCOLUMN lvc; 160 int i; 161 TCHAR caption[][16] = { _T("Test1"), _T("Test2"), _T("Test3") }; 162 const int clmNum = sizeof caption / sizeof caption[0]; 163 164 lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 165 for (i = 0; i < clmNum; i++) 166 { 167  lvc.iSubItem = i; 168  lvc.pszText = caption[i]; 169  lvc.cx = 100; 170  if (m_listCtrl.InsertColumn(i, &lvc) == -1) { 171   break; 172  } 173     } 174} 175 176// リストアイテム挿入 177void CDispToolTipDlg::ListInsertItem(void) 178{ 179 struct 180 { 181  TCHAR test1[32]; 182  int test2; 183  int test3; 184 } item[] = 185 { 186  { _T("sample1"), 10, 100 }, 187  { _T("sample2"), 20, 200 }, 188  { _T("sample3"), 30, 300 } 189 }; 190 191 const int itemNum = sizeof item / sizeof item[0]; 192 LVITEM lvi; 193 CString str; 194 int i, index = 0; 195 196 for (i = 0; i < itemNum; i++) 197 { 198 lvi.mask = LVIF_TEXT; 199 lvi.iItem = i; 200 lvi.iSubItem = 0; 201 lvi.pszText = item[i].test1; 202 index = m_listCtrl.InsertItem(&lvi); 203 204 str.Format(_T("%d"), item[i].test2); 205 lvi.iItem = index; 206 lvi.iSubItem = 1; 207 lvi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(str)); 208 m_listCtrl.SetItem(&lvi); 209 210 str.Format(_T("%d"), item[i].test3); 211 lvi.iItem = index; 212 lvi.iSubItem = 2; 213 lvi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(str)); 214 m_listCtrl.SetItem(&lvi); 215 } 216} 217

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

推測ですが、マウスが指し示している位置と実際の選択位置が違うのですぐに消えるのか、または、キー入力が有ったからということで消しているかのどれかでしょうね。

CToolTipCtrlクラスを使っていると思うんですが、これを派生させて自分独自の仕様を盛り込むくらいしか思いつきませんが、そこまでCToolTipCtrlクラスが外向けに公開しているかどうかにかかって来ると思います。

ところで、すぐに消えてなにかまずいことでもあるんでしょうか?
もっと作ろうとしているプログラムの本来の仕様の部分に注力したほうが良いのでは?と思いますが・・・。

投稿2018/01/18 08:39

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問