• <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>

            Sunshine Alike

            半完美主義

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              35 Posts :: 1 Stories :: 56 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(15)

            積分與排名

            • 積分 - 50293
            • 排名 - 451

            最新隨筆

            最新評論

            Windows 應用程序基本結構

            一個完整的 windos 應用程序通常由下面五種類型的文件組成:

            1.???????? 擴展名為 .c/.cpp 的C語言程序源文件

            2.???????? 擴展名為 .h 的頭文件

            3.???????? 擴展名為 .rc 的資源描述文件

            4.???????? 擴展名為 .def 的模塊定義文件

            5.???????? 擴展名為 .mak 的項目文件

            前面三種很常見了,不過后面兩個就 ……

            暫時不管,以后遇見了再說。

            源程序組成結構

            console 程序相對應, windows 應用程序也有一個入口函數 WinMain ,用于完成一系列的定義和初始化工作,并產生消息循環。消息循環是整個程序運行的核心。此外,窗口函數 WndProc 是處理接收到的消息的函數。其中包含了應用程序對各種可能接收到的消息的處理過程。

            ?

            WinMain 函數的功能:

            注冊窗口類,建立窗口及執行其他必要的初始化工作

            進入消息循環,根據從應用程序消息隊列接受的消息調用相應的處理過程。

            當消息循環檢測到 WM_QUIT 消息時終止程序運行。

            WinMian 函數由三個基本組成部分:函數說明、初始化和消息循環。

            (1)????? 函數說明

            int WINAPI WinMain

            (

            ?????? HINSTANCE hThisInst,??????? // 應用程序當前實例句柄

            ?????? HINSTANCE hPrevInst,????????????? // 應用程序其它實例句柄

            ?????? LPSTR lpszCmdLine,?????????? // 指向程序命令行參數的指針

            ?????? Int nCmdShow??????????????????? // 應用程序開始執行時窗口顯示方式的標識

            )

            應當注意到, windows 程序可能并行的進行多次執行,因而可能出現同一個應用程序的多個窗口同時存在的情況。在 windows 中,每執行一次稱其為一個實例( instance ),并使用一個實例句柄進行唯一的標識。

            ?

            (2)????? 初始化工作包括:窗口類的定義,注冊,創建窗口實例和顯示窗口四個部分。

            ??????????? 窗口類的定義

            windows 程序中,窗口類定義了窗口的形式與功能。窗口類定義通過給窗口類數據結構 WNDCLASS 賦值完成,該數據結構中包含窗口類的各種屬性。常用函數有:

            LoadIcon 在程序中加載一個窗口圖標

            LoadCursor 向程序加載一個窗口光標

            GetStockObject  可以獲取各種系統默認資源

            ??????????? 注冊窗口類

            Windows 系統本身提供部分預定義的窗口類,程序員也可以自定義窗口類。窗口類必須先用函數 RegisterClass 進行注冊后才能使用。

            其形式為: ??? BOOL RegisterClass( &wndClass )

            ??????????? 創建窗口

            窗口創建由函數 CreateWindow 實現,其原型為:

            HWND CreateWinodw

            (

            LPCTSTR lpszClassName,?????????? // 窗口類名,此窗口名必須是已經注冊過

            LPCTSTR lpszTitile,??????????????????? // 窗口標題

            DWORD dwStyle,?????????????????????? // 窗口樣式

            int x,?????????????????????????????????????????

            int y,???????????????????????????????????????????????? // 窗口左上角坐標

            int nWidth,

            int nHeight,???????????????????????????????? // 窗口高寬

            HWND hwndParent,??????????????????? // 該窗口父窗口句柄

            HMENU hMenu,???????????????????????? // 主菜單句柄

            HINSTANCE hInstance,???????????????????? // 當前應用程序句柄

            LPVOID lpParam??????????????????????? // 指向一個傳遞給窗口參數值的指針

            )

            ??????????? 顯示窗口

            窗口類顯示由 ShowWindow UpdateWindow 函數實現。

            ShowWindow 將窗口顯示在屏幕上,形式為 BOOL ShowWindow( HWND, int )

            顯示完窗口后常常使用 UpdateWindow 更新并繪制用戶區,并發出 WM_PAINT 消息,形式為 UpdateWindow( HWND )

            ?

            (3)????? 消息循環

            Windows 應用程序的運行以消息為核心。 Windows 將產生的消息放入應用程序的消息隊列中,而應用程序的 WinMain 函數在消息循環中提取隊列中的消息,并將其傳遞給窗口函數的相應過程處理。

            消息循環常見格式為:

            MSG?msg;

            while (GetMessage( & msg,?NULL,? 0 ,? 0 ))?????? // 讀取一條消息存放在一個MSG結構中

            {

            ???????TranslateMessage(
            & msg);??????????????????? // 將消息的虛擬鍵轉換為字符信息

            ???????DispatchMessage(
            & msg);??????????????????? // 將參數指向的消息傳送到指定的窗口函數

            }


            只有當

            GetMessage 函數返回 0 值,即檢索到 WM_QUIT 消息時,程序結束退出。

            ?

            窗口函數

            窗口函數的主體是消息處理語句,由一系列 case 語句組成。程序員只需要根據窗口可能收到的消息在 case 語句中編寫相應的處理程序段即可。一般形式如下:

            LRESULT?CALLBACK?WndProc?(HWND?hwnd,?UINT?message,?

            WPARAM?wParam,?LPRARM?lParam)

            {

            ???????…

            swithch(message)

            {

            ???????
            case ?…

            ??????????????…

            ???????
            case ?WM_DESTROY:

            ??????????????PostQuitMessage(
            0 );

            ???????
            default :

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

            }


            ???????
            return ? 0 ;

            }

            ?

            ?

            ??????????? 應用程序舉例  Hello Windows API

            #include? windows.h >

            ?

            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 ;

            }


            ?

            int ?WINAPI?WinMain(HINSTANCE?hInstance,

            ?????????????????????HINSTANCE?hPrevInstance,

            ?????????????????????LPSTR?????lpCmdLine,

            ?????????????????????
            int ???????nCmdShow)

            {

            ???????HWND?hwnd;

            ???????MSG?msg;

            ???????WNDCLASS?wndclass;

            ???????
            char ?lpszClassName[]? = ? " hello " ;

            ???????
            char ?lpszTitle[]? = ? " Hello?Windows?API " ;

            ???????
            // ------------窗口類的定義

            ???????wndclass.style?
            = ? 0 ;

            ???????wndclass.lpfnWndProc?
            = ?WndProc;

            ???????wndclass.cbClsExtra?
            = ? 0 ; // 類無擴展

            ???????wndclass.cbWndExtra?
            = ? 0 ; // 窗口無擴展

            ???????wndclass.hInstance?
            = ?hInstance; // 當前句柄實例

            ???????wndclass.hIcon?
            = ?LoadIcon(NULL,IDI_APPLICATION); // 最小化為默認圖標

            ???????wndclass.hCursor?
            = ?LoadCursor(NULL,IDC_ARROW); // 箭頭光標

            ???????wndclass.hbrBackground?
            = ?(HBRUSH)GetStockObject(BLACK_BRUSH); // 黑色背景

            ???????wndclass.lpszMenuName?
            = ?NULL; // 無菜單

            ???????wndclass.lpszClassName?
            = ?lpszClassName; // 窗口類名

            ?

            ???????
            // ------------窗口類注冊

            ???????
            if ( ! RegisterClass( & wndclass))

            ???????
            {

            ??????????????MessageBeep(
            0 ); // 如果失敗發出警告音

            ??????????????
            return ?FALSE;

            ???????}


            ???????
            // 創建窗口

            ???????hwnd?
            = ?CreateWindow(lpszClassName,?lpszTitle,

            ??????????????????????????????????????????WS_SYSMENU,
            // 窗口風格

            ??????????????????????????????????????????CW_USEDEFAULT,
            // 左上角坐標為默認值

            ??????????????????????????????????????????CW_USEDEFAULT,

            ??????????????????????????????????????????
            400 , // 窗口高寬

            ??????????????????????????????????????????
            300 ,

            ??????????????????????????????????????????NULL,
            // 無父窗口

            ??????????????????????????????????????????NULL,
            // 無主菜單

            ??????????????????????????????????????????hInstance,
            // 創建窗口程序的當前句柄

            ??????????????????????????????????????????NULL);
            // 不使用該值

            ???????ShowWindow(hwnd,?nCmdShow);

            ???????UpdateWindow(hwnd);

            ?

            ???????
            // -------------消息循環

            ???????
            while (GetMessage( & msg,?NULL,? 0 ,? 0 ))

            ???????
            {

            ??????????????TranslateMessage(
            & msg);

            ??????????????DispatchMessage(
            & msg);

            ???????}


            ?

            ???????
            return ?msg.wParam;

            }

            posted on 2009-03-10 12:42 Sunshine Alike 閱讀(1117) 評論(6)  編輯 收藏 引用 所屬分類: WinAPI應用程序

            Feedback

            # re: WindowsAPI學習筆記一 2009-03-10 14:16 擇日而亡
            關注中。。。  回復  更多評論
              

            # re: WindowsAPI學習筆記一 2009-03-10 20:42 Sunshine Alike
            @擇日而亡
            謝謝,你也有興趣學這個么?  回復  更多評論
              

            # re: WindowsAPI學習筆記一 — Windows應用程序基本結構 2009-03-11 13:28 擇日而亡
            @Sunshine Alike
            有興趣,都收藏了。  回復  更多評論
              

            # re: WindowsAPI學習筆記一 — Windows應用程序基本結構 2009-03-11 16:28 Sunshine Alike
            @擇日而亡
            3Q,大家一起學習!呵呵  回復  更多評論
              

            # re: WindowsAPI學習筆記一 - Windows應用程序基本結構 2009-05-10 16:55 鳴文
            你也在學win32 SDK 和MFC吧……關注中  回復  更多評論
              

            # re: WindowsAPI學習筆記一 - Windows應用程序基本結構 2009-05-10 21:34 Sunshine Alike
            @鳴文
            唉,說來慚愧,每次學到一半都不能靜心,最近已經很久沒有看書了
            以后一起學習  :)  回復  更多評論
              

            久久久久18| 久久66热人妻偷产精品9| 久久影院午夜理论片无码 | 国产精品99久久久久久猫咪 | 免费无码国产欧美久久18| 亚洲精品无码久久久久sm| 国内精品久久人妻互换| 国产午夜电影久久| 亚洲精品乱码久久久久久按摩 | 久久99热这里只频精品6| 国产69精品久久久久777| 欧美国产精品久久高清| 久久国产欧美日韩精品| 欧美国产精品久久高清| 久久精品视频网| 一本久久a久久精品vr综合| 精品一久久香蕉国产线看播放| 久久久久亚洲精品日久生情 | 中文字幕人妻色偷偷久久| 99国产欧美精品久久久蜜芽| 国内精品久久久久影院老司| 国产 亚洲 欧美 另类 久久| 久久精品人人槡人妻人人玩AV | 久久久精品人妻无码专区不卡| 久久国产精品成人片免费| 思思久久99热只有频精品66| 久久久久久一区国产精品| 精品久久久噜噜噜久久久| 欧美久久久久久| 深夜久久AAAAA级毛片免费看| 青青青伊人色综合久久| 99久久免费国产特黄| 久久国产精品无码HDAV| 亚洲国产欧洲综合997久久| 午夜精品久久久内射近拍高清| 一本一道久久精品综合| 久久99国产精品99久久| 久久亚洲国产午夜精品理论片| 久久精品国产99国产精品澳门| 91精品国产9l久久久久| 欧美777精品久久久久网|