乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      WinAPI簡(jiǎn)單入門(mén)

       intruder 2005-12-15

      WinAPI簡(jiǎn)單入門(mén)

       


          不要覺(jué)得奇怪,雖然我們擁有眾多“所見(jiàn)即所得”的編程方式來(lái)開(kāi)發(fā)眾多界面精美的應(yīng)
      用程序,這些可視化的編程環(huán)境提供了大量的類(lèi)庫(kù)和控件,但是在開(kāi)發(fā)者享受方便的同時(shí),
      他們的手腳已經(jīng)不知不覺(jué)的受到了限制,有很多深入到Windows內(nèi)部的操作它們無(wú)法完成,
      為什么?因?yàn)樗玫念?lèi)庫(kù)不支持。

        事實(shí)上這些類(lèi)庫(kù)與控件都是架構(gòu)在Window API的基礎(chǔ)上面的,API即 Application
      Programming Interface -- 應(yīng)用編程接口 的縮寫(xiě),它不僅為應(yīng)用程序所調(diào)用,同時(shí)也是
      Windows的一部分,Windows自身的運(yùn)行也調(diào)用這些API函數(shù)。要了解如何使用API就必須了
      解一些Windows的運(yùn)行機(jī)制。

        簡(jiǎn)單地說(shuō),Windows是由事件驅(qū)動(dòng)的搶占式多任務(wù)操作系統(tǒng)。事件驅(qū)動(dòng)是相對(duì)于過(guò)程驅(qū)
      動(dòng)而言的,它改變了原來(lái)文件的順序執(zhí)行方式;Windows既然是多任務(wù)系統(tǒng),就必須能同時(shí)
      處理多個(gè)事件,系統(tǒng)為應(yīng)用程序生成一個(gè)消息隊(duì)列,消息在上面被張貼和發(fā)送,應(yīng)用程序只
      要從其消息隊(duì)列中取出消息,然后一一執(zhí)行就可以了。

        現(xiàn)在,我將使用最最基本的范例程序 HelloWin 來(lái)說(shuō)明WIN32 API的運(yùn)行機(jī)制

      首先,一個(gè)程序一定要有進(jìn)入點(diǎn),Win32 App的進(jìn)入點(diǎn)函數(shù)的名稱(chēng)是WinMain,它的原型如下
      int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
      LPSTR lpCmdLine,int nCmdShow)


      hInstance是所謂的“實(shí)例句柄”,它是一個(gè)數(shù)值,當(dāng)程序在Windows下運(yùn)行的時(shí)候,它被用
      來(lái)唯一的標(biāo)示這個(gè)程序,雖然用戶(hù)可能同時(shí)運(yùn)行多個(gè)同一個(gè)程序,即運(yùn)行多個(gè)“實(shí)例”,我
      們可以看到,每一個(gè)實(shí)例都有不同的hInstance值。

      hPrevInstance,簡(jiǎn)單地說(shuō)就是沒(méi)用…它是存在于16位Windows程序中的,在編寫(xiě)
      Windows 9x/NT/2000 程序的時(shí)候,總應(yīng)該是NULL。

      szCmdLine是一個(gè)指針,指向一個(gè)以0為終結(jié)的字串,里面包含傳給該程序的命令行參數(shù),
      如果想要讓程序處理命令行,那么這個(gè)參數(shù)就有用了。

      iCmdShow參數(shù)是一個(gè)數(shù)值,指示窗口將如何被顯示,這個(gè)數(shù)值由在Windows下運(yùn)行該程序的
      程序所決定,通常是SW_SHOWNORMAL。

      接下來(lái)是注冊(cè)一個(gè)窗口類(lèi),窗口總是從窗口類(lèi)的基礎(chǔ)上創(chuàng)建的,窗口類(lèi)用以標(biāo)示處理窗口消
      息的窗口過(guò)程,注冊(cè)窗口類(lèi)時(shí)使用 RegisterClassEx() 函數(shù),它只需要一個(gè)參數(shù),一個(gè)指向
      類(lèi)型為 WNDCLASSEX 的結(jié)構(gòu)指針。

      具體注冊(cè)初始是這樣的:
      WNDCLASSEX wcex;

      wcex.cbSize = sizeof(WNDCLASSEX);     //結(jié)構(gòu)的大小

      wcex.style = CS_HREDRAW | CS_VREDRAW; //類(lèi)風(fēng)格
      wcex.lpfnWndProc = (WNDPROC)WndProc;  //窗口類(lèi)的窗口過(guò)程
      wcex.cbClsExtra = 0;            //在類(lèi)結(jié)構(gòu)中預(yù)留的空間
      wcex.cbWndExtra = 0;           //在Windows內(nèi)部保存的窗口結(jié)構(gòu)中預(yù)留的空間
      wcex.hInstance = hInstance;        //程序的實(shí)例句柄
      wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_EXAMPLE);  //程序圖標(biāo)
      wcex.hCursor = LoadCursor(NULL, IDC_ARROW);         //結(jié)構(gòu)的大小
      wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);    //指定窗口的背景顏色
      wcex.lpszMenuName = (LPCSTR)IDC_EXAMPLE;         //菜單
      wcex.lpszClassName = szWindowClass;             //類(lèi)名,和程序名相同
      wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);    //也是程序圖標(biāo)

      return RegisterClassEx(&wcex);

      接下來(lái),定義一個(gè)HWND,然后使用 CreateWindow() 函數(shù),原型如下:
      HWND CreateWindow(
        LPCTSTR lpClassName,    // 窗口類(lèi)名
        LPCTSTR lpWindowName,  // 窗口標(biāo)題
        DWORD dwStyle,       // 窗口風(fēng)格
        int x,             // 初始x
        int y,             // 初始y
        int nWidth,          // 窗口寬
        int nHeight,         // 窗口高
        HWND hWndParent,     // 父窗口句柄
        HMENU hMenu,       // 菜單句柄
        HINSTANCE hInstance,   // 實(shí)例句柄
        LPVOID lpParam       // 創(chuàng)建參數(shù)
      );

      在 CreateWindow() 調(diào)用返回之后,Windows內(nèi)部已經(jīng)創(chuàng)建了這窗口。但是窗口并為顯示,
      還需要兩個(gè)調(diào)用,一個(gè)是 ShowWindow(hwnd, iCmdShow):第一個(gè)參數(shù)是剛剛創(chuàng)建的窗口
      句柄,第二個(gè)參數(shù)是傳遞給WinMain的nCmdShow;另一個(gè)是 UpdateWindow(hwnd) ,導(dǎo)致
      客戶(hù)區(qū)域被繪制。

      接下來(lái),程序通過(guò)執(zhí)行一塊被稱(chēng)為“消息循環(huán)”的代碼從消息隊(duì)列中取出消息

      while (GetMessage(&msg, NULL, 0, 0))
      {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
        }
      }

      消息循環(huán)以 GetMessage 開(kāi)始,它從消息隊(duì)列中取出一條消息,只要從消息隊(duì)列中取出消
      息的 Message 域不為 WM_QUIT,GetMessage 就返回一個(gè)非零值,否則將導(dǎo)致程序退出
      消息循環(huán),然后程序中止,返回 msg 結(jié)構(gòu)的 wParam 參數(shù)。在循環(huán)中,TranslateMessage
      將 msg 結(jié)構(gòu)的內(nèi)容進(jìn)行修改,而 DispatchMessage 找出準(zhǔn)備調(diào)用的窗口過(guò)程。

      上面進(jìn)行的僅僅是準(zhǔn)備性工作:注冊(cè)窗口類(lèi)、創(chuàng)建窗口、顯示窗口、進(jìn)入消息循環(huán)取出消息
      而實(shí)際的動(dòng)作都發(fā)生在窗口過(guò)程中。

      LRESULT CALLBACK WndProc(HWND hWnd, //剛剛創(chuàng)建的窗口句柄
        UINT message,           //得到的消息
        WPARAM wParam,
        LPARAM lParam           //消息的進(jìn)一步詳細(xì)的參數(shù)
      )

      在程序中窗口過(guò)程通常是命名為 WndProc 的函數(shù),其實(shí)窗口過(guò)程可以任意的命名,一個(gè)
      Windows程序可以包含多個(gè)窗口過(guò)程,一個(gè)窗口過(guò)程總是與調(diào)用了 RegisterClassEx 注冊(cè)的
      窗口類(lèi)相關(guān)聯(lián),CreateWindow 函數(shù)根據(jù)窗口類(lèi)來(lái)創(chuàng)建窗口,但是一個(gè)窗口類(lèi)可以被用來(lái)創(chuàng)
      建多個(gè)窗口。


      消息收到之后,接下來(lái)應(yīng)該根據(jù)消息的不同來(lái)進(jìn)行處理
      switch(message)
      {
       case …:
       …
       …

      HelloWin程序只需要處理兩條消息,即 WM_PAINT 和 WM_DESTROY。

      WM_PAINT 消息在Windows程序中的地位極其重要,當(dāng)窗口客戶(hù)區(qū)的一部分或者全部變?yōu)?BR>“無(wú)效”,必須進(jìn)行刷新的時(shí)候,將由這條消息通知程序。

      為什么客戶(hù)區(qū)域會(huì)變得無(wú)效呢?在創(chuàng)建窗口的時(shí)候,整個(gè)客戶(hù)區(qū)都是無(wú)效的,因?yàn)檫€沒(méi)有畫(huà)
      任何的東西。第一條 WM_PAINT 消息指示窗口過(guò)程在窗口上面畫(huà)一些東西;還有在用戶(hù)改
      變了窗口的大小之后,客戶(hù)區(qū)域重新變得無(wú)效,除此之外最小化窗口之后再還原、窗口的一
      部分被覆蓋,都會(huì)引發(fā)這條消息。

      WM_DESTROY消息則是當(dāng)用戶(hù)按下“關(guān)閉”按鈕的時(shí)候被觸發(fā),標(biāo)準(zhǔn)的處理方法是調(diào)用
      PostQuitMessage 將一條 WM_QUIT 消息插入消息隊(duì)列,這將使得 GetMessage 函數(shù)調(diào)用
      返回0,從而退出消息循環(huán),結(jié)束整個(gè)程序。

      其實(shí),從上面可以看出,Windows程序的這種運(yùn)行機(jī)制并不是很難理解,真正困難的是不知
      道調(diào)用什么函數(shù)去完成想要的操作,以及怎樣調(diào)用那些函數(shù),從而靈活的進(jìn)行底層API程序
      開(kāi)發(fā),這是一個(gè)循序漸進(jìn)的積累過(guò)程,沒(méi)有捷徑可走的。請(qǐng)各位一定要記住。

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多