C++ Windows プログラミング 書いて覚えるための初心者自己中記事
Windowsデベロッパーセンターで初心者向けの1からの説明ページがあったから、そこで勉強する。
まず開発環境を準備する。
Windows SDKを入れましょう、ダウンロードはここから、みたいなのあるけど、よくわからない。リンク先はwindows7 とか書いてあるし、visual studioってそのへんどうなってるんだ?
visual studio のインストーラ起動すると、windows10 SDK とか入ってるからこれでいいってことだよね?
入ってるということにしておこう。
Windowsにおけるコーディング規約
WinDef.h で型がtypedefされまくっているからびっくりしないでね、って書いてる。
データ型 | サイズ | 符号の有無 |
---|---|---|
BYTE | 8 ビット | 符合なし |
DWORD | 32 ビット | 符合なし |
INT32 | 32 ビット | 符号付き |
INT64 | 64 ビット | 符号付き |
LONG | 32 ビット | 符号付き |
LONGLONG | 64 ビット | 符号付き |
UINT32 | 32 ビット | 符合なし |
UINT64 | 64 ビット | 符合なし |
ULONG | 32 ビット | 符合なし |
ULONGLONG | 64 ビット | 符合なし |
WORD | 16 ビット | 符合なし |
上記以外でBOOL
#define FALSE 0
#define TRUE 1
こうなっている。
BOOLは整数型でC++ のboolと入れ替えが出来ないと書いてある。
??C++のboolは違うんだっけ?
ポインター型もtypedefされててプレフィクスにP-やらLP-やらが付いてる。
LP-は16ビットWindows時代の名残で、今は区別ないらしい。
ポインター精度の型
- DWORD_PTR
- INT_PTR
- LONG_PTR
- ULONG_PTR
- UINT_PTR
これらはポインターの長さと同じになる。???
32ビットアプリケーションの場合は32ビット
64ビットの場合は64ビット
というかポインターの長さってなんだ?
とりあえず、これらの型は整数値からポインタへのキャスト時に使われる。
visual C++コンパイラはワイド文字用のデータ型 wchar_t をサポートしている。WinNT.hでは
typedef wcha_t WCHAR;
としている。
ワイド文字を宣言する場合、リテラルの前に L をつける。
wchar_t a = L'a';
wchar_t *str = L"hello";
Typedef | 定義 |
---|---|
CHAR | char |
PSTR または LPSTR | char * |
PCSTR または LPCSTR | const char* |
PWSTR または LPWSTR | wchar_t* |
PCWSTR または LPCWSTR | const wchar_t* |
ウィンドウのタイトルバーテキストを設定する関数は2種類ある。
#ifdef UNICODE #define SetWindowText SetWindowTextW #else #define SetWindowText SetWindowTextA #endif
ウィンドウとは
アプリケーションウィンドウ(メインウィンドウ)
フレームは非クライアント領域(OSが管理)
フレームの内側がクライアント領域(プログラムで管理)
コントロールウィンドウ
単独で存在できない。
コントロールウィンドウとアプリケーションウィンドウは相互対話が可能。
親ウィンドウとオーナーウィンドウ
コントロールウィンドウはアプリケーションウィンドウの子
アプリケーションウィンドウはコントロールウィンドウの親
Dialog Boxって表示されてるウィンドウはモーダルダイアログ
この場合、アプリケーションウィンドウはオーナー
モーダルダイアログは「オーナーに所有されている」
所有されているウィンドウは、常にオーナーの前面に表示されオーナーが最小化されると追従する。オーナーが破棄されると同時に破棄される。
上の画像はアプリケーションウィンドウがモーダルダイアログウィンドウを所有していて、モーダルダイアログウィンドウは2つのボタンウィンドウの親。
ウィンドウはオブジェクト。
C++のクラスではない。
プログラムはハンドルと呼ばれる値でウィンドウを参照する。
ウィンドウハンドルのデータ型はHWND
ウィンドウを作成する関数の戻り値がHWND型
HWND CreateWindow(.........)
HWND CreateWindowEx(.........)
画面上でウィンドウを再配置する関数は
MoveWindow
BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
これらのようにHWND型の引数がある関数でウィンドウは操作できる。
WinMain アプリケーションエントリポイント
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
まず、第一引数
HINSTANCE hInstance
インスタンスへのハンドル、またはモジュールへのハンドル
OSはこの値を使用してメモリに読み込まれた実行可能ファイルを特定する。?
第二引数
HINSTANCE hPrevInstance
16ビットWindows時代に使われていた。現在は無意味。
第三引数
PWSTR pCmdLine
第四引数
int nCmdShow
メインアプリケーションウィンドウの最大化・最小化・通常表示を指定するフラグ。
このwWinMain関数の戻り値は別のプログラムのステータスコードとして使用できる。
WINAPIは呼び出し規約。呼び出し側からのパラメータをどう受け取るかを定義。
それ以外は同じ。
コマンドライン引数のUnicodeコピーはGetCommandLine関数で取得できる。
コンパイラがmain関数ではなくwWinMain関数を起動するかというとMicrosoft C ランタイムライブラリ(CRT)がwWinMainを呼び出すmainを実装しているから。
慣れない。
次は実際にウィンドウを出せる。
ここまで。