lesson 1:Windowsプログラムの動作原理とプログラム作成プロセス(vc++詳細)

8463 ワード

前言:ウィンドウ生成プロセス、ハンドル原理、メッセージキュー、コールバック関数、ウィンドウクローズとアプリケーション終了の作業関係.
  • Windows APIとWin 32 SDKオペレーティングシステムはWindowsアプリケーションの開発に便利なプログラミングインターフェースを提供し、これらの関数はすべてWindowsにある.hヘッダファイルに宣言します.Win 32 SDK(Software Development Kit):Windows 32ビットプラットフォームのソフトウェア開発パッケージです.API関数、ヘルプドキュメント、マイクロソフトが提供するいくつかの補助開発ツールが含まれています.
  • ウィンドウとハンドルウィンドウは、画面上の矩形領域であり、Windowsアプリケーションがユーザーと対話するインタフェースである.Windowsアプリケーションでは、ウィンドウはウィンドウハンドル(HWND)で識別され、あるウィンドウを操作するには、まずこのウィンドウのハンドルを取得します.その他のさまざまなリソース(ウィンドウ、アイコン、カーソルなど)は、これらのリソースを作成するときにメモリを割り当て、これらのリソースを識別する識別番号、すなわちハンドルを返します.eg:カーソルハンドル(HCURSOR)、アイコンハンドル(HICON)など.
  • メッセージとメッセージキューWindowsプログラム設計は、メッセージベースのイベント駆動方式のプログラム設計モードである.メッセージは、Windowsにおいて構造体MSGによって表される.MSG構文はMSDNを参照してください.

  • typedef struct tagMSG{HWND hwnd;//メッセージが属するウィンドウハンドルUINT message;//メッセージ自体識別子WPARAM wParam;//メッセージに関する追加情報LPARAM lParamを指定する;DWORD time;//メッセージの発行時間POINT ptを指定する;//メッセージの発行時の位置}MSG;
    ≪メッセージ・キュー|Message Queue|emdw≫:Windowsアプリケーションが作成されるたびに、プログラム1のウィンドウのメッセージを格納するメッセージ・キューが作成されます.メッセージが生成された後、メッセージ・キューに送信され、アプリケーションはメッセージ・ループが絶えないメッセージ・キューからメッセージを取り出して応答します.応答プロセスは、システムからアプリケーションにメッセージを送信します.実際には、アプリケーションを呼び出すメッセージ処理関数です.
    ウィンドウの作成を実現する完全なWin 32プログラムを作成します.主な手順は次のとおりです.
  • WinMain関数の定義
  • ウィンドウを作成し、完全なウィンドウを作成する4つのステップ:1ウィンドウクラスを設計し、2ウィンドウクラスを登録し、3ウィンドウを作成し、4ウィンドウ
  • を表示する.
  • は、メッセージループ
  • を行う.
  • ウィンドウプロセス関数
  • を記述する
    関連コード:
    /************************************************************************
    Author: wuc
    Mail: [email protected]
    Time: 13:24:19/2017-9-7
    Name: WinMain
    Function:        
    Version:                                                           
    ************************************************************************/
    #include 
    #include 
    
    LRESULT CALLBACK WindowProc(                                     
                                HWND hwnd,     //    
                                UINT uMsg,     
                                WPARAM wParam,
                                LPARAM lParam
                                );
    
    int WINAPI WinMain(                                           //WinMain     Windows         
                       HINSTANCE hInstance,                         //  :
                       HINSTANCE hPrevInstance,                     //int WINAPI WinMain(         
                       LPSTR IpCmdLine,                             //HINSTANCE hInstance,         
                       int nCmdShow                                 //HINSTANCE hPrevInstance,  
                       )                                            //LPSTR lpCmdLine,
                                                                    //int nCmdShow
                                                                    //);
    
    {   //       
        WNDCLASS wndcls;
        wndcls.cbClsExtra=0;
        wndcls.cbWndExtra=0;
        wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);  //(HBRUSH)      
        wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);  //      
        wndcls.hIcon=LoadIcon(NULL,IDI_WINLOGO);    //      
        wndcls.hInstance=hInstance;       //                   
        wndcls.lpfnWndProc=WindowProc;    //      
        wndcls.lpszClassName=L"Weixin2008";   //      
        wndcls.lpszMenuName=NULL;             //   ,    
        wndcls.style=CS_HREDRAW | CS_VREDRAW; //         
    
        RegisterClass(&wndcls);               //     
    
        HWND hwnd;     //                  
        hwnd=CreateWindow(L"Weixin2008",L"     ",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL); 
    
        ShowWindow(hwnd,SW_SHOWNORMAL);      //    
    
        UpdateWindow(hwnd);                  //    
        //    
        MSG msg;                             //     
        while (GetMessage(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return 0;
    
    }
    
    LRESULT CALLBACK WindowProc(           //    
                                HWND hwnd,
                                UINT uMsg,
                                WPARAM wParam,
                                LPARAM lParam
                                )
    {
        switch (uMsg)           //    
        {
        case WM_CHAR:           //      
            char szChar[20];
            sprintf(szChar,"char is %d",wParam);
            MessageBox(hwnd,LPCWSTR(szChar),L"weixin",0);
            break;
        case WM_LBUTTONDOWN:    //        
            MessageBox(hwnd,L"mouse clicked",L"weixin",0);
            HDC hdc;
            hdc=GetDC(hwnd);    //         ,      
            TextOut(hdc,0,50,L"     ",strlen("     "));
            ReleaseDC(hwnd,hdc);   //    DC   
            break;
        case WM_PAINT:             //          
            HDC hDc;
            PAINTSTRUCT ps;
            hDc=BeginPaint(hwnd,&ps);
            TextOut(hDc,0,0,L"Windows  ",strlen("Windows  "));
            EndPaint(hwnd,&ps);
            break;
        case WM_CLOSE:
            if(IDYES==MessageBox(hwnd,L"      ?",L"weixin",MB_YESNO))
            {
                DestroyWindow(hwnd);
            }
        case WM_DESTROY:
            PostQuitMessage(0); //      ,                 
            break;
        default:
            return DefWindowProc(hwnd,uMsg,wParam,lParam);  //             
        }
        return 0;
    }
    

    小結:ハンドルハンドル(handle)について、リソースの識別.オペレーティングシステムがこれらのリソースを管理および操作するには、ハンドルによって対応するリソースが見つかります.リソースのタイプによって、ハンドルをアイコンハンドル(hicon)、カーソルハンドル(hcursor)、ウィンドウハンドル(hwnd)、アプリケーションインスタンスハンドルに細分化することもできます.(hinstance)など様々なタイプのハンドル.オペレーティングシステムが各ウィンドウに指定した一意の識別番号、すなわちウィンドウハンドル.
    WinMain関数システムエントリ関数
    強制変換->コンパイル時にエラーは発生せず、実行時にエラーが発生します.
    BeginPaint EndPaintリリースはWM_のみPAINTで使用GetDCの後、ReleaseDCを解放する必要がある.if(1==x)は定数を前に書いて、理解しやすい.メッセージループ時にdefault文が少なくない必要があります.