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