首页 > 系统相关 >windows编程模型

windows编程模型

时间:2024-04-05 14:05:04浏览次数:26  
标签:wc 函数 windows 句柄 模型 编程 hInstance 窗口 NULL

WinMain函数的定义

int WINAPI WinMain(

HINSTANCE hInstance, //应用程序实例

HINSTANCE hPrevInstance, //上一个应用程序实例

LPSTR lpCmdLine, //命令行参数

int nShowCmd); //窗口显示的样式

 

  1. WINAPI:是一个宏,它代表的是__stdcall(注意是两个下划线),表示的是参数传递的顺序:从右往左入栈,同时在函数返回前自动清空堆栈。
  2. hInstance:表示该程序当前运行的实例的句柄,这是一个数值。当程序在Windows下运行时,它唯一标识运行中的实例(注意,只有运行中的程序实例, 才有实例句柄)。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个句柄值,并通过hInstance参数传递给 WinMain 函数。
  3. hPrevInstance:表示当前实例的前一个实例的句柄。在Win32环境下,这个参数总是NULL,即在Win32环境下,这个参数不再起作用。
  4. lpCmdLine:是一个以空终止的字符串, 指定传递给应用程序的命令行参数,相当于C或C++中的main函数中的参数char *argv[]。
  5. nShowCmd:表示一个窗口的显示,表示它是要最大化显示、最小化显示、正常大小显示还是隐藏显示。

 

3) 创建一个窗口

创建一个完整的窗口,需要经过下面几个步骤:

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

一个完整的窗口具有许多特征, 包括光标(鼠标进入该窗口时的形状)、图标、背景色等。窗口的创建过程类似于汽车的制造过程。

 

我们在生产一个型号的汽车之前, 首先要对该型号的汽车进行设计, 在图纸上画出汽车的结构图, 设计各个零部件, 同时还要给该型号的汽车取一个响亮的名字, 例如“宝马 x6”。

类似地, 在创建一个窗口前, 也必须对该类型的窗口进行设计, 指定窗口的特征。在Windows中,窗口的特征就是由WNDCLASS结构体来定义的,我们只需给WNDCLASS结构体对应的成员赋值,即可完成窗口类的设计。

 

WNDCLASS结构体的定义如下:

typedef struct _WNDCLASS{

UINT        style;

WNDPROC     lpfnWndProc;

int         cbClsExtra;

int         cbWndExtra;

HINSTANCE   hInstance;

HICON       hIcon;

HCURSOR     hCursor;

HBRUSH      hbrBackground;

LPCWSTR     lpszMenuName;

LPCWSTR     lpszClassName;

} WNDCLASS;

 

  • style:指定窗口的样式(风格),常用的样式如下:

类型

含义

CS_HREDRAW

当窗口水平方向上的宽度发生变化时, 将重新绘制整个窗口。 当窗口发生重绘时, 窗口中的文字和图形将被擦除。如果没有指定这一样式,那么在水平方向上调整窗口宽度时,将不会重绘窗口。

CS_VREDRAW

当窗口垂直方向上的高度发生变化时,将重新绘制整个窗口。如果没有指定这一样式,那么在垂直方向上调整窗口高度时,将不会重绘窗口。

CS_NOCLOSE

禁用系统菜单的 Close 命令,这将导致窗口没有关闭按钮。

CS_DBLCLKS

当用户在窗口中双击鼠标时,向窗口过程发送鼠标双击消息。

 

  • lpfnWndProc:指定一个窗口回调函数,是一个函数的指针。

 

当应用程序收到给某一窗口的消息时,就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统调用的是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。

 

回调函数的定义形式如下:

LRESULT CALLBACK WindowProc(

HWND hWnd, //信息所属的窗口句柄

UINT uMsg, //消息类型

WPARAM wParam, //附加信息(如键盘哪个键按下)

LPARAM lParam //附加信息(如鼠标点击坐标)

);

 

  1. cbClsExtra:类的附加内存,通常数情况下为0。
  2. cbWndExtra:窗口附加内存,通常情况下为0。
  3. hInstance:当前实例句柄,用WinMain中的形参hInstance为其赋值。
  4. hIcon:指定窗口类的图标句柄,设置为NULL,则使用默认图标,也可用如下函数进行赋值:

HICON LoadIcon(HINSTANCE hInstance, LPCTSTR lpIconName);

如:LoadIcon(NULL, IDI_WARNING); //第一个参数为NULL,加载系统默认图标

 

  • hCursor:指定窗口类的光标句柄,设置为NULL,则使用默认图标,也可用如下函数进行赋值:

HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName);

如:LoadCursor(NULL, IDC_HELP); //第一个参数为NULL,加载系统默认光标

 

  • hbrBackground:指示窗口的背景颜色,可用如下函数进行赋值:

HGDIOBJ GetStockObject(int fnObject);

如:GetStockObject(WHITE_BRUSH);

 

  1. lpszMenuName:指定菜单资源的名字。如果设置为NULL,那么基于这个窗口类创建的窗口将没有默认菜单。
  2. lpszClassName:指定窗口类的名字。

 

示例代码如下:

WNDCLASS wc; //窗口类变量

wc.cbClsExtra = 0; //类附加内存

wc.cbWndExtra = 0; //窗口附加内存

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景色为白色

wc.hCursor = (HCURSOR)LoadCursor(NULL, IDC_HELP); //帮助光标

wc.hIcon = (HICON)LoadIcon(NULL, IDI_WARNING); //警告图标

wc.hInstance = hInstance; //应用程序实例,为WinMain第1个形参

wc.lpfnWndProc = WinProc; //窗口过程函数名字

wc.lpszClassName = TEXT("MyWin"); //类的名字

wc.lpszMenuName = NULL; //没有菜单

wc.style = 0; //类的风格,填0,使用默认风格

 

  • 注册窗口类

设计完窗口类(WNDCLASS)后, 需要调用RegisterClass函数对其进行注册,注册成功后,才可以创建该类型的窗口。

注册函数的原型声明如下:

ATOM RegisterClass(CONST WNDCLASS *lpWndClass);

 

使用示例:RegisterClass(&wc);

 

  • 创建窗口

设计好窗口类并且将其成功注册之后, 即可用CreateWindow函数产生这种类型的窗口了。

 

CreateWindow函数的原型声明如下:

HWND CreateWindow(

LPCTSTR lpClassName,

LPCTSTR lpWindowName,

DWORD dwStyle,

int x,

int y,

int nWidth,

int nHeight,

HWND hWndParent,

HMENU hMenu,

HINSTANCE hInstance,

LPVOID lpParam);

 

参数说明:

  1. lpClassName:指定窗口类的名称,此名字必须和WNDCLASS的lpszClassName成员指定的名称一样。
  2. lpWindowName:指定窗口的名字,即窗口的标题。
  3. dwStyle:指定创建的窗口的样式,常指定为指WS_OVERLAPPEDWINDOW类型,这是一种多种窗口类型的组合类型。
  4. x, y:指定窗口左上角的x,y坐标。如果参数x被设为CW_USEDEFAULT,那么系统为窗口选择默认的左上角坐标并忽略y参数。
  5. nWidthnHeight:指定窗口窗口的宽度,高度。如果参数nWidth被设为 CW_USEDEFAULT,那么系统为窗口选择默认的宽度和高度,参数nHeight被忽略。
  6. hWndParent:指定被创建窗口的父窗口句柄,没有父窗口,则设置NULL。
  7. hMenu:指定窗口菜单的句柄,没有,则设置为NULL。
  8. hInstance:窗口所属的应用程序实例的句柄,用WinMain中的形参hInstance为其赋值。
  9. lpParam:作为WM_CREATE消息的附加参数lParam传入的数据指针。通常设置为NULL。

 

返回值说明:如果窗口创建成功,CreateWindow函数将返回系统为该窗口分配的句柄,否则,返回NULL。

 

示例代码:

HWND  hWnd = CreateWindow(

TEXT("MyWin"),  //窗口类名字

TEXT("测试"),      //窗口标题

WS_OVERLAPPEDWINDOW,  //窗口风格

CW_USEDEFAULT, CW_USEDEFAULT,  //窗口x,y坐标,使用默认值

CW_USEDEFAULT, CW_USEDEFAULT,  //窗口宽度,高度,使用默认值

NULL,   //无父窗口

NULL, //无菜单

hInstance, //应用程序实例句柄,为WinMain第1个形参

NULL); //附件信息,通常设置为NULL

 

  • 显示及更新窗口

显示窗口函数原型:

BOOL ShowWindow(HWND hWnd, int nCmdShow);

 

更新窗口函数原型:

BOOL UpdateWindow(HWND hWnd);

 

示例代码:

ShowWindow(hWnd, SW_SHOWNORMAL); //SW_SHOWNORMAL为普通模式

UpdateWindow(hWnd);

 

  • 示例代码

//设计一个窗口类

WNDCLASS wc; //窗口类变量

wc.cbClsExtra = 0; //类附加内存

wc.cbWndExtra = 0; //窗口附加内存

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景色为白色

 

wc.hCursor = LoadCursor(NULL, IDC_HELP); //帮助光标

wc.hIcon = LoadIcon(NULL, IDI_WARNING); //警告图标

wc.hInstance = hInstance; //应用程序实例,为WinMain第1个形参

wc.lpfnWndProc = WinProc; //窗口过程函数名字

wc.lpszClassName = TEXT("MyWin"); //类的名字

wc.lpszMenuName = NULL; //没有菜单

wc.style = 0; //类的风格,填0,使用默认风格

 

//注册窗口类

RegisterClass(&wc);

 

//创建窗口

HWND  hWnd = CreateWindow(TEXT("MyWin"), TEXT("测试"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

 

//显示及更新窗口

ShowWindow(hWnd, SW_SHOWNORMAL);

UpdateWindow(hWnd);

 

 

标签:wc,函数,windows,句柄,模型,编程,hInstance,窗口,NULL
From: https://blog.csdn.net/ffffffeiyu/article/details/137345358

相关文章

  • AI智能写作:巧用AI大模型让新媒体变现插上翅膀【文末送书】
    文章目录一、AI智能写作的崛起二、AI智能写作与新媒体变现AI智能写作的挑战与应对策略AI智能写作:巧用AI大模型让新媒体变现插上翅膀【文末送书】近年来,人工智能(AI)技术的发展日新月异,逐渐渗透到了各行各业,其中包括新媒体领域。AI智能写作作为人工智能技术的一项重要应......
  • Transformer模型-Multi-Head Attention多头注意力的简明介绍
    今天介绍transformer模型的Multi-HeadAttention多头注意力。原论文计算scaleddot-productattention和multi-headattention实际整合到一起的流程为:通过之前文章,假定我们已经理解了attention;今天我们按顺序来梳理一下整合之后的顺序。重新梳理AttentionIsAllYou......
  • 大语言模型LLM《提示词工程指南》学习笔记01
    文章目录大语言模型LLM《提示词工程指南》学习笔记01以下是使用不同LLM提供程序时会遇到的常见设置:标准提示词应该遵循以下格式:提示词要素大语言模型LLM《提示词工程指南》学习笔记01提示工程(PromptEngineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语......
  • FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
    ​FFmpeg内置了aac音频格式,在《FFmpeg开发实战:从零基础到短视频上线》一书的“5.2.2 Linux环境集成mp3lame”又介绍了如何给FFmpeg集成mp3格式,常见的音频文件除了这两种之外,还有ogg和amr两种格式也较常用。其中ogg格式的编解码依赖于libogg和libvorbis,而amr格式的编解码依赖于op......
  • Windows 11 RDP 设置自定义证书
    1.随便生成一个证书或者去freessl之类的地方申请一个证书2.将证书转换成pfx格式opensslpkcs12-export-inkeyprivate_key.key-incertificate.pem-certfileCACert.pem-outcertificate.pfx3.打开certlm右键个人->所有任务->导入,导入刚刚创建的pfx证书......
  • 【C++风云录】音频编程艺术:掌握VST、JUCE、JACK和PortAudio的技巧
    声音之旅:音频开发者指南前言音频处理是现代软件开发中不可或缺的一部分,无论是音乐制作软件、游戏开发还是通信应用都需要对音频数据进行处理。本文将介绍几种常用的音频处理库和框架,帮助开发者更好地理解和应用于实际项目中。欢迎订阅专栏:C++风云录文章目录声音之......
  • AI大模型与网球运动结合的应用场景及案例分析
            AI大模型与网球运动结合的未来前景是广阔的,它不仅能够提升运动员的训练和比赛表现,还能改善教练的策略制定、增强观众的观赛体验以及优化网球赛事的管理。以下是几个具体的应用场景:1.运动员技能和表现分析        AI大模型可以通过分析高速摄像头捕......
  • Windows窗体应用保存操作日志
    应用界面按下“button1”按钮,保存操作日志到数据库日志类usingMySqlConnector;usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceLog2{publicclassMyL......
  • 网络编程-----DOS(拒绝式服务)攻击
         什么是DOS攻击 ?        DOS:即Denial Of Service,拒绝服务的缩写,拒绝服务,DOS攻击即攻击者想办法让目标机器停止提供服务或资源访问,这些资源包括磁盘空间、内存、进程甚至网络带宽,从而阻止正常用户的访问。    对服务器实施拒绝式攻击的主要......
  • idea开发 java web 配电室后台管理系统bootstrap框架web结构java编程计算机网页
    一、源码特点 java配电室后台管理系统是一套完善的完整信息系统,结合javaweb开发和bootstrapUI框架完成本系统,对理解JSPjava编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。前段主要技术cssjquery bootstrapUI框架后端主要技术javaj......