C++ ⇒ VBA 書いて覚えるための初心者自己中記事

C++ ⇒ VBA 勉強の履歴を付けるというかノート代わりに使ってます

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

コマンドライン引数をUnicode文字列として格納する。

 

第四引数

int  nCmdShow

メインアプリケーションウィンドウの最大化・最小化・通常表示を指定するフラグ。

 

このwWinMain関数の戻り値は別のプログラムのステータスコードとして使用できる。

WINAPIは呼び出し規約。呼び出し側からのパラメータをどう受け取るかを定義。

WinMainはコマンドライン引数がANSI

それ以外は同じ。

 

コマンドライン引数のUnicodeコピーはGetCommandLine関数で取得できる。

 

コンパイラがmain関数ではなくwWinMain関数を起動するかというとMicrosoft C ランタイムライブラリ(CRT)がwWinMainを呼び出すmainを実装しているから。

 

 

慣れない。

次は実際にウィンドウを出せる。

ここまで。