『Windows 32 SDKチュートリアル』01章SDK入門

6662 ワード

今私たちが学ぶのはWindows 32のプログラミングで、DOSとは違って、実現の目標はあなたが必要とする機能を持つ「ウィンドウ」です.この「ウィンドウ」は、オペレーティングシステムとの間で、「メッセージキュー」と呼ばれるものを通じてデータを転送します.そのため、様々なメッセージを処理することがWin 32プログラミングの核心となっている.
SDKプログラミングはMFCに対して、つまりCとC++でWindowsAPIを呼び出すものであり、このAPIはオペレーティングシステムのものであり、他の言語(例えばVB)でも呼び出すことができる.そのため、以前はこのプログラミングをAPIプログラミングと呼ぶ人もいました.もちろん、ここではCやC++をいくつか拡張していますが、拡張とは、マクロ定義やテンプレートがたくさん追加されていることで、見て驚いたことに、「どこが神聖なのか」が何なのか分かりません.
もしあなたがCあるいはC++がまだできないならば、先にC言語とC++言語を勉強してください.そうしないと、あなたはどんなに苦労しても映画を見るのと同じで、あなたは理解したかもしれませんが、あなたは映画を演じません.ウィンドウのプログラミングを学ぶ前に、いくつかの概念を知っておく必要があります.
  • インスタンス(instance):これはC++の内容で、「クラス」は構造体のデータ型に相当し、「クラス」というタイプで変数(ポインタであれば空間が得られたと仮定)を定義し、この変数がその「クラス」の「インスタンス」である.C言語の変数とは同じですが、「クラス」で定義された変数だけが「インスタンス」と呼ばれます.
  • ハンドル(handle):これはC言語の内容であり、ファイルハンドルと同様に、実際にはどのインスタンス、すなわちインスタンスの識別子を識別するための整数です.このインスタンスはハンドルで操作できます.
  • コールバック(CALLBACK):これは実はC言語の関数ポインタで、関数ポインタは一般的に大きなプロジェクトでフレームワークを組むときによく使われています.つまり、あなたが何を得るかを設計して、インタフェースを定義して、具体的にどのように実現して完全に他の人に渡して、他の人は関数名をあなたに伝えればOKです.この関数名はアドレスですが、このアドレスを取るポインタは定義上普通のポインタとは少し違います.雅ちゃんは『C言語教程』の「関数ポインタ」に詳しい解説と例がある.
  • 一、WinMain()関数
    WinMain()関数はウィンドウプログラムのエントリ関数であり、この関数では様々なAPI関数を呼び出して目標を達成することができます.①通常はRegisterClassEx()関数を呼び出して現在のウィンドウハンドルでオペレーティングシステムに申請(またはログイン)してどのようなウィンドウを作成するか、申請に成功した後、②CreateWindowEx()関数を呼び出してウィンドウオブジェクトを作成します.これは単なる外観です.③ShowWindow()関数設定初期表示、すなわち最大または最小または普通なども呼び出します.④最後にUpdateWindow()関数を呼び出してウィンドウにWM_を転送するPAINTメッセージはウィンドウの内容を描きます.
    ウィンドウの作成が完了すると、これは「静止」ウィンドウになります.⑤そのため、WinMain()関数の最後にメッセージループを追加し、最後にreturnします.WinMain()関数が完了した後,⑥さらに「ウィンドウメッセージ処理」関数を記述する.多くのAPI関数の呼び出しは少し頭がぼんやりしているかもしれませんが、それらはすべて固定されていて、基本的にプログラミングしないでください.理解したら、少量のパラメータを変更すればいいのですが、本当にプログラミングするのはこの「ウィンドウメッセージ処理」関数です.
    次に、ウィンドウを作成するのではなく、汎用ダイアログボックスを呼び出すだけです.主にWinMain()関数を理解します.
    
    #include <windows.h>
    
    int APIENTRY WinMain(HINSTANCE hInstance,     //        
                         HINSTANCE hPrevInstance, //       ,Win32  NULL
                         LPSTR     lpCmdLine,     //       
                         int       nCmdShow       //       
                        )
    {
        MessageBox(NULL,"     !", "http://www.quanxue.cn/", MB_OK);  //     
    
        return 0;  //     
    }
    

    初心者の分からないところはまだたくさんありますが、ほとんどはこのように先に使うことができて、后でゆっくり理解して、雅さんは当初多くの“名手”を闻いて、答えは私に更に分からないで、“ゆっくり理解する”しかありません.このように何年も引き延ばして、今小雅は1つ1つ解説して、もし間違いがあれば、フォーラムに行って2つの文を指摘します.
  • APIENTRYは戻りタイプではありません.これはコンパイラのために用意されたマクロ定義で、現在の関数を64ビットマシンにコンパイルしても使用できる長い呼び出しをコンパイラに伝えます.どうしてこのようなスイッチが必要ですか?VisualC++は、C言語、C++言語、16ビットのWindowsバージョンなどに対応するとともに、将来64ビットマシンに拡張する準備をしています.CALLBACKと同じマクロ定義ですが、コンパイル時には少し違いがあります.
  • WinMain()関数は.Netでは_tWinMain()は、互換性のために定義されたマクロ定義でもある.
  • HINSTANCEはインスタンスハンドルであり、このようにHまたはhで始まるもの(例えばHDC)はすべてハンドルであり、その値は整数である.int型を無理に書くと、コンパイラが区別できないため、コンパイルエラーが発生します.
  • LPSTRは、UNICコード型の文字列ポインタです.
  • hInstanceは現在のウィンドウのインスタンスハンドルであり、hPrevInstanceは16ビットマシンで現在のウィンドウが繰り返し開いているかどうかを識別し、hPrevInstanceがNULLでない場合は前のウィンドウインスタンスハンドルであり、32ビットマシンではhPrevInstanceはNULLである.
  • lpCmdLineはコマンドラインからのパラメータです.
  • nCmdShowは初期表示方式であり、最大/最小/正常/非表示などである.
  • MessageBox()関数はWin 32のAPI関数であり、汎用ダイアログを呼び出す.これは私たちが学ぶウィンドウのプログラミングではありません.
  • 二、基本Win 32プログラム
    以下はウィンドウを生成する最も基本的なプログラムであり、後述する内容でもありますが、皆さんが見てから上記の①-⑥を見つけることができればOKです.
    
    #include <windows.h>
    
    TCHAR szTitle[32]="  ";  //     
    TCHAR szWindowClass[32]="Simple";  //     
    
    ATOM MyRegisterClass(HINSTANCE);
    BOOL InitInstance(HINSTANCE, int);
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
        MSG msg;
    
        MyRegisterClass(hInstance);        //     
    
        if (!InitInstance (hInstance, nCmdShow)) //     
        {
            return FALSE;
        }
    
        while (GetMessage(&msg, NULL, 0, 0)) //    
        {
            TranslateMessage(&msg); //    
            DispatchMessage(&msg);  //    
        }
    
        //  :   “return 0;”,            
        return (int)msg.wParam;
    }
    
    //     
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        WNDCLASSEX wc;   //       ,        
    
        wc.cbSize        = sizeof(WNDCLASSEX);        //        
        wc.style         = CS_HREDRAW | CS_VREDRAW;   //    
        wc.lpfnWndProc   = (WNDPROC)WndProc;          //      
        wc.cbClsExtra    = 0;          //                ,   0
        wc.cbWndExtra    = 0;          //               ,   0
        wc.hInstance     = hInstance;  //    
        wc.hIcon         = LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);            //  
        wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1);    //  
        wc.lpszMenuName  = NULL;            //  
        wc.lpszClassName = szWindowClass;   //   
        wc.hIconSm       = LoadIcon(wc.hInstance, (LPCTSTR)IDI_APPLICATION);
    
        return RegisterClassEx(&wc);
    }
    
    //     
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;
    
       //    
       hWnd = CreateWindow( szWindowClass,       //   
                            szTitle,             //    
                            WS_OVERLAPPEDWINDOW, //    
                            CW_USEDEFAULT,		//      x  /CW_USEDEFAULT
                            CW_USEDEFAULT,		//      y  /CW_USEDEFAULT
                            CW_USEDEFAULT,		//     /CW_USEDEFAULT
                            CW_USEDEFAULT,		//     /CW_USEDEFAULT
                            NULL,                //     
                            NULL,                //    
                            hInstance,           //    
                            NULL);               //    
       if (!hWnd)
       {
          return FALSE;
       }
       ShowWindow(hWnd, nCmdShow); //    
       UpdateWindow(hWnd);         //    
    
       return TRUE;
    }
    
    //      
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
            case WM_DESTROY:                  //    
                PostQuitMessage(0);           //      
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);  //        
       }
       return 0;
    }