Más contenido relacionado
La actualidad más candente (20)
Similar a Windows8/8.1時代のWin32プログラミング #sapporocpp (20)
Windows8/8.1時代のWin32プログラミング #sapporocpp
- 15. [15]
Visual C++/Win32 における UI 構築
CrystalDiskInfo 1~5 CrystalDiskInfo 6
開発環境 Visual C++/MFC Visual C++/MFC
ベースクラス CDHtmlDialog ベース独自拡張 CDialogEx ベース独自拡張
レイアウト HTML + CSS + JavaScript ピクセル固定
HiDPI 対応 OpticalZoom (IE8 以降) 自前拡大 (Per-Monitor DPI 対応)
文字列描画 DirectWrite (IE9 以降)
GDI/GDI+
(DirectWrite 対応検討中…)
画像表示 IEコンポーネント GDI+
ボタン
PNG画像
透過PNG対応 (IE7 以降)
CButton ベース独自拡張
(背景描画+透過 PNG 対応)
- 16. [16]
HTML + CSS + JavaScript で UI 構築
CSS によりデザインを容易に変更可能
DirectWrite による美しいフォント (IE9以降)
JavaScript ライブラリが利用可能
IE の設定に影響を受ける
⇒ 画像表示設定など
IE のバージョンにより挙動が異なる
⇒ IE6/7/8/9/10/11
⇒ Win7/8 で挙動が異なることもorz
IE が存在しない環境では動作しない
⇒ Server Core など
- 20. [20]
Server Core とは?
Windows Server 2008/2012 をサーバーとして動作させるために
必要な最小限の機能のみをインストールするオプションです。
GUI 機能は大きく制限されており、IE や WinForms/WPF は使えません。
※WinPE は使ったことがないので解説は割愛させていただきます m(_ _)m
- 23. [23]
Windows 8/8.1 の Win32 的新機能
■Windows 8
• コントロールのレイヤードウィンドウ対応
■Windows 8.1
• DPI 設定の異なるディスプレイに対応
• HiDPI 対応 (~200%)
■Windows 8.1 Update
• HiDPI 対応 (~250%)
ついに HiDPI 時代到来です!!
- 27. [27]
まにふぇすと
Windows 8/8.1 の新機能を使用するためにはマニフェストでの設定が必要
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"
xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>True/PM</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
</application>
</compatibility>
</assembly>
FALSE: HiDPI 未対応, TRUE: HiDPI 対応
Per-Monitor: Per-Monitor DPI 対応 (8/8.1), HiDPI 未対応 (Vista/7)
True/PM: Per-Monitor DPI 対応 (8/8.1), HiDPI 対応 (Vista/7)
新機能を使うために必須
- 28. [28]
Win32 コントロールの透過
Win7 以前 Win8 以降
// ウィンドウ(コントロール)に WS_EX_LAYERED を設定する
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE)|WS_EX_LAYERED);
// ウィンドウ(コントロール)を 70% 透過させる
SetLayeredWindowAttributes(hwnd, 0, (255 * 70) / 100, LWA_ALPHA);
リストコントロールが透過
Win8 からコントロールのレイヤードウィンドウに対応
- 30. [30]
固定ピクセルレイアウト & HiDPI 対応
m_CtrlFirmware.InitControl (256 + OFFSET_X, 88, 180, 20, m_ZoomRatio,
m_CtrlSerialNumber.InitControl(256 + OFFSET_X, 112, 180, 20, m_ZoomRatio,
m_CtrlInterface.InitControl (256 + OFFSET_X, 136, 180, 20, m_ZoomRatio,
m_CtrlTransferMode.InitControl(256 + OFFSET_X, 160, 180, 20, m_ZoomRatio,
m_CtrlDriveMap.InitControl (256 + OFFSET_X, 184, 180, 20, m_ZoomRatio,
m_CtrlAtaAtapi.InitControl (256 + OFFSET_X, 208, 408, 20, m_ZoomRatio,
m_CtrlFeature.InitControl (256 + OFFSET_X, 232, 408, 20, m_ZoomRatio,
x Y W H Zoom
Width=180*m_ZoomRatio
Height=20*m_ZoomRatio
X=(256+OFFSET_X)*m_ZoomRatio
Y=88*m_ZoomRatio
OFFSET_X
- 32. [32]
Per-Monitor DPI (Win8.1 以降)
96 dpi (100%) 192 dpi (200%)
DPI境界を跨ぐたびに適切な拡大率に調整
タイトルバーとメニューバーのサイズは共通
⇒ 大きすぎる/小さすぎるという問題が発生
⇒ 全て自前で描画するしかない (未対応)
- 33. [33]
afx_msg LRESULT CDialogCx::OnDpiChanged(WPARAM wParam, LPARAM lParam)
{
static DWORD preTime = 0;
DWORD currentTime = GetTickCount();
if (currentTime - preTime < 1000){
return 0;
}else{
preTime = currentTime;
}
m_Dpi = (INT)HIWORD(wParam);
if(m_ZoomType == ZOOM_TYPE_AUTO){
DWORD oldZoomRatio = (DWORD)(m_ZoomRatio * 100);
if (ChangeZoomType(m_ZoomType) != oldZoomRatio){
UpdateDialogSize();
}
}
return 0;
}
Per-Monitor DPI 対応方法
WM_DPICHANGED(=0x02E0)を契機にウィンドウ&コントロールを調整
BEGIN_MESSAGE_MAP(CDialogCx, CDialog)
ON_MESSAGE(WM_DPICHANGED, &CDialogCx::OnDpiChanged)
END_MESSAGE_MAP()
ウィンドウ&コントロールのサイズを調整
もちろんフォントサイズも!!
過去1秒分の WM_DPICHANGED を
無視することで無限ループを回避
- 35. [35]
透過 PNG 対応ボタン
CButtonCx* クラス (GDI+&オーナードローで透過PNG 表示に対応)
1. ボタンの背景をバックバッファに描画
2. 背景と透過 PNG 画像をアルファブレンド (自前)
3. GDI もしくは GDI+ で文字列描画 (DirectWrite への対応は検討中)
4. 表示 (ダブルバッファ対応)
*ソフト屋 巣さん http://softyasu.net/ の CAlphaButton を参考にさせていただきました。
今どきのライブラリなら全部
やってくれるんですけどね…
- 40. [40]
• Build 2014
2-535 Windows Desktop Development Platform Advances, Steve Wright
http://channel9.msdn.com/Events/Build/2014/2-535
• MSDN
Writing DPI-Aware Desktop and Win32 Applications
http://msdn.microsoft.com/ja-JP/library/dn469266.aspx
• PDC 2008
高 DPI 対応の Win32 アプリケーションを記述する
http://msdn.microsoft.com/ja-jp/windows/dd630126.aspx
参考文献