小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

孫鑫VC視頻教程筆記之第一課“Windows程序的內(nèi)部運(yùn)行原理”

 Alex@ZW 2010-11-04

1.      操作系統(tǒng)和應(yīng)用程序之間的關(guān)系:
應(yīng)用程序到操作系統(tǒng)表示應(yīng)用程序可以通知操作系統(tǒng)執(zhí)行某個(gè)具體的動(dòng)作
操作系統(tǒng)到應(yīng)用程序表示操作系統(tǒng)能夠?qū)⑤斎朐O(shè)備的變化上傳給應(yīng)用程序。如用戶在某個(gè)程序活動(dòng)時(shí)按了一下鍵盤,操作系統(tǒng)馬上能夠感知到這一事件,并且能夠知道用戶按下的是哪一個(gè)鍵,操作系統(tǒng)并不決定對(duì)這一事件如何作出反應(yīng),而是將這一事件轉(zhuǎn)交給應(yīng)用程序,由應(yīng)用程序決定如何對(duì)這一事件作出反應(yīng)。

 

2.      windows程序設(shè)計(jì)是種事件驅(qū)動(dòng)方式的程序設(shè)計(jì),主要基于消息的。當(dāng)用戶需要完成某種功能時(shí),需要調(diào)用OS某種支持,然后OS將用戶的需要包裝成消息,并投入到消息隊(duì)列中,最后應(yīng)用程序從消息隊(duì)列中取走消息并進(jìn)行響應(yīng)。
每個(gè)應(yīng)用程序OS都為它建立一個(gè)消息隊(duì)列,消息隊(duì)列是個(gè)先進(jìn)先出的緩沖區(qū),其中每個(gè)元素都是一個(gè)消息,OS將生成的每個(gè)消息按先后順序放進(jìn)消息隊(duì)列中,應(yīng)用程序總是取走當(dāng)前消息隊(duì)列中的第一條消息,應(yīng)用程序取走消息后便知道用戶的操作和程序的狀態(tài),然后對(duì)其處理即消息響應(yīng),消息響應(yīng)通過(guò)編碼實(shí)現(xiàn)。

 

3.      創(chuàng)建一個(gè)完整的窗口需要經(jīng)過(guò)下面四個(gè)操作步驟

1)       設(shè)計(jì)一個(gè)窗口類。如:WNDCLASS wndcls

2)       注冊(cè)窗口類。如:RegisterClass(&wndcls)

3)       創(chuàng)建窗口。如:CreateWindow(),CreateWindowEX();

4)       顯示及更新窗口。如:ShowWindow(),UpdateWindow();

 

4.      消息的結(jié)構(gòu):

typedef struct tagMSG {   

    HWND   hwnd;     //接收消息的窗口句柄,和哪個(gè)窗口相關(guān)聯(lián)。

    UINT   message;  //消息標(biāo)識(shí),消息本身是什么,如WM_CHAR

    WPARAM wParam;   //消息的附加信息,具體取決于消息本身。 

    LPARAM lParam;

    DWORD  time;     //消息投遞時(shí)間。

    POINT  pt;       //消息投遞時(shí),光標(biāo)在屏幕上的位置。

} MSG;

 

5.      WinMain函數(shù)結(jié)構(gòu):

int WINAPI WinMain(

  HINSTANCE hInstance,  // 當(dāng)前實(shí)例句柄。

  HINSTANCE hPrevInstance,  //上一個(gè)該程序的實(shí)例句柄,32位系統(tǒng)中此值都為NULL

  LPSTR lpCmdLine,      // 命令行指針

  int nCmdShow          // (窗口)顯示的狀態(tài)

);

要帶參調(diào)用WinMain類似于命令行的功能,在Project->setting->Debug->Program arguments項(xiàng)填寫參數(shù)

 

6.      窗口類WNDClass

typedef struct _WNDCLASS {

    UINT    style;        //窗口的類型

    WNDPROC lpfnWndProc;  //窗口過(guò)程函數(shù)指針(回調(diào)函數(shù))

    int     cbClsExtra; //窗口類附加字節(jié),為該類窗口所共享。通常0。

    int     cbWndExtra; //窗口附加字節(jié)。通常設(shè)為0。

    HANDLE  hInstance;  //當(dāng)前應(yīng)用程序事例句柄。

    HICON   hIcon;      //圖標(biāo)句柄 LoadIcon();

    HCURSOR hCursor;    //光標(biāo)句柄 LoadCursor();

    HBRUSH  hbrBackground; //畫刷句柄 (HBRUSH)GetStockObject();

    LPCTSTR lpszMenuName;  //菜單名字

    LPCTSTR lpszClassName; //類的名字

} WNDCLASS;

 

 

7.      源碼(在VC中建立Win32 Application):

#include<windows.h>

#include<stdio.h>

 

//回調(diào)函數(shù)聲明

LRESULT CALLBACK WindowProc(

   HWND hwnd,      // handle to window

   UINT uMsg,      // message identifier

   WPARAM wParam,  // first message parameter

   LPARAM lParam   // second message parameter

);

 

int WINAPI WinMain(

   HINSTANCE hInstance,  // handle to current instance

   HINSTANCE hPrevInstance,  // handle to previous instance

   LPSTR lpCmdLine,      // pointer to command line

   int nCmdShow          // show state of window

)

{

   //第一步:設(shè)計(jì)窗口類

   WNDCLASS wndcls;

   wndcls.cbClsExtra=0;

   wndcls.cbWndExtra=0;

 

   //The GetStockObject function retrieves a handle to one of the predefined stock pens, brushes, fonts, or palettes.

   wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //得到預(yù)定義的畫刷,畫筆等

   wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); //如果采用預(yù)定義的光標(biāo),則第一參數(shù)為NULL

   wndcls.hIcon=LoadIcon(NULL,IDI_WARNING);//同上

   wndcls.hInstance=hInstance;

   wndcls.lpfnWndProc=WindowProc; //回調(diào)函數(shù)

   wndcls.lpszClassName="winmain"; //給本窗口類取個(gè)名字

   wndcls.lpszMenuName=NULL;

   wndcls.style=CS_HREDRAW | CS_VREDRAW; //水平和垂直重畫,這在窗口水平和垂直調(diào)整大小的時(shí)候告知窗口是否需要重畫,如果填寫上述兩個(gè)參數(shù),則表示重畫,窗口上的內(nèi)容將清除重畫

 

   //第二步:注冊(cè)窗口類

   RegisterClass(&wndcls);

  

   //第三步:創(chuàng)建窗口

   HWND hwnd;

   hwnd=CreateWindow("winmain","this is first lesson",WS_OVERLAPPEDWINDOW,                CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,                 NULL,hInstance,NULL);

 

   //第四步:顯示窗口

   ShowWindow(hwnd,SW_SHOWNORMAL);

 

   //第五步:重刷一下窗口,該語(yǔ)句可有可無(wú)

   UpdateWindow(hwnd);

 

   MSG msg;

 

   //每次循環(huán)從消息隊(duì)列中取出一條消息進(jìn)行處理If the GetMessage retrieves a message other than WM_QUIT, the return value is nonzero.If the function retrieves the WM_QUIT message, the return value is zero.

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

   {

        //該語(yǔ)句將類似于WM_KeyDownWM_KeyUp轉(zhuǎn)換生成新WM_CHAR投遞給系統(tǒng)處理

        //The WM_CHAR message is posted to the window with the keyboard focus

        //when a WM_KEYDOWN message is translated by the TranslateMessage function.

        //WM_CHAR contains the character code of the key that was pressed.

        TranslateMessage(&msg);

 

        //將消息投遞出去給操作系統(tǒng),操作系統(tǒng)會(huì)自動(dòng)調(diào)用回調(diào)函數(shù)處理

        DispatchMessage(&msg);

   }

   return 0;

}

 

LRESULT CALLBACK WindowProc(

   HWND hwnd,      // handle to window

   UINT uMsg,      // message identifier

   WPARAM wParam,  // first message parameter

   LPARAM lParam   // second message parameter

                                    )

{

   HDC hdc;

   switch(uMsg) {

   case WM_PAINT:

        PAINTSTRUCT ps;

        hdc=BeginPaint(hwnd,&ps);

        TextOut(hdc,0,10,"hello world!",strlen("hello world!"));

        EndPaint(hwnd,&ps);

        break;

   case WM_CHAR:

        char szChar[20];

        sprintf(szChar,"char is %d",wParam);

        MessageBox(hwnd,szChar,"消息",MB_OK);

   case WM_LBUTTONDOWN:

        hdc=GetDC(hwnd); //得到當(dāng)前窗口的上下文句柄

        TextOut(hdc,0,50,"beijing2008!",strlen("beijing2008!"));

        ReleaseDC(hwnd,hdc);

        break;

   case WM_CLOSE:

        if(IDOK==MessageBox(hwnd,"確認(rèn)要退出嘛?","消息",MB_OK))

        {

              //銷毀窗口,但進(jìn)程中還是保留的,該函數(shù)直接拋出WM_DESTROY消息

              DestroyWindow(hwnd);

        }

        break;

   case WM_DESTROY:

        PostQuitMessage(0); //終止消息循環(huán),并拋出WM_QUIT消息,從而導(dǎo)致上面的消息循環(huán)退出

   default:

        //對(duì)于代碼中沒有涉及到的消息,由提交給系統(tǒng)處理,此句一定要加,否則窗口不會(huì)出現(xiàn)

        return DefWindowProc(hwnd,uMsg,wParam,lParam);

   }

   return 0;

}

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(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)遵守用戶 評(píng)論公約

    類似文章 更多