見出し画像

さっくりWINAPI_01 //MessageBox

個人用備忘録第一弾
若干枯れつつある気もしなくもない技術を覚えようの巻

VS開発環境てWindow用のプロジェクトを作成して頂ければ大丈夫かと思います。
コンソール用のプロジェクトを作ってしまった場合には、プロパティから、構成プロパティ->リンカー->システム->サブシステムの変更を行い、
C/C++->プリプロセッサ->プリプロセッサの定義から_CONSOLEを_WINDOWSに変更します。

1.HelloWorld

というわけでまずさっそくコードに入ります。色々説明つける前にコードを見た方が手っ取り早いと思うので。

#include<windows.h>

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR mCmdLine, _In_ int nCmdShow){
    MessageBox(NULL, TEXT("MessageBox"), TEXT("Kitty on your lap!!"), MB_OK);
    return 0;
}

これが、WINAPIにおけるHelloWorldになる訳です。さて、ではさくっと解説に行きましょう。

2.WinMain

これが、WINAPIにおけるエントリーポイントとなります。コンソールにおけるmain関数とほぼ同義ですね。しかし、いくつか異なる点もあるので見ていきましょう。

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR mlpCmdLine, _In_ int nCmdShow)

戻り値にWINAPIが書かれているのが特徴的ですね。これはどうも呼び出し規則の一種みたいです。

また、型の後ろに_In_やら_In_opt_やらがついていますが、これはSALと呼ばれる注釈言語だそーです(よく理解していない)

int nCmdShow
LPSTR lpCmdLine
これはmain関数におけるint argc, char* argv[]とほぼ同じ扱いです。ただLPSTRという少し見慣れない型がありますね。この子はchar*の事です。
WINAPIでは互換性のある独自の型が定義されているため、最初の頃はちょくちょく戸惑いますが、まあその内慣れてきます。

HINSTANCEはインスタンスハンドルと言い、そのアプリケーションそのものを表すものみたいな物だと思います!(多分)

はい、ということでWinMainのドキュメントです。

…なんか、やけに公式のドキュメントが多いっすね。まあ、間違いが無くていいと思う事に致しましょう。(ヤケ)

3.MessageBox

int MessageBox(
 HWND    hWnd,
 LPCWSTR lpText,
 LPCWSTR lpCaption,
 UINT    uType
);

MessageBoxは読んで字のごとくメッセージボックスを表示するための関数です。

hWndはMessageBoxの親のウィンドウを入れます。これはNULLで大丈夫です。
LPCWSTRはWCHAR型でのSTRING(文字列)のことで、LPはポインタの事を示します。まあぶっちゃけwchar_t*の事ですね。lpTextなので、MessageBoxに入る文章を引き取ってくれます。
LPWTSTRも同じく、lpCaptionなので、キャプションに入る文章を示します。
UINTはまあ、unsigned intのことで整数型ですね。これは、MessageBoxのタイプを示した引数を入れることになります。

ちなみにストリングの前後にTEXTを付けていますが、char型とは違いwchar_t型は一文字2バイトのマルチバイトとなります。このため普通のcharに対して特殊な処理を施す必要があるのでTEXTとつけているわけですね。

Typeは定数によって定義されています。以下、その定義の出典となります。

MB_OKは、OKを表示するメッセージボックスのことですね。
また、引数には、このタイプに伴って押されたボタンに対応する整数を返してくれます。

例えば、MB_OK以外を利用して次のようなコードを書くことが出来ます。
なおIDYESはMessageBoxでYESボタンが押された時に返されるint型のIDです。

#include<windows.h>

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR mCmdLine, _In_ int nCmdShow){
    int ID = MessageBox(NULL, TEXT("猫はお好きですか?"), TEXT("MessageBox"), MB_YESNO | MB_ICONQUESTION);
    if(ID == IDYES){
        MessageBox(NULL, TEXT("マーベラス!!"), TEXT("MessageBox"), MB_OK);
    } else {
        MessageBox(NULL, TEXT("貴様さては犬派だな!!"), TEXT("MessageBox"), MB_OK);
    }
    return 0;
}

実際に動かしてみると、簡単な分岐を見ることが出来るかと思います。あ、そうそう、UINTのType型は複数の定数をORで結ぶことで複雑なタイプを指定できるようになっています。


4.終わり


と、いう訳でさっくり解説でした。本当はメッセージループあたりまで行きたかったのですが、ちょっとカロリー高くて無理でした。

申し訳ございませんがこれからは不定期更新かつ、更新速度はかなり落ちるかと思います。

参考資料

本記事はこの作者様の著作等をかなり参考させて頂いてます。ぶっちゃけ、この方のサイトを見た方がわかりやすいかもしれません。因みに、某猫でもわかるシリーズも昔から参考にさせて頂いてました。

次回


この記事が気に入ったらサポートをしてみませんか?