lesson1:Windows程序运行原理及程序编写流程(vc++深入详解)

本文主要是介绍lesson1:Windows程序运行原理及程序编写流程(vc++深入详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  前言:窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系。

  1. Windows API与Win32 SDK
    操作系统提供了各种方便开发Windows应用程序的编程接口,所的函数都在Windows.h头文件中声明。Win32 SDK(Software Development Kit): 即Windows 32位平台下的软件开发包,包括API函数,帮助文档,微软提供的一些辅助开发工具。

  2. 窗口与句柄
    窗口是是屏幕上一块矩形区域,是Windows应用程序与用户进行交互的接口。在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的,要对某个窗口进行操作,首先就要得到这个窗口的句柄。其它各种资源(窗口,图标,光标等),系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄。eg: 光标句柄(HCURSOR),图标句柄(HICON)等等。

  3. 消息与消息队列
    Windows程序设计是一种基于消息的事件驱动方式的程序设计模式。消息,在Windows中由结构体MSG来表示。MSG语法参见MSDN。

typedef struct tagMSG {
HWND hwnd; //消息所属的窗口句柄
UINT message; //消息本身标识符
WPARAM wParam; //指定有关消息的附加信息
LPARAM lParam;
DWORD time; //指定消息发布的时间
POINT pt; //消息发布时的位置
} MSG;

消息队列:每当一个Windows应用程序创建后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序一的窗口的消息,消息产生后被投递到消息队列中,应用程序通过一个消息循环不断的消息队列中取出消息进行响应。响应过程由系统向应用程序发送消息,实际就是调用应用程序的消息处理函数。

创建一个完整的Win32程序,该程序实现创建一个窗口,其中主要步骤为:

  • WinMain函数的定义
  • 创建一个窗口,创建一个完整的窗口的四个步骤:1设计窗口类,2注册窗口类,3创建窗口,4显示窗口
  • 进行消息循环
  • 编写窗口过程函数

相关代码:

/************************************************************************
Author: wuc
Mail: wuc201609@163.com
Time: 13:24:19/2017-9-7
Name: WinMain
Function: 简单窗口的实现
Version:                                                           
************************************************************************/
#include <Windows.h>
#include <stdio.h>LRESULT CALLBACK WindowProc(                                     HWND hwnd,     //窗口句柄UINT uMsg,     WPARAM wParam,LPARAM lParam);int WINAPI WinMain(                                           //WinMain函数是基于Windows应用程序的入口函数HINSTANCE hInstance,                         //语法:HINSTANCE hPrevInstance,                     //int WINAPI WinMain(         LPSTR IpCmdLine,                             //HINSTANCE hInstance,  当前实例的句柄int nCmdShow                                 //HINSTANCE hPrevInstance,  )                                            //LPSTR lpCmdLine,//int nCmdShow//);{   //设计一个窗口类WNDCLASS wndcls;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);  //(HBRUSH)强制转换类型wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);  //加载鼠标类型wndcls.hIcon=LoadIcon(NULL,IDI_WINLOGO);    //设计文本图标wndcls.hInstance=hInstance;       //实例句柄赋值为程序启动系统分配的句柄值wndcls.lpfnWndProc=WindowProc;    //消息响应函数wndcls.lpszClassName=L"Weixin2008";   //窗口类的名字wndcls.lpszMenuName=NULL;             //菜单栏,默认为空wndcls.style=CS_HREDRAW | CS_VREDRAW; //定义水平和垂直重画RegisterClass(&wndcls);               //注册窗口类HWND hwnd;     //保存创建窗口后的生成窗口句柄用于显示hwnd=CreateWindow(L"Weixin2008",L"这是第一课",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOWNORMAL);      //显示窗口UpdateWindow(hwnd);                  //更新窗口//消息循环MSG msg;                             //消息结构体while (GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0;}LRESULT CALLBACK WindowProc(           //发送信息HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{switch (uMsg)           //设计窗口{case WM_CHAR:           //字符按键消息char szChar[20];sprintf(szChar,"char is %d",wParam);MessageBox(hwnd,LPCWSTR(szChar),L"weixin",0);break;case WM_LBUTTONDOWN:    //鼠标左键按键信息MessageBox(hwnd,L"mouse clicked",L"weixin",0);HDC hdc;hdc=GetDC(hwnd);    //获取设备上下文句柄,用来输出文字TextOut(hdc,0,50,L"计算机编程",strlen("计算机编程"));ReleaseDC(hwnd,hdc);   //使用完后DC的释放break;case WM_PAINT:             //消息重给时的消息响应HDC hDc;PAINTSTRUCT ps;hDc=BeginPaint(hwnd,&ps);TextOut(hDc,0,0,L"Windows编程",strlen("Windows编程"));EndPaint(hwnd,&ps);break;case WM_CLOSE:if(IDYES==MessageBox(hwnd,L"是否真的结束?",L"weixin",MB_YESNO)){DestroyWindow(hwnd);}case WM_DESTROY:PostQuitMessage(0); //在响应消息后,投递一个退出的消息使用程序安全退出break;default:return DefWindowProc(hwnd,uMsg,wParam,lParam);  //调用缺省的消息处理过程函数}return 0;
}

小结:
关于句柄
句柄(handle),资源的标识。
操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(hicon),光标句柄(hcursor),窗口句柄(hwnd),应用程序实例句柄(hinstance)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。

WinMain函数 系统入口函数

强制性转换—>编译时不会报错,运行时会报错

BeginPaint EndPaint释放只能在WM_PAINT中使用;
GetDC之后需要释放ReleaseDC;
if(1 == x)将常量写在前面,便于理解;
消息循环时default语句必不可少;

这篇关于lesson1:Windows程序运行原理及程序编写流程(vc++深入详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/541502

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF