1

Visual Studio 2010を使用して、ネイティブ/ win32 / MFCC++アプリケーションを作成しています。ユーザーが日付を入力できるようにするダイアログがあります。これを行うために、Win32共通コントロールの単なるラッパーであるCDateTimeCtrlを使用しました。

ユーザーが矢印をクリックすると月表示がドロップダウンし、インタラクティブに日付を選択できるので、これは便利です。

私が遭遇した問題は、月表示で使用されるフォントサイズを制御できないことです。WM_SETFONTを無視し、コントロールのドキュメントにはカスタムフォントを使用するように指示する呼び出しが記載されていますが(CDateTimeCtrl :: SetMonthCalFont()を参照)、それらは無視されます。

私はついに、MSテクニカルサポートインシデントを通じて、それが共通コントロールのv5で機能することを発見しましたが、v6では、これを無視し、Windowsで設定されている現在の視覚スタイル情報を使用するように変更しました。MSによると、カスタムフォントを使用する方法はなく、v6のコントロールは現在のWindowsの視覚スタイルのみを使用します。唯一の方法は、v5コントロールの使用を強制して、アプリ内のすべてのUIをv5コントロールに戻すか、カスタムアクティベーションコンテキストをいじくり回すことです(面倒に聞こえます)。

だから、私は別のコントロールを探しています。似たようなものを提供するが、全体的なフォントサイズをカスタマイズできるネイティブ/ C ++ / MFCコントロールを誰かが推奨できますか?ダイアログと他のすべてのコントロールで通常よりも大きいフォントを使用していますが、このカレンダーコントロールを除いて見栄えがします。これまでのところ、私の最初の検索では、解決策のように見えるものは何も得られませんでした。

4

2 に答える 2

2

SetWindowTheme関数を見てください。その助けを借りて、アプリケーション内の一部のコントロールに対してのみXPテーマを無効にし、他のコントロールを維持することができます。

MSDNによると:

pszSubAppNameとpszSubIdListがNULLの場合、テーママネージャーは以前に適用された関連付けを削除します。どのセクションエントリとも一致しない空の文字列(L "")を指定することにより、視覚的なスタイルが指定されたウィンドウに適用されないようにすることができます。

于 2013-02-25T21:35:02.813 に答える
1

上記のchaからの返信は正しい解決策です。コントロールがSetMonthCalFont呼び出しに従うようにするには、ビジュアルテーマを無効にする必要があります。ただし、いくつかのトリックが関係しています。

1)CDateTimeCtrlオブジェクトでSetWindowThemeを呼び出すことはできません。これは、呼び出しが子ウィンドウではなく、その直接のウィンドウにのみ適用されるためです。月のドロップダウンは子ウィンドウであるため、影響を受けません。したがって、代わりに、コントロールのDTN_DROPDOWN通知を処理し、そこで子の月のコントロールを取得して、そこからビジュアルテーマを削除する必要があります。

2)DTN_DROPDOWN通知が送信される前に、子コントロールのサイズ/位置が決定されます。したがって、上記の#1を実行しても、適切なサイズになりません。したがって、サイズを更新する必要があります。

3)どうやら、MSDNのドキュメントに示されているように見えますが、実際には1つのスペースを持つ文字列ではなく空の文字列を渡すことが目的です。

4)以下のコードは、カレンダーのドロップダウンコントロールが画面の端に近い場合を考慮していません。これが発生した場合、コードを修正して、コードが表示されるように位置をシフトする必要がある可能性があります。

上記の情報は、問題を解決し、カスタムフォントでコントロールを正しく表示する以下のコードとともに、MicrosoftサポートのDaveAndersonによって提供されました。

したがって、ダイアログInitInstance()のCDateTimeCtrlオブジェクトでSetMonthCalFont()を呼び出し、次のコードを使用してDTN_DROPDOWN通知も処理します。

Daveは、「このアプローチは、将来変更される可能性があり、以下のコードが破損する可能性があるDate andTimePickerコントロールの実装の詳細に依存している」という警告を提供したことに注意してください。

void DSomeDialog::OnDtnDropdownMyDateTimeCtrl(NMHDR *pNMHDR, LRESULT *pResult)
{
HWND hWndDateTime = (HWND)pNMHDR->hwndFrom;
HWND hWndMonthCal = DateTime_GetMonthCal(hWndDateTime);
HWND hWndDropDown = ::GetParent(hWndMonthCal);
DWORD dwWidth;
WINDOWINFO wi;

if (hWndMonthCal && hWndDropDown)
{
    RECT rcIdeal;

    //
    //  Remove the window theme from the month calendar 
    //  control
    SetWindowTheme(hWndMonthCal, L"", L"");

    //
    //  Get the ideal size of the month calendar control
    ZeroMemory(&rcIdeal, sizeof(rcIdeal));
    MonthCal_GetMinReqRect(hWndMonthCal, &rcIdeal);
    dwWidth = MonthCal_GetMaxTodayWidth(hWndMonthCal);
    if (dwWidth > (DWORD)rcIdeal.right)
    {
        rcIdeal.right = dwWidth;
    }

    //
    //  Add some padding
    InflateRect(&rcIdeal, 3, 3);

    //
    //  Determine the new size of the drop down window such
    //  that the client area of the window is large enough 
    //  to display the month calendar control
    ZeroMemory(&wi, sizeof(wi));
    wi.cbSize = sizeof(WINDOWINFO);
    ::GetWindowInfo(hWndDropDown, &wi);
    AdjustWindowRectEx(&rcIdeal, wi.dwStyle, FALSE, wi.dwExStyle);

    //
    //  Update the size of the drop down window
    ::SetWindowPos(hWndDropDown,
        NULL, 
        0, 
        0, 
        rcIdeal.right - rcIdeal.left, 
        rcIdeal.bottom - rcIdeal.top, 
        SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER);
}

*pResult = 0;
}
于 2013-03-06T22:26:20.683 に答える