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

Software

hiyohiyo
of 41
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