• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一、概述

              Windows程序具有相對固定的結(jié)構(gòu),對編寫者而言,不需要書寫整個過程,大部分過程由系統(tǒng)完成。

              程序中只要按一定的格式填寫系統(tǒng)留給客戶的那一小部分。

              所需要完成的有:

              窗口類的定義、窗口的建立、消息函數(shù)的書寫、消息循環(huán)。
              二、消息處理函數(shù)

              Windows程序是事件驅(qū)動的,對于一個窗口,它的大部分例行維護(hù)是由系統(tǒng)維護(hù)的。沒個窗口都有一個消息處理函數(shù)。

              在消息處理函數(shù)中,對傳入的消息進(jìn)行處理。系統(tǒng)內(nèi)還有它自己的缺省消息處理函數(shù)。

              客戶寫一個消息處理函數(shù),在窗口建立前,將消息處理函數(shù)與窗口關(guān)聯(lián)。這樣,每當(dāng)有消息產(chǎn)生時,就會去調(diào)用這個消息處理函數(shù)。

              通常情況下,客戶都不會處理全部的消息,而是只處理自己感興趣的消息,其他的,則送回到系統(tǒng)的缺省消息處理函數(shù)中去。

            LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
            {
            switch (message)
            {
            case ...
            ...
            case ...
            ...

            }
            return DefWindowProc (hwnd, message, wParam, lParam) ;
            }

              三、窗口的建立

              客戶需要自己建立窗口,建立后會得到系統(tǒng)返回的窗口句柄(HWND),后繼的針對窗口的操作都針對句柄進(jìn)行。

              1.注冊窗口類

              建立窗口前,需要制定好這個窗口的相關(guān)屬性,最主要的就是將自己定義的消息處理函數(shù)與窗口關(guān)聯(lián),其他的屬性還包括:菜單、圖標(biāo)等等。

              這個屬性指定步驟是通過指定"窗口類"來完成的。

              對于自己建立的窗口,這個"窗口類"需要自己制定,也即自己填充一個WNDCLASS結(jié)構(gòu),然后向系統(tǒng)注冊。
            對于一些特殊窗口,如按鈕等控件,他們的行為是系統(tǒng)制定好了的,所以不需要自己注冊,直接使用對應(yīng)的“窗口類”名稱就行了。

              2.建立窗口

              建立窗口時,注冊的"窗口類"名稱作為參數(shù)傳入。

              這樣,當(dāng)有針對該窗口的消息時,將調(diào)用“窗口類”中指定的消息處理函數(shù),在其中得到處理。

              四、消息循環(huán)

              系統(tǒng)會將針對這個程序的消息依次放到程序的“消息隊列”中,由程序自己依次取出消息,在分發(fā)到對應(yīng)的窗口中去。

              因此,建立窗口后,將進(jìn)入一個循環(huán)。

              在循環(huán)中,取出消息、派發(fā)消息,循環(huán)往復(fù),直到取得的消息是退出消息。

              循環(huán)退出后,程序即結(jié)束。

            #include "stdafx.h"
            #include <windows.h>

            //一、消息處理函數(shù)
            //參數(shù):窗口句柄,消息,消息參數(shù),消息參數(shù)
            LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
            {
             //處理感興趣的消息
             switch (message)
             {
              case WM_DESTROY:
               //當(dāng)用戶關(guān)閉窗口,窗口銷毀,程序需結(jié)束,發(fā)退出消息,以退出消息循環(huán)
               PostQuitMessage (0) ;
               return 0 ;
             }
             //其他消息交給由系統(tǒng)提供的缺省處理函數(shù)
             return ::DefWindowProc (hwnd, message, wParam, lParam) ;
            }

            //二、應(yīng)用程序主函數(shù)
            //參數(shù):實例句柄、前一個實例的句柄、命令行參數(shù)、窗口顯示方式
            int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
            PSTR szCmdLine, int iCmdShow)
            {
             //1.注冊窗口類
             static TCHAR szAppName[] = TEXT ("HelloWin") ; //窗口類名稱
             //定制"窗口類"結(jié)構(gòu)
             WNDCLASS wndclass ;
             wndclass.style = CS_HREDRAW | CS_VREDRAW ;
             wndclass.lpfnWndProc = WndProc ; //關(guān)聯(lián)消息處理函數(shù)
             wndclass.cbClsExtra = 0 ;
             wndclass.cbWndExtra = 0 ;
             wndclass.hInstance = hInstance ; //實例句柄
             wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //圖標(biāo)
             wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光標(biāo)
             wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); //畫刷
             wndclass.lpszMenuName = NULL ;
             wndclass.lpszClassName = szAppName; //類名稱
             //注冊
             if (!ReGISterClass (&wndclass))
             {
              MessageBox (NULL, TEXT ("RegisterClass Fail!"),
              szAppName, MB_ICONERROR) ;
              return 0 ;
             }

             //建立窗口
             HWND hwnd ;
             hwnd = CreateWindow (szAppName, //窗口類名稱
              TEXT ("The Hello Program"), //窗口標(biāo)題
              WS_OVERLAPPEDWINDOW, //窗口風(fēng)格
              CW_USEDEFAULT,
              CW_USEDEFAULT,
              CW_USEDEFAULT,
              CW_USEDEFAULT,
              NULL,
              NULL,
              hInstance, //實例句柄
              NULL);

             ShowWindow (hwnd, iCmdShow) ;
             UpdateWindow (hwnd) ;
             
             //消息循環(huán)
             MSG msg ;
             while (GetMessage (&msg, NULL, 0, 0)) //從消息隊列中取消息
             {
              TranslateMessage (&msg) ; //轉(zhuǎn)換消息
              DispatchMessage (&msg) ; //派發(fā)消息
             }
             return msg.wParam ;
            }
            Posted on 2006-01-01 15:01 艾凡赫 閱讀(1093) 評論(1)  編輯 收藏 引用 所屬分類: win32 sdk 編程

            Feedback

            # re: Windows程序的基本結(jié)構(gòu)  回復(fù)  更多評論   

            2007-04-03 22:17 by skyson
            代碼有問題,我編譯不過,但是想了一下,你可能是故意改成這樣的。但是還是修改一下吧:
            ////////////////////////////////////////////////
             //注冊
             if (!ReGISterClass (&wndclass))
             {
              MessageBox (NULL, TEXT ("RegisterClass Fail!"),
              szAppName, MB_ICONERROR) ;
              return 0 ;
             }
            /////////////////////////////////////////////////
            上面代碼改為:
            if (!RegisterClass (&wndclass))
             {
              MessageBox (NULL, TEXT ("RegisterClass Fail!"),
              szAppName, MB_ICONERROR) ;
              return 0 ;
             }

            免费观看成人久久网免费观看| 日本精品久久久久中文字幕8| 色婷婷久久久SWAG精品| 亚洲精品视频久久久| 日韩av无码久久精品免费| 色综合久久中文色婷婷| 久久久久亚洲AV无码专区首JN | 亚洲人AV永久一区二区三区久久| 亚洲国产成人精品女人久久久 | 久久精品水蜜桃av综合天堂| 久久久久一区二区三区| 中文字幕久久精品| 一级做a爰片久久毛片16| 久久久久高潮综合影院| 国产精品美女久久久免费| 久久亚洲精品成人AV| 亚洲伊人久久成综合人影院| 久久婷婷国产麻豆91天堂| 亚洲AV日韩精品久久久久久| 亚洲精品美女久久久久99小说| 亚洲国产精品久久久久| 日韩乱码人妻无码中文字幕久久| 亚洲色欲久久久久综合网| 久久av免费天堂小草播放| 国产99久久精品一区二区| 久久婷婷五月综合97色| 亚洲国产另类久久久精品小说 | 久久成人国产精品| 久久无码中文字幕东京热| 亚洲国产成人久久精品99| 国产精品嫩草影院久久| 国产激情久久久久影院| 色综合久久天天综合| 日本道色综合久久影院| 久久福利青草精品资源站免费| 久久ZYZ资源站无码中文动漫 | 国产成人久久久精品二区三区| 久久青草国产精品一区| 岛国搬运www久久| 久久精品无码专区免费| 欧美色综合久久久久久|