6

構成メニューの各項目にツールチップを割り当てる必要があります。ページ上の各コントロールへのツールチップの「追加」を完了しましたが、画面上のコントロールの位置によっては、ツールチップが表示される場合と表示されない場合があります。

最初にページをツールチップ化するには

EnableToolTips(TRUE);

各CPropertyPageのOnInitDialogメソッド。次に、通知マップを追加します

ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText)

OnToolTipText関数がそのように見える

BOOL CCfgPrefPage::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
    UINT nID = pNMHDR->idFrom;

    if (pTTT->uFlags & TTF_IDISHWND)
    {
        nID = ::GetDlgCtrlID((HWND)nID);
        if(nID)
        {
            if( nID == GetDlgItem(IDC_PICKDIST_EDIT)->GetDlgCtrlID())  
                _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE);
            else if( nID == GetDlgItem(IDC_ENDPTTOL_EDIT)->GetDlgCtrlID())  
                _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE);

            pTTT->lpszText = pTTT->szText; // Sanity Check
            pTTT->hinst = AfxGetResourceHandle(); // Don't think this is needed at all
            return TRUE;
        }
    }
    return FALSE;
}

一部のコントロールでは、ツールチップが表示されないようです。ほとんどのチェックボックスはツールチップの表示を制御しますが、一部のチェックボックスは表示されません。それらをカバーする他のコントロールはありません、それらは無効にされていません。

また、非標準のカーソルウィンドウを使用すると、ツールチップが繰り返し点滅するため、読み取りできない場合があります。どうすればこれを修正できますか?これはCEditコントロールでは問題ではないのに、なぜ他の場所で問題になるのでしょうか。

編集:更新、何年もの間ページにあったコントロールはツールのヒントを示しているようです。今/今日追加しようとしているコントロールには、ツールのヒントがまったく表示されません。位置、コントロールタイプ、設定に関係なく、新しく挿入されたコントロールに表示するツールチップを1つ取得できません。

4

2 に答える 2

6

私が提案したヘルパークラスを使用したくない場合は、コードの問題を修正してください。まず、次のように、偶数ハンドラーをマッピングするときにON_NOTIFY_EX_RANGEマクロを使用します(これはすべてのIDをカバーします)。

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)

次に、関数を修正する必要があります。ここにいくつか問題があります。まず、TTF_IDISHWNDフラグをテストするときは、nIDを再初期化するだけで済みます。これを関数全体に適用する必要はありません。次に、すべての操作の後、nIDが実際のダイアログIDになります。GetDlgItem()関数は必要ありません

BOOL CCfgPrefPage::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
    UINT nID = pNMHDR->idFrom;

    if (pTTT->uFlags & TTF_IDISHWND)
    {
        nID = ::GetDlgCtrlID((HWND)nID);
    }
    if(nID)
    {
        if( nID == IDC_PICKDIST_EDIT)  
            _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE);
        else if( nID == IDC_ENDPTTOL_EDIT)  
            _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE);

        //pTTT->lpszText = pTTT->szText; // Sanity Check
        *pResult = 0;
        return TRUE;
    }
    return FALSE;
}
于 2013-03-28T00:39:05.713 に答える
0

古いMFCアプリケーションのメニューからいくつかのメニュー項目を繰り返すツールバーを使用して、ツールチップのこの問題に取り組み、(1)追加のアイコンを含むようにツールバーのビットマップを変更し、(2)現在のユーザーフィードバックを提供しますアプリケーションの状態。私の問題は、さまざまなウィザードやツールを使用するのではなく、これのほとんどを手作業で行わなければならないことです。

私が行ったことは、(1)追加のメッセージを処理するためにCView派生クラスに新しいメンバーを追加すること、(2)MSペイントとリソースエディターの両方を使用して追加のアイコンを追加するようにツールバーのビットマップを変更すること、および(3)追加することです。 CView派生クラスのメッセージマップへの新しいイベントIDとイベントハンドラー。

ツールバーのビットマップの変更で遭遇した問題の1つは、アイコンを挿入していたため、ビットマップ内の既存のアイコンを右にシフトする必要があることでした。これを最初に試みた結果、シフトされたアイコンがアプリケーションツールバーに空白として表示されました。次に、ツールバービットマップの長さをもう少し追加する必要があることに気付きました。ツールバービットマップの最後のアイコンにさらにいくつかの列を追加して、ピクセル単位の標準幅にした後、アイコンは正しく表示されました。

ツールチップについては、メッセージマップに次を追加しました。

ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText)

次に、メニュー項目の通知を処理するために、次のメソッドをクラスに追加しました。ちなみに、これはクラスでOnToolTipText()使用される標準メソッドであるように見えますが、クラスはそのように派生しているため、メソッドの名前に違いがあるとは思えません。CFrameWndCMDIChildWndCViewCWndCFrameWnd

inline BOOL CPCSampleView::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
    static wchar_t toolTextToggleExportSylk [64] = L"Toggle SYLK export.";
    static wchar_t toolTextClearWindow [64] = L"Clear the log displayed.";
    static wchar_t toolTextConnectLan [64] = L"Log on the POS terminal through the LAN.";

    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;

    switch (pNMHDR->idFrom) {
        case ID_TOGGLE_SYLK_EXPORT:
            pTTT->lpszText = toolTextToggleExportSylk;
            return TRUE;
        case ID_WINDOW_CLEAR:
            pTTT->lpszText = toolTextClearWindow;
            return TRUE;
        case ID_CONNECT_LAN_ON:
            pTTT->lpszText = toolTextConnectLan;
            return TRUE;
    }
    // if we do not handle the message then return FALSE to let someone else do it.
    return FALSE;
}

レポートを実行するときにファイルのエクスポートを切り替えるメニュー項目に関するユーザーフィードバックのために、メッセージマップに次の変更を加えてから、必要なメソッドを実装しました。関連するメッセージには2つのタイプがあるため、2つのメソッドと2つの新しいメッセージマップエントリを追加する必要がありました。

// New message map entries to handle the menu item selection event
// and to update the menu item and the toolbar icon with state changes
ON_COMMAND(ID_TOGGLE_SYLK_EXPORT, OnToggleExportSylk)
ON_UPDATE_COMMAND_UI(ID_TOGGLE_SYLK_EXPORT, OnUpdateToggleExportSylk)


// New methods added to the CView derived class

// handle the menu selection event generated by either selecting the menu item
// from the menu or by clicking on the icon in the toolbar.
void CPCSampleView::OnToggleExportSylk()
{
    // Exclusive Or to toggle the indicator bit from 0 to 1 and 1 to 0.
    GetDocument()->ulReportOptionsMap ^= CPCSampleDoc::ulReportOptionsExportSylk;
}

// handle the request from the MFC framework to update the displayed state this
// not only does a check mark against the menu item it also causes the toolbar
// icon to appear depressed if click is set or non-depressed if click is not set
inline void CPCSampleView::OnUpdateToggleExportSylk (CCmdUI* pCmdUI) 
{
    if (GetDocument()->ulReportOptionsMap & CPCSampleDoc::ulReportOptionsExportSylk)
    {
        // SYLK export is turned on so indicate status to the user. This will
        // put a check mark beside the menu item and show the toolbar button depressed
        pCmdUI->SetCheck (1);
    }
    else
    {
        // SYLK export is turned off so indicate status to the user.  This will
        // remove the check mark beside the menu item and show the toolbar button as raised.
        pCmdUI->SetCheck (0);
    }
}

トグルアクション用の新しいボタンを提供し、トグルアクション用の新しいメニュー項目を追加するには、リソースファイルの変更が必要でした。これらはすべて別々であるため、私はいくつかの異なることに同じリソースIDを使用しています。したがって、リソース文字列のIDはメニュー項目のIDと同じであり、ツールバーボタンのIDも同じであるため、私の生活を簡素化し、すべての特定の部分を簡単に見つけることができます。

ツールバーのリソースファイルの定義は次のようになります。

IDR_MAINFRAME TOOLBAR  16, 15
BEGIN
    BUTTON      ID_CONNECT_LAN_ON
    SEPARATOR
    BUTTON      ID_WINDOW_CLEAR
    SEPARATOR
    BUTTON      ID_TOGGLE_SYLK_EXPORT
    SEPARATOR
    BUTTON      ID_APP_ABOUT
END

また、トグルイベントIDに同じリソースIDを使用するメニューの特定の部分は、次のようになります。

MENUITEM "Export to SYLK file",         ID_TOGGLE_SYLK_EXPORT

次に、マウスを上に置いて表示されるステータスバーのテキストを提供するために、文字列テーブルが追加されます。

ID_TOGGLE_SYLK_EXPORT   "Toggle export of SYLK format report files for spreadsheets."

構造体のlpszTextメンバーは、構造体のMSDNドキュメントで次のように説明されていますTOOLINFO

ツールのテキストを含むバッファーへのポインター、またはテキストを含む文字列リソースの識別子。このメンバーは、値を返すために使用されることがあります。戻り値を調べる必要がある場合は、十分なサイズの有効なバッファーを指している必要があります。それ以外の場合は、NULLに設定できます。lpszTextがLPSTR_TEXTCALLBACKに設定されている場合、コントロールはTTN_GETDISPINFO通知コードを所有者ウィンドウに送信してテキストを取得します。

この質問に対する既存の回答を確認して、フラグのifステートメントチェックについて疑問に思いました。TTF_IDISHWND構造体のMSDNドキュメントには、次のTOOLINFOように書かれています。

uIdメンバーがツールのウィンドウハンドルであることを示します。このフラグが設定されていない場合、uIdはツールの識別子です。

于 2015-08-08T18:43:24.210 に答える