古いMFCアプリケーションのメニューからいくつかのメニュー項目を繰り返すツールバーを使用して、ツールチップのこの問題に取り組み、(1)追加のアイコンを含むようにツールバーのビットマップを変更し、(2)現在のユーザーフィードバックを提供しますアプリケーションの状態。私の問題は、さまざまなウィザードやツールを使用するのではなく、これのほとんどを手作業で行わなければならないことです。
私が行ったことは、(1)追加のメッセージを処理するためにCView派生クラスに新しいメンバーを追加すること、(2)MSペイントとリソースエディターの両方を使用して追加のアイコンを追加するようにツールバーのビットマップを変更すること、および(3)追加することです。 CView派生クラスのメッセージマップへの新しいイベントIDとイベントハンドラー。
ツールバーのビットマップの変更で遭遇した問題の1つは、アイコンを挿入していたため、ビットマップ内の既存のアイコンを右にシフトする必要があることでした。これを最初に試みた結果、シフトされたアイコンがアプリケーションツールバーに空白として表示されました。次に、ツールバービットマップの長さをもう少し追加する必要があることに気付きました。ツールバービットマップの最後のアイコンにさらにいくつかの列を追加して、ピクセル単位の標準幅にした後、アイコンは正しく表示されました。
ツールチップについては、メッセージマップに次を追加しました。
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText)
次に、メニュー項目の通知を処理するために、次のメソッドをクラスに追加しました。ちなみに、これはクラスでOnToolTipText()
使用される標準メソッドであるように見えますが、クラスはそのように派生しているため、メソッドの名前に違いがあるとは思えません。CFrameWnd
CMDIChildWnd
CView
CWnd
CFrameWnd
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はツールの識別子です。