Windows8/8.1時代のWin32プログラミング #sapporocpp

Software

hiyohiyo
  • 1. [1] hiyohiyo Twitter: @openlibsys http://crystalmark.info/ Sapporo.cpp 札幌C++勉強会 #6
  • 2. [2] 本日のお品書き 自己紹介 なぜWin32? Win8/8.1新機能 まとめ
  • 3. [3] 自己紹介
  • 4. [4] 自己紹介 名前:hiyohiyo/ひよひよ 年齢:35歳 家族:妻, 愛娘, 愛息子 趣味:フリーソフト開発 (約16年) 住所:北海道札幌市 □代表作: CrystalDiskInfo, CrystalDiskMark 他(通称 Crystal シリーズ) パソコンがもっと好きになるフリーソフトを一貫して開発しています Microsoft MVP for Visual C++ Jan 2014 – Dec 2014
  • 5. [5] Crystal Dew World 公式応援キャラクター 水晶雫
  • 6. [6] 【宣伝】第二世代萌え駆動開発 http://www.slideshare.net/hiyohiyo/mddwin32 ソフトウェア開発で一番大切 なことを紹介しています!!
  • 7. [7] CrystalMark 2004 ランキング対応ベンチマーク
  • 8. [8] CrystalCPUID CPU情報ツール
  • 9. [9] CrystalDiskMark 3 Shizuku Edition 新世代ディスクベンチマーク ベンチマーク結果なんておまけですwww 通常版
  • 10. [10] CrystalDiskInfo 6 Shizuku Edition HDDやSSDの健康状態を音声で教えてくれる!! 新世代ディスク情報ツール 通常版
  • 11. [11] なぜWin32?
  • 12. [12] Win32 について 出典:Build 2014 - Windows Desktop Development Platform Advances
  • 13. [13] Win32 最大の魅力 Win32/DirectX 9.0c 萌えるゲーム その他 Windows XP のサポートは終了しましたが、 DirectX 9.0c の時代はまだ続きそうな予感!? 【余談】 最近は 1280x720 のゲームも増え、2560x1600/1440 や 3840x2160 環境では整数倍拡大が出来て良い感じです!!
  • 14. [14] デスクトップアプリ C++/Win32 MFC C#/VB.NET .NET Framework HTML (CSS+JS) GDI/GDI+ WinForms WPF ネイティブ マネージド
  • 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 など
  • 17. [17] GDI で UI 構築 これでは萌えられません!!
  • 18. [18] なぜ今更 GDI/GDI+ なのか!?
  • 19. [19] 良くある要望 – あなたならどうしますか? どっ、どうしたら・・・ やぁ。 あなたのソフトを WinPE で使いたいんだが WoW64 が入っていない んだ。 ネイティブ x64 バイナリを作ってくれないかい? やぁ。 あなたのソフトを Server Core で使おうと思ったんだ けど動かないんだ。 なんとか対応してくれないかい?
  • 20. [20] Server Core とは? Windows Server 2008/2012 をサーバーとして動作させるために 必要な最小限の機能のみをインストールするオプションです。 GUI 機能は大きく制限されており、IE や WinForms/WPF は使えません。 ※WinPE は使ったことがないので解説は割愛させていただきます m(_ _)m
  • 21. [21] 良くある要望への回答 神は言っている、 Visual C++ で書けと 真の漢は MASM かもしれないが・・・ Server Core Windows 8.1 Visual C++, GDI/GDI+ ◎ ◎ Visual C++, HTML+CSS × ◎ Visual C#, WinForms × ◎ Visual C#, WPF × ◎ MASM, GDI/GDI+ ◎ ◎
  • 22. [22] Win32 の進化
  • 23. [23] Windows 8/8.1 の Win32 的新機能 ■Windows 8 • コントロールのレイヤードウィンドウ対応 ■Windows 8.1 • DPI 設定の異なるディスプレイに対応 • HiDPI 対応 (~200%) ■Windows 8.1 Update • HiDPI 対応 (~250%) ついに HiDPI 時代到来です!!
  • 24. [24] 待望の HiDPI サポート強化!! 出典:Build 2014 - Windows Desktop Development Platform Advances Windows 8.1 Update でまさかの250%対応!!
  • 25. [25] DPI 設定 コントロールパネル > ディスプレイ
  • 26. [26] こんなアプリは嫌だ!! 出典:http://msdn.microsoft.com/ja-JP/library/dn469266.aspx
  • 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 からコントロールのレイヤードウィンドウに対応
  • 29. [29] HiDPI 対応 100% 200% 拡大率ごとに画像を用意している ので、HiDPI環境でもクッキリ!! 配布サイズはちょっと大きいですけど…
  • 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
  • 31. [31] HiDPI 対応 今どき固定ピクセル レイアウトなんて…… フレームワークのサポート などという軟弱なものは不要!! 漢らしく自己管理です!! WPF羨ましいです…
  • 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 を 無視することで無限ループを回避
  • 34. [34] UI で目立ちたいですよね? これでは人気が出ません!!
  • 35. [35] 透過 PNG 対応ボタン CButtonCx* クラス (GDI+&オーナードローで透過PNG 表示に対応) 1. ボタンの背景をバックバッファに描画 2. 背景と透過 PNG 画像をアルファブレンド (自前) 3. GDI もしくは GDI+ で文字列描画 (DirectWrite への対応は検討中) 4. 表示 (ダブルバッファ対応) *ソフト屋 巣さん http://softyasu.net/ の CAlphaButton を参考にさせていただきました。 今どきのライブラリなら全部 やってくれるんですけどね…
  • 36. [36] めでたく Server Core でも動作!!
  • 37. [37] まとめ
  • 38. [38] まとめ Win32は熱い!! と思います...
  • 39. [39] 参考文献
  • 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 参考文献
  • 41. [41] ご清聴ありがとうございました
    Please download to view
  • 41
    All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
    Description
    Win8/8.1 の新機能を交えながら Win32 デスクトップアプリの UI 構築について紹介します。今更ではない!! 今だからこそ Win32!!

    Sapporo.cpp 札幌C++勉強会 #6 における発表資料です。

    [2014/04/20 22:53] 33ページ目の preTime/currentTime の型を int から DWORD (unsinged int) に修正しました。
    Text
    • 1. [1] hiyohiyo Twitter: @openlibsys http://crystalmark.info/ Sapporo.cpp 札幌C++勉強会 #6
  • 2. [2] 本日のお品書き 自己紹介 なぜWin32? Win8/8.1新機能 まとめ
  • 3. [3] 自己紹介
  • 4. [4] 自己紹介 名前:hiyohiyo/ひよひよ 年齢:35歳 家族:妻, 愛娘, 愛息子 趣味:フリーソフト開発 (約16年) 住所:北海道札幌市 □代表作: CrystalDiskInfo, CrystalDiskMark 他(通称 Crystal シリーズ) パソコンがもっと好きになるフリーソフトを一貫して開発しています Microsoft MVP for Visual C++ Jan 2014 – Dec 2014
  • 5. [5] Crystal Dew World 公式応援キャラクター 水晶雫
  • 6. [6] 【宣伝】第二世代萌え駆動開発 http://www.slideshare.net/hiyohiyo/mddwin32 ソフトウェア開発で一番大切 なことを紹介しています!!
  • 7. [7] CrystalMark 2004 ランキング対応ベンチマーク
  • 8. [8] CrystalCPUID CPU情報ツール
  • 9. [9] CrystalDiskMark 3 Shizuku Edition 新世代ディスクベンチマーク ベンチマーク結果なんておまけですwww 通常版
  • 10. [10] CrystalDiskInfo 6 Shizuku Edition HDDやSSDの健康状態を音声で教えてくれる!! 新世代ディスク情報ツール 通常版
  • 11. [11] なぜWin32?
  • 12. [12] Win32 について 出典:Build 2014 - Windows Desktop Development Platform Advances
  • 13. [13] Win32 最大の魅力 Win32/DirectX 9.0c 萌えるゲーム その他 Windows XP のサポートは終了しましたが、 DirectX 9.0c の時代はまだ続きそうな予感!? 【余談】 最近は 1280x720 のゲームも増え、2560x1600/1440 や 3840x2160 環境では整数倍拡大が出来て良い感じです!!
  • 14. [14] デスクトップアプリ C++/Win32 MFC C#/VB.NET .NET Framework HTML (CSS+JS) GDI/GDI+ WinForms WPF ネイティブ マネージド
  • 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 など
  • 17. [17] GDI で UI 構築 これでは萌えられません!!
  • 18. [18] なぜ今更 GDI/GDI+ なのか!?
  • 19. [19] 良くある要望 – あなたならどうしますか? どっ、どうしたら・・・ やぁ。 あなたのソフトを WinPE で使いたいんだが WoW64 が入っていない んだ。 ネイティブ x64 バイナリを作ってくれないかい? やぁ。 あなたのソフトを Server Core で使おうと思ったんだ けど動かないんだ。 なんとか対応してくれないかい?
  • 20. [20] Server Core とは? Windows Server 2008/2012 をサーバーとして動作させるために 必要な最小限の機能のみをインストールするオプションです。 GUI 機能は大きく制限されており、IE や WinForms/WPF は使えません。 ※WinPE は使ったことがないので解説は割愛させていただきます m(_ _)m
  • 21. [21] 良くある要望への回答 神は言っている、 Visual C++ で書けと 真の漢は MASM かもしれないが・・・ Server Core Windows 8.1 Visual C++, GDI/GDI+ ◎ ◎ Visual C++, HTML+CSS × ◎ Visual C#, WinForms × ◎ Visual C#, WPF × ◎ MASM, GDI/GDI+ ◎ ◎
  • 22. [22] Win32 の進化
  • 23. [23] Windows 8/8.1 の Win32 的新機能 ■Windows 8 • コントロールのレイヤードウィンドウ対応 ■Windows 8.1 • DPI 設定の異なるディスプレイに対応 • HiDPI 対応 (~200%) ■Windows 8.1 Update • HiDPI 対応 (~250%) ついに HiDPI 時代到来です!!
  • 24. [24] 待望の HiDPI サポート強化!! 出典:Build 2014 - Windows Desktop Development Platform Advances Windows 8.1 Update でまさかの250%対応!!
  • 25. [25] DPI 設定 コントロールパネル > ディスプレイ
  • 26. [26] こんなアプリは嫌だ!! 出典:http://msdn.microsoft.com/ja-JP/library/dn469266.aspx
  • 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 からコントロールのレイヤードウィンドウに対応
  • 29. [29] HiDPI 対応 100% 200% 拡大率ごとに画像を用意している ので、HiDPI環境でもクッキリ!! 配布サイズはちょっと大きいですけど…
  • 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
  • 31. [31] HiDPI 対応 今どき固定ピクセル レイアウトなんて…… フレームワークのサポート などという軟弱なものは不要!! 漢らしく自己管理です!! WPF羨ましいです…
  • 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 を 無視することで無限ループを回避
  • 34. [34] UI で目立ちたいですよね? これでは人気が出ません!!
  • 35. [35] 透過 PNG 対応ボタン CButtonCx* クラス (GDI+&オーナードローで透過PNG 表示に対応) 1. ボタンの背景をバックバッファに描画 2. 背景と透過 PNG 画像をアルファブレンド (自前) 3. GDI もしくは GDI+ で文字列描画 (DirectWrite への対応は検討中) 4. 表示 (ダブルバッファ対応) *ソフト屋 巣さん http://softyasu.net/ の CAlphaButton を参考にさせていただきました。 今どきのライブラリなら全部 やってくれるんですけどね…
  • 36. [36] めでたく Server Core でも動作!!
  • 37. [37] まとめ
  • 38. [38] まとめ Win32は熱い!! と思います...
  • 39. [39] 参考文献
  • 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 参考文献
  • 41. [41] ご清聴ありがとうございました
  • Comments
    Top