windows8/8.1時代のwin32プログラミング #sapporocpp

41
[1] hiyohiyo Twitter: @openlibsys http://crystalmark.info/ Sapporo.cpp 札幌C++勉強会 #6

Upload: hiyohiyo

Post on 28-May-2015

23.349 views

Category:

Software


3 download

DESCRIPTION

Win8/8.1 の新機能を交えながら Win32 デスクトップアプリの UI 構築について紹介します。今更ではない!! 今だからこそ Win32!! Sapporo.cpp 札幌C++勉強会 #6 における発表資料です。 [2014/04/20 22:53] 33ページ目の preTime/currentTime の型を int から DWORD (unsinged int) に修正しました。

TRANSCRIPT

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

[1]

hiyohiyoTwitter: @openlibsys

http://crystalmark.info/

Sapporo.cpp 札幌C++勉強会 #6

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

[2]

本日のお品書き

自己紹介

なぜWin32?

Win8/8.1新機能

まとめ

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

[3]

自己紹介

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

[4]

自己紹介

名前:hiyohiyo/ひよひよ

年齢:35歳

家族:妻, 愛娘, 愛息子

趣味:フリーソフト開発 (約16年)

住所:北海道札幌市

□代表作: CrystalDiskInfo, CrystalDiskMark 他(通称 Crystal シリーズ)

パソコンがもっと好きになるフリーソフトを一貫して開発しています

Microsoft MVP for Visual C++Jan 2014 – Dec 2014

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

[5]

Crystal Dew World 公式応援キャラクター

水晶雫

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

[6]

【宣伝】第二世代萌え駆動開発

http://www.slideshare.net/hiyohiyo/mddwin32

ソフトウェア開発で一番大切なことを紹介しています!!

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

[7]

CrystalMark 2004

ランキング対応ベンチマーク

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

[8]

CrystalCPUID

CPU情報ツール

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

[9]

CrystalDiskMark 3 Shizuku Edition

新世代ディスクベンチマーク

ベンチマーク結果なんておまけですwww

通常版

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

[10]

CrystalDiskInfo 6 Shizuku Edition

HDDやSSDの健康状態を音声で教えてくれる!!

新世代ディスク情報ツール

通常版

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

[11]

なぜWin32?

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

[12]

Win32 について

出典:Build 2014 - Windows Desktop Development Platform Advances

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

[13]

Win32 最大の魅力

Win32/DirectX 9.0c

萌えるゲーム

その他Windows XP のサポートは終了しましたが、DirectX 9.0c の時代はまだ続きそうな予感!?【余談】最近は 1280x720 のゲームも増え、2560x1600/1440 や3840x2160 環境では整数倍拡大が出来て良い感じです!!

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

[14]

デスクトップアプリ

C++/Win32

MFCC#/VB.NET

.NET Framework

HTML(CSS+JS)

GDI/GDI+ WinForms WPF

ネイティブ マネージド

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

[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 対応)

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

[16]

HTML + CSS + JavaScript で UI 構築

CSS によりデザインを容易に変更可能 DirectWrite による美しいフォント (IE9以降) JavaScript ライブラリが利用可能

IE の設定に影響を受ける⇒ 画像表示設定など

IE のバージョンにより挙動が異なる⇒ IE6/7/8/9/10/11⇒ Win7/8 で挙動が異なることもorz

IE が存在しない環境では動作しない⇒ Server Core など

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

[17]

GDI で UI 構築

これでは萌えられません!!

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

[18]

なぜ今更 GDI/GDI+ なのか!?

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

[19]

良くある要望 – あなたならどうしますか?

どっ、どうしたら・・・

やぁ。あなたのソフトを WinPE で使いたいんだが WoW64が入っていない んだ。ネイティブ x64 バイナリを作ってくれないかい?

やぁ。あなたのソフトを Server Core で使おうと思ったんだけど動かないんだ。なんとか対応してくれないかい?

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

[20]

Server Core とは?Windows Server 2008/2012 をサーバーとして動作させるために

必要な最小限の機能のみをインストールするオプションです。GUI 機能は大きく制限されており、IE や WinForms/WPF は使えません。

※WinPE は使ったことがないので解説は割愛させていただきます m(_ _)m

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

[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+ ◎ ◎

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

[22]

Win32 の進化

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

[23]

Windows 8/8.1 の Win32 的新機能

■Windows 8• コントロールのレイヤードウィンドウ対応

■Windows 8.1• DPI 設定の異なるディスプレイに対応• HiDPI 対応 (~200%)

■Windows 8.1 Update• HiDPI 対応 (~250%)

ついに HiDPI 時代到来です!!

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

[24]

待望の HiDPI サポート強化!!

出典:Build 2014 - Windows Desktop Development Platform Advances

Windows 8.1 Updateでまさかの250%対応!!

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

[25]

DPI 設定

コントロールパネル > ディスプレイ

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

[26]

こんなアプリは嫌だ!!

出典:http://msdn.microsoft.com/ja-JP/library/dn469266.aspx

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

[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)

新機能を使うために必須

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

[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 からコントロールのレイヤードウィンドウに対応

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

[29]

HiDPI 対応

100% 200%

拡大率ごとに画像を用意しているので、HiDPI環境でもクッキリ!!配布サイズはちょっと大きいですけど…

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

[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

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

[31]

HiDPI 対応

今どき固定ピクセルレイアウトなんて……

フレームワークのサポートなどという軟弱なものは不要!! 漢らしく自己管理です!!WPF羨ましいです…

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

[32]

Per-Monitor DPI (Win8.1 以降)

96 dpi (100%) 192 dpi (200%)

DPI境界を跨ぐたびに適切な拡大率に調整

タイトルバーとメニューバーのサイズは共通⇒ 大きすぎる/小さすぎるという問題が発生⇒ 全て自前で描画するしかない (未対応)

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

[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 を無視することで無限ループを回避

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

[34]

UI で目立ちたいですよね?

これでは人気が出ません!!

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

[35]

透過 PNG 対応ボタン

CButtonCx* クラス (GDI+&オーナードローで透過PNG 表示に対応)

1. ボタンの背景をバックバッファに描画2. 背景と透過 PNG 画像をアルファブレンド (自前)3. GDI もしくは GDI+ で文字列描画 (DirectWrite への対応は検討中)4. 表示 (ダブルバッファ対応)

*ソフト屋 巣さん http://softyasu.net/ の CAlphaButton を参考にさせていただきました。

今どきのライブラリなら全部やってくれるんですけどね…

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

[36]

めでたく Server Core でも動作!!

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

[37]

まとめ

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

[38]

まとめ

Win32は熱い!!と思います...

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

[39]

参考文献

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

[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

参考文献

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

[41]

ご清聴ありがとうございました