【MFC】1.Windows程序内部运行原理
1.原理與內(nèi)容
Windows應(yīng)用程序,操作系統(tǒng),計(jì)算機(jī)硬件之間的相互關(guān)系:
向下的箭頭③表示應(yīng)用程序可以通知操作系統(tǒng)執(zhí)行某個(gè)具體的動(dòng)作,如操作系統(tǒng)能夠控制聲卡發(fā)出聲音,但它并不知道應(yīng)該何時(shí)發(fā)出何種聲音,需要應(yīng)用程序告訴操作系統(tǒng)該發(fā)出什么樣的聲音。這個(gè)關(guān)系好比有個(gè)機(jī)器人能夠完成行走的功能,但是,如果人們不告訴它往哪個(gè)方向上走,機(jī)器人是不會(huì)主動(dòng)行走的。這里的機(jī)器人就是操作系統(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)。好比有個(gè)蚊子叮了我們一口,我們的神經(jīng)末梢(相當(dāng)于操作系統(tǒng))馬上感知到這一事件,并傳遞給了我們的大腦(相當(dāng)于應(yīng)用程序),我們的大腦最終決定如何對(duì)這一事件作出反應(yīng),如將蚊子趕走,或是將蚊子拍死。對(duì)事件作出反應(yīng)的過程就是消息響應(yīng)。?
句柄(HANDLE),資源的標(biāo)識(shí)。操作系統(tǒng)要管理和操作這些資源,都是通過句柄來找到對(duì)應(yīng)的資源。按資源的類型,又可將句柄細(xì)分成圖標(biāo)句柄(HICON),光標(biāo)句柄(HCURSOR),窗口句柄(HWND),應(yīng)用程序?qū)嵗浔?#xff08;HINSTANCE)等等各種類型的句柄。操作系統(tǒng)給每一個(gè)窗口指定的一個(gè)唯一的標(biāo)識(shí)號(hào)即窗口句柄。?
創(chuàng)建一個(gè)完整的窗口需要經(jīng)過下面四個(gè)操作步驟:
(1)設(shè)計(jì)一個(gè)窗口類;
(2)注冊(cè)窗口類;
(3)創(chuàng)建窗口;
(4)顯示及更新窗口。
2.API程序代碼
#include<windows.h> #include<stdio.h>//回調(diào)函數(shù)聲明 LRESULT CALLBACK WindowProc(HWND hwnd, // handle to windowUINT uMsg, // message identifierWPARAM wParam, // first message parameterLPARAM lParam // second message parameter );//操作系統(tǒng)調(diào)用,并給WINMAIN分配一個(gè)實(shí)例號(hào),并傳遞參數(shù) int WINAPI WinMain(HINSTANCE hInstance, // handle to current instanceHINSTANCE hPrevInstance, // handle to previous instanceLPSTR lpCmdLine, // pointer to command lineint nCmdShow // show state of window 最大化顯示 還是最小化顯示 ) {//第一步:設(shè)計(jì)窗口類WNDCLASS wndcls; wndcls.style = CS_HREDRAW | CS_VREDRAW; // 水平和垂直重畫,在窗口調(diào)整大小的時(shí)候告知// 是否需要重畫,如果填寫兩參數(shù),表示重畫,窗口內(nèi)容將清除重畫wndcls.lpfnWndProc = WindowProc; // 回調(diào)函數(shù)// 當(dāng)應(yīng)用程序收到某個(gè)窗口的消息,消息與窗口相關(guān),需要調(diào)用一個(gè)函數(shù)作相應(yīng), <span style="white-space:pre"> </span> // 這些工作本來是有操作系統(tǒng)進(jìn)行處理的,但是需要我們進(jìn)行通知// 不同的窗口有特定回調(diào)函數(shù)wndcls.cbClsExtra = 0; //類額外數(shù)據(jù),內(nèi)存空間稱為類的附加內(nèi)存wndcls.cbWndExtra = 0; //窗口附加內(nèi)存wndcls.hInstance = hInstance; //當(dāng)前實(shí)例號(hào),即利用操作系統(tǒng)傳進(jìn)來的形參hInstance進(jìn)行復(fù)制wndcls.hIcon = LoadIcon(NULL,IDI_ERROR ); //微軟的標(biāo)準(zhǔn)圖標(biāo)第一個(gè)參數(shù)皆為NULLwndcls.hCursor = LoadCursor(NULL,IDC_ARROW); //如用預(yù)定義光標(biāo),第一參數(shù)為NULL,IDC_CROSSwndcls.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); //得到預(yù)定義的畫刷,畫筆等wndcls.lpszMenuName = NULL; //窗口菜單名wndcls.lpszClassName = "winmain"; //給本窗口類取個(gè)名字//第二步:注冊(cè)窗口類RegisterClass(&wndcls); //向操作系統(tǒng)注冊(cè)//第三步:創(chuàng)建窗口HWND hwnd; //句柄,標(biāo)識(shí)/特征等,分配資源hwnd = CreateWindow("winmain", //操作系統(tǒng)認(rèn)識(shí)的名字<span style="white-space:pre"> </span>"第一個(gè)實(shí)驗(yàn)!", //標(biāo)題欄的名字WS_OVERLAPPEDWINDOW /* &~WS_MAXIMIZEBOX */,0,//CW_USEDEFAULT,//窗口顯示的時(shí)候,采用操作系統(tǒng)默認(rèn)為位置及大小0,//CW_USEDEFAULT,200,//CW_USEDEFAULT,200,//CW_USEDEFAULT, /*自主設(shè)定0,0,100,200*/NULL, //父窗口的句柄 NULL, //菜單的句柄hInstance, //當(dāng)前的實(shí)例,操作系統(tǒng)傳的值NULL);//第四步:顯示窗口ShowWindow(hwnd,SW_SHOWNORMAL); //顯示哪一個(gè)窗口???//第五步:更新窗口,可有可無UpdateWindow(hwnd);MSG msg;//每次循環(huán)從消息隊(duì)列中取出一條消息進(jìn)行處理while(GetMessage(&msg,NULL,0,0)) //NULL 調(diào)用線程任意窗口的消息{//該語句將類似于WM_KeyDown和WM_KeyUp轉(zhuǎn)換生成新WM_CHAR投遞給系統(tǒng)處理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 windowUINT uMsg, // message identifierWPARAM wParam, // first message parameterLPARAM 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,"Warnning!",MB_OK);case WM_LBUTTONDOWN:hdc=GetDC(hwnd); //得到當(dāng)前窗口的上下文句柄TextOut(hdc,0,50,"沈春旭作品",strlen("沈春旭作品"));ReleaseDC(hwnd,hdc);break;case WM_CLOSE:if(IDOK==MessageBox(hwnd,"確認(rèn)要退出嘛?","Warning!",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; }3.執(zhí)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的【MFC】1.Windows程序内部运行原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “局域网聊天”开始了
- 下一篇: [多图]Google Chrome漫画书