• VC++深入详解(孙鑫)(第一章 Windows 程序内部运行机制)学习笔记


     1.API(Application Programming Interface,应用程序编程接口);

     2.SDK(Software Development Kit,软件开发包);

     3.窗口:窗口是屏幕上的一块矩形区域,是Windows应用程序与用户进行交互的接口。

     4.句柄(HANDLE):句柄是Windows程序资源的标识号。

      常见的句柄:HWND(窗口句柄)、HICON(图标句柄)、HCURSOR(光标句柄)、HBRUSH(画刷句柄);

     5.消息与消息队列

      在Windows程序中,消息是由MSG结构体来表示的。MSG结构体的定义如下(参考MSDN):

    typedef struct tagMSG {
    HWND hwnd;
    UINT message;
    WPARAM wParam;
    LPARAM lParam;
    DWORD time;
    POINT pt;
    } MSG, *PMSG, *LPMSG;

      消息队列是在消息的传输过程中保存消息的容器。

      Windows将产生的消息依次放到消息队列中,而应用程序则通过一个消息循环不断地从消息队列中取出消息,并进行响应。这种消息机制,就是Windows程序运行的机制。

    6.WinMain函数

      WinMain函数的原型声明如下: 

    int WINAPI wWinMain(
    HINSTANCE hInstance, // handle to an instance
    HINSTANCE hPrevInstance, // has no meaning. It was used in 16-bit Windows, but is now always zero.
    PWSTR pCmdLine, // contains the command-line arguments as a Unicode string.
    int nCmdShow // a flag that says whether the main application window will be minimized, maximized, or shown normally.
    );

    7.窗口的创建过程

    1. 设计窗口类
    2. 注册窗口类
    3. 创建窗口
    4. 显示及更新窗口

      窗口的特征是由WNDCLASS结构体定义的,定义如下:

    typedef struct tagWNDCLASS {
    UINT style; // The class style(s).
    WNDPROC lpfnWndProc; // A pointer to the window procedure.
    int cbClsExtra; // The number of extra bytes to allocate following the window-class structure.
    int cbWndExtra; // The number of extra bytes to allocate following the window instance.
    HINSTANCE hInstance; // A handle to the instance that contains the window procedure for the class.
    HICON hIcon; // A handle to the class icon.If this member is NULL, the system provides a default icon.
    HCURSOR hCursor; // A handle to the class cursor.
    HBRUSH hbrBackground; // A handle to the class background brush.
    LPCTSTR lpszMenuName; // The resource name of the class menu, as the name appears in the resource file.
    LPCTSTR lpszClassName; // A pointer to a null-terminated string or is an atom.
    } WNDCLASS, *PWNDCLASS;

      窗口过程函数的定义如下:

    LRESULT CALLBACK WindowProc(
    __in HWND hwnd, // A handle to the window.
    __in UINT uMsg, // The message.
    __in WPARAM wParam, // Additional message information.
    __in LPARAM lParam // Additional message information.
    );

      注册窗口类的函数定义如下:

    ATOM WINAPI RegisterClass(
    __in const WNDCLASS *lpWndClass // A pointer to a WNDCLASS structure.
    );

      创建窗口的函数定义如下:

    HWND WINAPI CreateWindow(
    __in_opt LPCTSTR lpClassName, // The registered class name.
    __in_opt LPCTSTR lpWindowName, // The window name.
    __in DWORD dwStyle, // The style of the window being created.
    __in int x, // The initial horizontal position of the window.
    __in int y, // The initial vertical position of the window.
    __in int nWidth, // The width, in device units, of the window.
    __in int nHeight, // The height, in device units, of the window.
    __in_opt HWND hWndParent, // A handle to the parent or owner window of the window being created.
    __in_opt HMENU hMenu, // A handle to a menu, or specifies a child-window identifier depending on the window style.
    __in_opt HINSTANCE hInstance, // A handle to the instance of the module to be associated with the window.
    __in_opt LPVOID lpParam // Pointer to window-creation data.
    );

      显示窗口的函数定义如下:

    BOOL WINAPI ShowWindow(
    __in HWND hWnd, // A handle to the window.
    __in int nCmdShow // Controls how the window is to be shown.
    );

      更新窗口的函数定义如下:

    BOOL UpdateWindow(
    __in HWND hWnd // Handle to the window to be updated.
    );

      从消息队列中获取消息示例:

    BOOL bRet;
    MSG msg;
    while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
    {
    if (bRet == -1)
    {
    // handle the error and possibly exit
    }
    else
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }


    8.Windows程序示例

    #include <windows.h>
    #include <stdio.h>

    LRESULT CALLBACK MyWndProc(
    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, // command line
    int nCmdShow // show state
    )
    {
    // 设计窗口类
    WNDCLASS wndcls;
    wndcls.style = CS_HREDRAW | CS_VREDRAW;
    wndcls.lpfnWndProc = MyWndProc;
    wndcls.cbClsExtra = 0;
    wndcls.cbWndExtra = 0;
    wndcls.hInstance = hInstance;
    wndcls.hIcon = LoadIcon(NULL, IDI_ERROR); // LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SAMPLE1));
    wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
    wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // (HBRUSH)(COLOR_WINDOW+1);
    wndcls.lpszMenuName = NULL; // MAKEINTRESOURCE(IDC_SAMPLE1);
    wndcls.lpszClassName = "MyClassName";

    // 注册窗口类
    RegisterClass(&wndcls);

    // 创建窗口类
    HWND hWnd;
    hWnd = CreateWindow("MyClassName", "MyWindowName", WS_OVERLAPPEDWINDOW,
    0, 0, 600, 400, NULL, NULL, hInstance, NULL);

    // 显示和更新窗口
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    // 消息循环
    BOOL bRet;
    MSG msg;
    while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
    {
    if (bRet == -1)
    {
    // handle the error and possibly exit
    return -1;
    }
    else
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }

    return 0;
    }

    LRESULT CALLBACK MyWndProc(
    HWND hWnd, // handle to window
    UINT uMsg, // message identifier
    WPARAM wParam, // first message parameter
    LPARAM lParam // second message parameter
    )
    {
    switch(uMsg)
    {
    case WM_CHAR:
    {
    char szChar[20];
    sprintf(szChar, "char is %c", char(wParam));
    MessageBox(hWnd, szChar, "WM_CHAR", 0);
    }
    break;
    case WM_LBUTTONDOWN:
    {
    MessageBox(hWnd, "mouse clicked", "WM_LBUTTONDOWN", 0);
    HDC hDC;
    hDC = GetDC(hWnd);
    TextOut(hDC, 0, 50, "WM_LBUTTONDOWN", strlen("WM_LBUTTONDOWN"));
    ReleaseDC(hWnd, hDC);
    }
    break;
    case WM_PAINT:
    {
    PAINTSTRUCT ps;
    HDC hDC;
    hDC=BeginPaint(hWnd, &ps);
    TextOut(hDC, 0, 0, "WM_PAINT", strlen("WM_PAINT"));
    EndPaint(hWnd, &ps);
    }
    break;
    case WM_CLOSE:
    {
    if(IDYES == MessageBox(hWnd, "是否真的结束?", "WM_CLOSE", MB_YESNO))
    DestroyWindow(hWnd);
    }
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
    }


     

  • 相关阅读:
    左偏树
    output html
    jsp web.xml
    mysql link db
    beamline
    jsp embend java into html / mix scriptlets and HTML
    StringTokenizer
    TreeSet
    centOS 显示中文
    request and response
  • 原文地址:https://www.cnblogs.com/plus/p/2237171.html
Copyright © 2020-2023  润新知