操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    近日,朋友圈有這樣的傳言:友情提示,得消息,嘉定開始要靜默5天,取消所有快遞、外買(賣)、團購、拼團,請大家今天想辦法備些食品以渡靜默期。網傳說法是否為真?

    上海辟謠平臺經向嘉定區防控辦了解,根據市統一部署,從4月15日-4月21日,全區采取“全域靜態管理、全員核酸檢測、全面流調排查、全民清潔消殺,全程查漏補缺”等綜合防控措施,全面發起清零攻堅。攻堅期間繼續實施“三區”分區分級差異化防控管理,居民可繼續通過社區團購等方式采購生活物資,各街鎮的保供物資也正陸續配送到居民家。

    來源: 上海網絡辟謠

    理解一個程序的生命歷程能更好地理解一個程序的本質特征,控制臺程序、Windows API程序以及MFC程序的生命歷程的實現有很大差別。

    DOS(單任務系統)程序(控制臺程序)是面向批命令或事務的過程驅動程序,Window(多任務系統)程序是面向用戶的基于消息的事件驅動程序(Message Based,Event Driven)。Windows應用程序設計的核心就是消息的傳遞和處理。

    事件驅動程序(如Windows API、MFC程序)以窗口為中心,根據用戶的不同操作激活處理相應事件的代碼并完成相應的任務。事件驅動編程方式是一種全新的程序設計方法,它不是由事件的順序來控制的,而是由事件的發生來控制,而這種事件的發生是隨機的、不確定的,并沒有預定的順序,這樣就允許程序的用戶用各種合理的順序來安排程序的流程。

    對于需要用戶交互的應用程序來說,事件驅動的程序設計有著過程驅動方法無法替代的優點。它是一種面向用戶的程序設計方法,它在程序設計過程中除了完成所需功能之外,更多地考慮了用戶可能的各種輸入,并針對性地設計相應的處理程序。它是一種“被動”式的程序設計方法,程序開始運行時,處于等待用戶輸入事件狀態,然后取得事件并做相應的反應,處理完畢又返回并處于等待事件狀態。

    一、控制臺程序的生命歷程

    1 main函數執行之前,主要就是初始化系統相關資源

    1.1 設置棧指針;

    1.2 初始化static靜態和global全局變量,即data段的內容;

    1.3 將未初始化部分的全局變量賦初值:數值型short,int,long等為0,bool為FALSE,指針為NULL,等等,即.bss段的內容

    1.4 運行全局構造器(如果是C++控制臺程序);

    1.5 將main函數的參數,argc,argv等傳遞給main函數,然后才真正運行main函數。

    2 順序執行main()函數中的代碼,包括調用其他函數。

    3 程序的結束

    3.1 遇到程序終止函數,如abort()、exit()函數,即結束(中止)程序;

    3.2 main()函數中的return代碼行;

    3.3 可以用atexit()或onexit 注冊一個函數,它會在main 之后執行。

    二、Windows API程序的生命歷程

    1 程序初始化過程中調用CreateWindow,為程序建立了一個窗口,做為程序的舞臺。CreateWindow 產生窗口之后會送出WM_CREATE 直接給窗口函數,后者于是可以在此時機做些初始化動作(例如配置內存、開文件、讀初始資料... )。

    2 程序活著的過程中,不斷以GetMessage 從消息隊列中抓取消息。如果這個消息是WM_QUIT,GetMessage 會傳回0 而結束while 循環,進而結束整個程序。

    3 DispatchMessage 透過Windows USER 模塊的協助與監督,把消息分派至窗口函數。消息將在該處被判別并處理。

    4 程序不斷進行2 和3 的動作。

    5 當使用者按下系統菜單中的Close 命令項,系統送出WM_CLOSE。通常程序的窗口函數不欄截此消息,于是DefWindowProc 處理它。

    6 DefWindowProc 收到WM_CLOSE 后, 調用DestroyWindow 把窗口清除。DestroyWindow 本身又會送出WM_DESTROY。

    7 程序對WM_DESTROY 的標準反應是調用PostQuitMessage。

    8 PostQuitMessage 沒什么其它動作,就只送出WM_QUIT 消息,準備讓消息循環中的GetMessage 取得,如步驟2,結束消息循環。

    一個完整的windows API程序的代碼請見后附。

    三、MFC程序的生命歷程

    MFC 應用程序代碼一開始是一個衍生自CWinApp 的全域對象application object,然后是一個隱藏的WinMain 函數,調用application object 的InitInstance 函數,將程序初始化。初始化動作包括構造一個窗口對象(CFrameWnd 物件),而其構造式又調用CFrameWnd::Create 產生真正的窗口(并在產生之前要求MFC注冊窗口類別)。窗口產生后WinMain 又調用Run 激活消息循環,將WM_COMMAND(IDM_ABOUT)和WM_PAINT 分別交給成員函數OnAbout 和OnPaint 處理。

    1 程序的誕生

    1.1 Application object 產生,內存于是獲得配置,初值亦設立了。

    1.2 Afx WinMain 執行AfxWinInit,后者又調用AfxInitThread,把消息隊列盡量加大到96。

    1.3 Afx WinMain 執行InitApplication。這是CWinApp 的虛擬函數,但我們通常不改寫它。

    1.4 AfxWinMain 執行InitInstance。這是CWinApp 的虛擬函數,我們必須改寫它。

    1.5 CMyWinApp::InitInstance 'new' 了一個CMyFrameWnd 對象。

    1.6 CMyFrameWnd 構造式調用Create,產生主窗口。我們在Create 參數中指定的窗口類別是NULL, 于是MFC 根據窗口種類, 自行地為我們注冊一個名為"AfxFrameOrView42d" 的窗口類別。

    1.7 回到InitInstance 中繼續執行ShowWindow,顯示窗口。

    1.8 執行UpdateWindow,于是發出WM_PAINT。

    1.9 回到AfxWinMain,執行Run,進入消息循環。

    2 程序開始運作

    2.1 程序獲得WM_PAINT 消息(藉由CWinApp::Run 中的::GetMessage 循環)。

    2.2 WM_PAINT 經由::DispatchMessage 送到窗口函數CWnd::DefWindowProc 中。

    2.3 CWnd::DefWindowProc 將消息繞行(routing)過消息映射表格(Message Map)。

    2.4 繞行過程中發現有吻合項目,于是調用項目中對應的函數。此函數是應用程序利用BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之間的宏設立起來的。

    2.5 標準消息的處理例程亦有標準命名,例如WM_PAINT 必然由OnPaint 處理。

    3 程序的死亡

    3.1 使用者選按【File/Close】,于是發出WM_CLOSE。

    3.2 CMyFrameWnd 并沒有設置WM_CLOSE 處理例程,于是交給預設之處理例程。

    3.3 預設函數對于WM_CLOSE 的處理方式是調用::DestroyWindow, 并因而發出WM_DESTROY。

    3.4 預設之WM_DESTROY 處理方式是調用::PostQuitMessage,因此發出WM_QUIT。

    3.5 CWinApp::Run 收到WM_QUIT 后會結束其內部之消息循環, 然后調用ExitInstance,這是CWinApp 的一個虛擬函數。

    3.6 如果CMyWinApp 改寫了ExitInstance , 那么CWinApp::Run 所調用的就是CMyWinApp::ExitInstance,否則就是WinApp::ExitInstance。

    3.7 最后回到AfxWinMain,執行AfxWinTerm,結束程序。

    附:

    #include <windows.h>
    #include <mmsystem.h>
    #pragma comment(lib,"winmm.lib")
    //Windows項目要使用Windows子系統, 而不是Console, 可以這樣設置: 
    //[Project] --> [Settings] --> 選擇"Link"屬性頁,
    //在Project Options中將/subsystem:console改成/subsystem:windows
     
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
     
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
     static TCHAR szAppName[] = TEXT("HelloWin32");
     HWND hwnd;
     MSG msg;
     WNDCLASS wndclass;
     
     wndclass.style = CS_HREDRAW | CS_VREDRAW;
     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(WHITE_BRUSH);
     wndclass.lpszMenuName = NULL;
     wndclass.lpszClassName = szAppName;
     
     if (!RegisterClass(&wndclass))
     {
     MessageBox(NULL, TEXT("This program requires windows NT!"), szAppName, MB_ICONERROR);
     return 0;
     }
     
     hwnd = CreateWindow(szAppName, // window class name
     TEXT("The Hello Program"), // window caption
     WS_OVERLAPPEDWINDOW, // window style
     CW_USEDEFAULT, // initial x position
     CW_USEDEFAULT, // initial y position
     CW_USEDEFAULT, // initial x size
     CW_USEDEFAULT, // initial y size
     NULL, // parent window handle
     NULL, // window menu handle
     hInstance, // program instance handle
     NULL); // creation parameters
     
     ShowWindow(hwnd, iCmdShow);
     UpdateWindow(hwnd);
     
     while (GetMessage(&msg, NULL, 0, 0))
     {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
     }
     
     return msg.wParam;
    }
     
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
     HDC hdc;
     PAINTSTRUCT ps;
     RECT rect;
     
     switch (message)
     {
     case WM_CREATE:
     PlaySound(TEXT("hellowin32.wav"), NULL, SND_FILENAME | SND_ASYNC);
     return 0;
     
     case WM_PAINT:
     hdc = BeginPaint(hwnd, &ps);
     
     GetClientRect(hwnd, &rect);
     DrawText(hdc, TEXT("Hello Windows 7!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
     
     EndPaint(hwnd, &ps);
     return 0;
     
     case WM_DESTROY:
     PostQuitMessage(0);
     return 0;
     }
     
     return DefWindowProc(hwnd, message, wParam, lParam);
    }
    

    -End-

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有