005 windows訊息機制

來源:互聯網
上載者:User

標籤:dial   繪圖   raw   fas   while   接收參數   bsp   show   round   

#windows訊息機制

    建立第一個Win32應用程式 

    VS2015 建立項目 Win32應用程式

 

// Win32WindowDemo.cpp : 定義應用程式的進入點。//#include "stdafx.h"#include "Win32WindowDemo.h"#define MAX_LOADSTRING 100// 全域變數: HINSTANCE hInst;                                // 當前執行個體WCHAR szTitle[MAX_LOADSTRING];                  // 標題列文本WCHAR szWindowClass[MAX_LOADSTRING];            // 主視窗類名// 此代碼模組中包含的函數的前向聲明: ATOM                MyRegisterClass(HINSTANCE hInstance);BOOL                InitInstance(HINSTANCE, int);LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
//程式進入點

//#define CALLBACK __stdcall    VS預設用的是 __stdcall
//#define WINAPI __stdcall      VS預設用的是 __stdcall
//#define WINAPIV __cdecl       其他版本用編譯器用的是 __cdecl
//#define APIENTRY WINAPI

//棧 -》 傳遞參數

//棧幀 -》 平棧

//__stdcall 是函數調用預定的一種,函數呼叫慣例主要約束了兩件事。

  //1.參數行程順序

  //2.呼叫堆疊由誰(調用函數或被調用函數)清理

  常用的函數呼叫慣例:stdcall cdecl fastcall thiscall naked call

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,       //int型 wWinMain tWinMain WinMain  不同的編碼模式 ASCII UNCIODE                     _In_opt_ HINSTANCE hPrevInstance,                     _In_ LPWSTR    lpCmdLine,                     _In_ int       nCmdShow)
            
            //HINSTANCE hInstance 核心對象 執行個體對象       作業系統告訴我們
            //HINSTANCE hPrevInstance 啟動我的這個進程是誰   作業系統告訴我們
            //lpCmdLine    接收參數運行成           使用者告訴我們的
            //nCmdShow      啟動的方式            使用者高速我們的{ UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine);

      //兩個宏定義
// TODO: 在此放置代碼。 // 初始化全域字串 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WIN32WINDOWDEMO, szWindowClass, MAX_LOADSTRING);

    //LoadStringW 進行字串的載入
    //IDS 資源表裡面定義的字串 一個是程式的標題 一個是 視窗類別名
    // 國際化 多元化 的一種方式
    MyRegisterClass(hInstance); //向系統註冊視窗類別    // 執行應用程式初始化:     if (!InitInstance (hInstance, nCmdShow))    {        return FALSE;    }    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32WINDOWDEMO));    MSG msg;    // 主訊息迴圈: 
    //擷取訊息
    //&msg 結構體
      typedef struct tagMSG{
          HWND hwnd       視窗執行個體
          UINT message;    視窗訊息
          WPARAM wParam    附加值
          LPARAM lParam;    附加值
          DWORD time;     訊息時間
          POINT ps;      滑鼠位置
        }
while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam;}//// 函數: MyRegisterClass()//// 目的: 註冊視窗類別。//ATOM MyRegisterClass(HINSTANCE hInstance){ WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;                      //視窗風格 wcex.lpfnWndProc = WndProc;                               //視窗類別 wcex.cbClsExtra = 0;                                  //預留空間的附加值,此程式沒用到這個域! wcex.cbWndExtra = 0;                                  //預留空間的附加值,此程式沒用到這個域! wcex.hInstance = hInstance;                             //執行個體控制代碼,主函數的參數之一! wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32WINDOWDEMO)); //裝載表徵圖函數,在這可以裝載自己的表徵圖! wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);                 //裝載游標函數,在這可以裝載自己的游標! wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);                    //初始化視窗的畫刷 wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WIN32WINDOWDEMO);            //視窗菜單 wcex.lpszClassName = szWindowClass;                          //程式名字! wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex);//// 函數: InitInstance(HINSTANCE, int)//// 目的: 儲存執行個體控制代碼並建立主視窗
//// 注釋: //// 在此函數中,我們在全域變數中儲存執行個體控制代碼並// 建立和顯示主程式視窗。//BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){ hInst = hInstance; // 將執行個體控制代碼儲存在全域變數中 HWND hWnd =  CreateWindowW(szWindowClass,             //應用程式在作業系統註冊表中的名稱
          szTitle,                         
//應用程式標題欄名稱
          WS_OVERLAPPEDWINDOW,                 
//視窗風格       CW_USEDEFAULT,                      //視窗顯示時左上方x座標
          0,                            
//視窗顯示時左上方y座標
          CW_USEDEFAULT,                     
//視窗顯示時右下角x座標
          0,                            
//視窗顯示時右下角y座標
          nullptr,                         
//父視窗控制代碼,此程式沒有
          nullptr,                         
//菜單控制代碼
          hInstance,                       
//handle程式執行個體控制代碼if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow);          //顯示視窗 UpdateWindow(hWnd); return TRUE;}

 

////  函數: WndProc(HWND, UINT, WPARAM, LPARAM)////  目的:    處理主視窗的訊息。////  WM_COMMAND  - 處理應用程式菜單//  WM_PAINT    - 繪製主視窗//  WM_DESTROY  - 發送退出訊息並返回////
#訊息是已整數形式傳送的LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
              //HWND 執行個體
              //message 訊息佇列
              //附加值
              //附加值
{    switch (message)    {    case WM_COMMAND:        {            int wmId = LOWORD(wParam);            // 分析菜單選擇:             switch (wmId)            {            case IDM_ABOUT:                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);                break;            case IDM_EXIT:                DestroyWindow(hWnd);                break;            default:                return DefWindowProc(hWnd, message, wParam, lParam);            }        }        break;    case WM_PAINT:        {            PAINTSTRUCT ps;            HDC hdc = BeginPaint(hWnd, &ps);            // TODO: 在此處添加使用 hdc 的任何繪圖代碼...            EndPaint(hWnd, &ps);        }        break;    case WM_DESTROY:        PostQuitMessage(0);        break;    default:        return DefWindowProc(hWnd, message, wParam, lParam);    }    return 0;}// “關於”框的訊息處理常式。INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){    UNREFERENCED_PARAMETER(lParam);    switch (message)    {    case WM_INITDIALOG:        return (INT_PTR)TRUE;    case WM_COMMAND:        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)        {            EndDialog(hDlg, LOWORD(wParam));            return (INT_PTR)TRUE;        }        break;    }    return (INT_PTR)FALSE;}

 

#MFC  Win32 

  由於win32 開發程式比較繁瑣複雜

      訊息體系

  MFC其實就是將 訊息和方法 封裝成了 類

   MFC中 函數 跟win32 api 函數的參數是不一樣的..

    MSDN MFC是中文的 win32 api 是英文的

    

005 windows訊息機制

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.