モダン(だと思う)Windowsネイティブアプリ開発Tips
C++言語機能
リファレンス
- C++23 - cpprefjp C++日本語リファレンス
- C++20 - cpprefjp C++日本語リファレンス
- C++17 - cpprefjp C++日本語リファレンス
- C++14 - cpprefjp C++日本語リファレンス
- C++11 - cpprefjp C++日本語リファレンス
文字列(C++17)
std::wstring::data()
はNUL終端が保証されているらしい。
C++標準文字列:c_str, data, operator[] - yohhoyの日記
従って、そのままstd::wstring_view
を経由してlpsz
なWindows APIに渡してもOK。
生ワイド文字列リテラル(C++11)
例:
LR"(\StringFileInfo\040004b0\ProductVersion)"
なるべく厳密なコードにする
#include <windows.h>
の前に下記を定義しておく。
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
#define STRICT 1
#define STRICT_TYPED_ITEMIDS
ライブラリ
リソース(ハンドル)はmicrosoft/wil: Windows Implementation Libraryがおすすめ。
std::unique_ptr
と同じように使える。
日本語の記事は WIL (Windows Implementation Libraries)関係の記事 - potisanのプログラミングメモ が詳しい。
リソースファイル(.rc)のgit管理
.rcファイルはデフォルトのエンコーディングがUTF-16なので、下記を行ってUTF-8化する。
- 手動でUTF-8(BOM無し)に変更する
- 先頭に
#pragma code_page(65001)
を書く - 参考: リソーススクリプトの utf-8 指定とか - ※ただの日記ブログです※
高DPI対応
お手軽対応
プロジェクトファイルの[マニフェストツール] - [入出力] - [DPI認識]で、[高い DPI 認識]に設定する。
[高い DPI 認識]の場合、<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
が出力される。
[モニターごとの高い DPI 認識]の場合、<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
が出力される。
本格対応
ビジュアルスタイルのお手軽対応
ソースコードのどこかに書いておく。
(ただし、lld-link.exeでリンクできなくなる)
#pragma comment(linker, "/manifestdependency:\"type='win32' \
name='Microsoft.Windows.Common-Controls' \
version='6.0.0.0' \
processorArchitecture='*' \
publicKeyToken='6595b64144ccf1df' \
language='*'\"")
互換性マニフェスト
Windows 用アプリケーションのターゲット設定 - Win32 apps | Microsoft Docs
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
</application>
</compatibility>
</assembly>
パッケージ管理
microsoft/vcpkg: C++ Library Manager for Windows, Linux, and MacOS
プロセスコードページを UTF-8 に設定する
通常のANSIコードページはShift JIS(CP932)だが、UTF-8 に変更することができる。
Windows UTF-8 コードページを使用する - UWP applications | Microsoft Docs
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity type="win32" name="..." version="6.0.0.0"/>
<application>
<windowsSettings>
<activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
</windowsSettings>
</application>
</assembly>
おまけ
古いMSDNを日本語で読みたい場合はWebArchive
Path系API(PathAppend
とかPathCombine
とか)で、MAX_PATH
超えの文字列を扱う新し目のAPI。
GDIスケーリングというのがあるらしい。