ユーザーがWindowsのフォントサイズを通常のフォントから特大のフォントに変更したときに検出する方法を決定しようとしています。フォントサイズは、WindowsXPマシンで次の手順を実行することによって選択されます。
- デスクトップを右クリックして、[プロパティ]を選択します。
- [外観]タブをクリックします。
- フォントサイズを選択します:通常/大きいフォント/特大フォント
フォントサイズを変更するとDPIが変更されると理解しているので、これまでに試したことは次のとおりです。
私の目標:
Windowsのフォントサイズが通常のフォントから大きいフォントまたは特大のフォントに変更されたことを検出し、そのフォントサイズの変更に基づいていくつかのアクションを実行したいと思います。Windowsのフォントサイズが変わると、DPIも変わると思います(特にサイズが特大フォントの場合)
私がこれまでに試したこと:
WM_SETTINGCHANGE、WM_NCCALCSIZE、WM_NCPAINTなどを含むいくつかのメッセージを受け取りますが、これらのメッセージはいずれも、フォントサイズが変更されたとき、つまり、何が変更されたかを知りたいWM_SETTINGSCHANGEメッセージを受け取ったときの状況に固有のものではありません。
理論的には、OnSettingChangeを定義し、Windowsがそれを呼び出すと、lpszSectionは変更セクションが何であるかを教えてくれますが、それは正常に機能しますが、SystemParametersInfoを呼び出して特定のセクションを確認し、アクションSPI_GETNONCLIENTMETRICSを渡します。デバッガーと私は、返されたNONCLIENTMETRICSのデータでフォントの変更がないかどうかを確認しますが、何も発生しません。
それがうまくいかなかったとしても、設定が変更されたときにDPIを確認できるはずです。他の詳細については気にしません。WM_SETTINGCHANGEメッセージを受け取るたびに、DPIを確認して、実行したいアクションを実行するだけですが、システムDPIも取得できません。
DCごとにGetSystemMetricsメソッドを呼び出して、DPIを取得しようとしました。
デスクトップDC->GetDeviceCapsLOGPIXELSX/LOGPIXELSYウィンドウDC->GetDeviceCapsLOGPIXELSX/LOGPIXELSY現在のDC->GetDeviceCapsLOGPIXELSX / LOGPIXELSY
グラフィックプロパティウィンドウでDPIを変更しても、これらの値は何も変わらず、常に96と表示されます。
誰かが私がこれを理解するのを手伝ってくれませんか?何を探すべきですか?どこを見ればいいの?
afx_msg void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
{
int windowDPI = 0;
int deviceDPI = 0;
int systemDPI = 0;
int desktopDPI = 0;
int dpi_00_X = 0;
int dpi_01_X = 0;
int dpi_02_X = 0;
int dpi_03_X = 0;
CDC* windowDC = CWnd::GetWindowDC(); // try with window DC
HDC desktop = ::GetDC(NULL); // try with desktop DC
CDC* device = CWnd::GetDC(); // try with current DC
HDC hDC = *device; // try with HDC
if( windowDC )
{
windowDPI = windowDC->GetDeviceCaps(LOGPIXELSY);
// always 96 regardless if I change the Font
// Size to Extra Large Fonts or keep it at Normal
dpi_00_X = windowDC->GetDeviceCaps(LOGPIXELSX); // 96
}
if( desktop )
{
desktopDPI = ::GetDeviceCaps(desktop, LOGPIXELSY); // 96
dpi_01_X = ::GetDeviceCaps(desktop, LOGPIXELSX); // 96
}
if( device )
{
deviceDPI = device->GetDeviceCaps(LOGPIXELSY); // 96
dpi_02_X = device->GetDeviceCaps(LOGPIXELSX); // 96
}
systemDPI = ::GetDeviceCaps(hDC, LOGPIXELSY); // 96
dpi_03_X = ::GetDeviceCaps(hDC, LOGPIXELSX); // 96
CWnd::ReleaseDC(device);
CWnd::ReleaseDC(windowDC);
::ReleaseDC(NULL, desktop);
::ReleaseDC(NULL, hDC);
CWnd::OnWinSettingChange(uFlags, lpszSection);
}
DPIは常に96を返しますが、フォントサイズを特大フォントに変更した場合、またはDPIを(グラフィックスプロパティから)120に変更した場合、設定の変更は有効になります。