VC++深入详解 孙鑫 第一章 Windows程序内部运行机制

Posted focusahaha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++深入详解 孙鑫 第一章 Windows程序内部运行机制相关的知识,希望对你有一定的参考价值。

1.API与SDK

  API (Application Programming Interface) 应用程序接口

  SDK(Software Development Kit) 软件开发包,包括API函数,帮助文档,微软提供的一些辅助开发工具。

2.窗口和句柄

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

  在Windows应用程序中,窗口是通过窗口句柄(资源标识)来标识的。

3.消息和消息队列

  Windows程序设计是一种基于消息的事件驱动方式的程序设计模式。

  每当一个Windows应用程序创建后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序一的窗口的消息,消息产生后被投递到消息队列中,应用程序通过一个消息循环不断的消息队列中取出消息进行响应。

4.创建一个完整的Win32程序(实现创建一个窗口)  

  创建一个完整的窗口的四个步骤,1设计窗口类,2注册窗口类,3创建窗口,4显示及更新窗口 

技术图片
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <stdexcept>
using namespace std;

//回调函数原型声明,返回长整形的结果码,CALLBACK是表示stdcall调用
LRESULT CALLBACK WinProc(
    HWND hwnd,      // handle to window
    UINT uMsg,      // message identifier
    WPARAM wParam,  // first message parameter
    LPARAM lParam   // second message parameter
    );

//(1) WinMain函数,程序入口点函数
int WINAPI WinMain(
    HINSTANCE hInstance,      // handle to current instance
    HINSTANCE hPrevInstance,  // handle to previous instance
    LPSTR lpCmdLine,          // command line
    int nCmdShow              // show state
    ){
    //(2)
    //一.设计一个窗口类,类似填空题,使用窗口结构体
    WNDCLASS wnd;
    wnd.cbClsExtra = 0; //类的额外内存
    wnd.cbWndExtra = 0;    //窗口的额外内存
    wnd.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);//创建一个空画刷填充背景
    //加载游标,如果是加载标准游标,则第一个实例标识设置为空
    wnd.hCursor = LoadCursor(NULL, IDC_CROSS);
    wnd.hIcon = LoadIcon(NULL, IDI_ERROR);
    wnd.hInstance = hInstance;//实例句柄赋值为程序启动系统分配的句柄值
    wnd.lpfnWndProc = WinProc;//消息响应函数
    wnd.lpszClassName = "gaojun";//窗口类的名子,在注册时会使用到
    wnd.lpszMenuName = NULL;//默认为NULL没有标题栏
    wnd.style = CS_HREDRAW | CS_VREDRAW;//定义为水平和垂直重画
    //二.注册窗口类
    RegisterClass(&wnd);
    //三.根据定制的窗口类创建窗口
    HWND hwnd;//保存创建窗口后的生成窗口句柄用于显示
    //如果是多文档程序,则最后一个参数lParam必须指向一个CLIENTCREATESTRUCT结构体
    hwnd = CreateWindow("gaojun", "WIN32应用程序", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);
    //四.显示窗口
    ShowWindow(hwnd, SW_SHOWDEFAULT);
    //五.更新窗口
    UpdateWindow(hwnd);

    //(3).消息循环
    MSG msg;//消息结构体
    //如果消息出错,返回值是-1,当GetMessage从消息队列中取到是WM_QUIT消息时,返回值是0
    //也可以使用PeekMessage函数从消息队列中取出消息
    BOOL bSet;
    while ((bSet = GetMessage(&msg, NULL, 0, 0)) != 0){
        if (-1 == bSet)
        {
            return -1;
        }
        else{
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return 0;//程序结束,返回0
}

//消息循环中对不同的消息各类进行不同的响应
LRESULT CALLBACK WinProc(
    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 %d;", wParam);//格式化操作,stdio.h
        MessageBox(hwnd, szChar, "gaojun", 0);//输出操作windows.h中
        break;
    case WM_LBUTTONDOWN://鼠标左键按下消息
        MessageBox(hwnd, "this is click event!", "点击", 0);
        HDC hdc;
        hdc = GetDC(hwnd);//获取设备上下文句柄,用来输出文字
        //在x=0,y=50(像素)的地方输出文字
        TextOut(hdc, 0, 50, "响应WM_LBUTTONDONW消息!",
            strlen("响应WM_LBUTTONDONW消息!"));
        ReleaseDC(hwnd, hdc);//在使用完DC后一定要注意释放
        break;
    case WM_PAINT://窗口重给时报消息响应
        HDC hDc;
        PAINTSTRUCT ps;
        hDc = BeginPaint(hwnd, &ps);
        TextOut(hDc, 0, 0, "这是一个Paint事件!", strlen("这是一个Paint事件!"));
        EndPaint(hwnd, &ps);
        break;
    case WM_CLOSE://关闭消息
        if (IDYES == MessageBox(hwnd, "确定要关闭当前窗口?", "提示", MB_YESNO))
        {
            DestroyWindow(hwnd);//销毁窗口
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);//在响应消息后,投递一个退出的消息使用程序安全退出
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);//调用缺省的消息处理过程函数
    }
    return 0;
}
View Code

   备注:代码使用Visual Studio 2013编写,如遇到cannot convert from ‘const char [7]‘ to ‘LPCWSTR‘的错误,请对工程进行字符设置

菜单栏-<project-<xxx properties-<Configuration Properties-<General-<Character Set,改成“not set”或改成“Use Multi-Byte Character Set”。

 

以上是关于VC++深入详解 孙鑫 第一章 Windows程序内部运行机制的主要内容,如果未能解决你的问题,请参考以下文章

MFC入门书籍

要充分利用"VC++深入详解"书上的例子

孙鑫 VC++从入门到精通 视频教程flash 下载

计算机书藉推荐

CreateThread()方法创建线程时出错

读《VC++深入了解》前5章小结