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