API入门系列之六 -自己实现MessageBox

Winform自定义MessageBox 在使用Winform的MessageBox作为消息提示时,会有一些不方便的地方。如,MessageBox消息框弹出之后,如果不关闭就会阻塞函数的继续执行;不能自动关闭等。因此,子丰就自己仿照MessageBox的样式写了一个InformationBox提示框,可以实现自动关闭、永远显示在所有窗口的最上方等。首先,贴出几张图片展示一下InformationBox的效果;然后,具体介绍Informat 阅读详情

原创文章,转载请注明作者和出处

 

http://blog.youkuaiyun.com/beyondcode

SDK编程群号:81543028 欢迎加入

 

API入门系列文章的第六篇之自己动手实现MessageBox。

我在第四篇文章:一个相当简单的SDK程序 中讲到了通过调用MessageBoxAPI函数来弹出一个对话框,那你有没有想过,我们一句简单的代码背后所隐藏的细节是怎么的呢,那时候让你了解这些未免还早了些,不过现在时机到了,通过一些基本的API函数调用来实现一个自己的对话框其实也不是很难,那么这一篇文章就是这个目的。并顺带介绍一些基本API的应用,由于前面五篇文章的铺垫,我相信你对SDK的程序的大致结构和相关字符处理都有所了解了,所以在这篇文章中的这些知识点,我就不再多说,以免有些人觉得我实在太过啰嗦。实在疑惑的,可以参看前面的文章。

首先我先大概的列出我们为完成这个任务所要用到的一些API函数他

SetWindowText    设置窗口的标题

GetClientRect 得到窗口客户区的大小信息

GetWindowLongPtr 通过窗口句柄得到和窗口的相关联信息

CreateWindowEx 创建窗口

BeginPaint 得到窗口的设备句柄

EndPaint 释放窗口的设备句柄

DrawText 通过设备句柄在窗口上画出文字

好了,就这些函数,我们就能自己实现有一个确定按钮并在确定按钮正上方显示提示信息的简易的对话框了,不过这个对话框可是我们一句一句代码自己实现的哟~~还是比较有成就感吧~

程序的大体框架呢还是我们上一篇文章中的框架,注册窗口类,创建一个主窗口,消息循环,窗口消息处理函数。不过要我们需要在窗口消息处理函数中添加一些代码来完成我们需要的功能。在什么地方添加呢?  上个程序,我们只处理WM_DESTROY这个消息。对于这个消息我不再做讲解,不懂的或者忘记了的可以自己MSDN或者看上一篇文章,这里我们要添加对两个消息的处理代码,首先是WM_CREATE,这个消息会在一个窗口被创建的时候被发送到窗口消息处理函数,如果一些事情需要在一个窗口刚被创建的时候执行,那么通过处理WM_CREATE最合适不过啦,代码如下:

case WM_CREATE:

{

RECT rctClient; //用来存放主窗口客户区大小信息

const int buttonWidth = 80; //按钮的宽

const int buttonHeight = 25; /按钮的高

GetClientRect( hwnd, &rctClient ); //得到主窗口客户区的大小信息

HINSTANCE hInst = (HINSTANCE)GetWindowLongPtr( hwnd, GWLP_HINSTANCE );

HWND hButton = CreateWindowEx( 0L, _T("button"), _T("确定"), WS_VISIBLE |  WS_CHILD , rctClient.right/2-buttonWidth/2, rctClient.bottom/2-buttonHeight/2, buttonWidth,  buttonHeight, hwnd, (HMENU)2, hInst, NULL );

SetWindowText( hwnd, _T("自定义对话框") );

break;

}

在WM_CREATE消息的处理中,我们就用到了GetClientRect,它的第一个参数是窗口的句柄,你想要获取哪个窗口的客户区大小,你就将传递哪个窗口的句柄,第二个参数是一个RECT结构的指针,我上面定义了一个rctClient变量,然后这里把这个变量的地址传递给GetClientRect的第二个参数,让它将所得到的窗口的大小信息保存到这个变量里面。这个函数的具体用法,读者朋友们还可以自己参考MSDN,如果函数调用成功,那么rctClient这个结构体变量中就存放了这个窗口的大小信息了。

然后,我定义了两个整形常量buttonWidth, buttonHeight用来保存我们需要创建的按钮的宽和高。

再然后我调用GetWindowLongPtr这个函数获取和窗口有关的信息,这里获取的是窗口所属的应用程序实例的句柄,也就是WinMain函数所传递进来的第一个参数。在得到这些需要的信息之后,我们就开始着手子窗体的创建了,这里我们要创建的是一个按钮,按钮也是一个窗体,所以也需要窗口类,我们并没有写按钮的窗口类进行注册,那么这个窗口类由谁来注册呢? 其实是有系统创建并注册了按钮的窗口类,窗口类的名字是button,所以我们这里只管用这个窗口类来创建窗口就是了,我们创建主窗口是用的WS_OVERLAPPEDWINDOW这个窗口样式,如果是创建一个子窗口,那么我们需要指定WS_CHILD ,如果我们需要创建的窗口能显示出来,那么需要指定WS_VISIBLE这个窗口样式,并且还需要指定创建的窗口所属的父窗口的句柄,如上代码所示。其中第五个参数到第八个参数是该按钮的坐标位置和宽度高度的信息,因为我们需要将该按钮创建在主窗口的中央,所以有一系列的计算,具体是怎么计算的,就请各位自己仔细根据上面的代码进行思考了,如果还是有些疑惑,请与我讨论或者加入SDK编程(81543028)群进行讨论交流。

创建完了按钮子窗口,我们还需要将我们的主窗口的标题设置为我们想要的,可以通过SetWindowText这个API函数来完成,第一个参数就是要设置的窗口的句柄,这里为主窗口,所以是我们窗口消息处理函数传递进来的第一个参数hwnd, 第二个参数就是一个字符串指针,指向一个以零结尾的字符串。这里我们就直接将一个字符串常量的首地址传递给它。就完成了主窗口的标题设置。

经过上面这些步骤,我们已经在主窗体的中央显示了一个按钮了,并且把主窗口的标题设置为我们自己需要的,但是还要一个问题需要解决,那就是在按钮的正上方显示一串提示文本,怎么来完成呢,这就是我们下面要讲的。

要在主窗口的按钮的正上方显示提示文本信息,就需要得到主窗口的设备句柄,然后通过该设备句柄调用GDI函数DrawText来完成。由于该提示文本需要在每次窗口进行更新的时候绘出,所以我们需要处理WM_PAINT消息来达到这个目的。下面还是先看代码:

case WM_PAINT:

{

const int buttonWidth = 80;

const int buttonHeight = 25;

const int textHeight = 25;

PAINTSTRUCT ps;

HDC hdc = BeginPaint( hwnd, &ps );

RECT rctClient,rctText;

GetClientRect( hwnd, &rctClient );

rctText.left = rctClient.left;

rctText.right = rctClient.right;

rctText.top = rctClient.bottom/2 - buttonHeight -textHeight;

rctText.bottom = rctClient.bottom/2 - buttonHeight;

DrawText( hdc, _T("Beyondcode"), _tcslen( _T("Beyondcode")), &rctText, DT_CENTER  | DT_SINGLELINE | DT_VCENTER );

EndPaint( hwnd, &ps );

break;

}

首先定义了三个整形常量 buttonWidth,buttonHeight指示刚才创建的按钮的大小,textHeight指示要显示在文本的矩形框的高度,矩形框的宽度和主窗口的宽度一直,所以就没定义了,然后PAINTSTRUCT 是BeginPaint和EndPaint这两个函数会用到的一个结构体类型,用它定义了一个结构体变量ps,并在调用BeginPaint和EndPaint的时候将它的地址传递给他们的第二个参数。获取一些相关和绘图有关的信息。不过我们这里不会用到,所以就不做详细解释,可以查看MSDN。

注意,BeginPatin这个函数会返回一个设备句柄,然后我们就可以通过这个设备句柄进行绘图,显示文字也是一种绘图,在绘图完毕后,我们需要调用EndPaint这个函数释放刚才得到的哪个设备句柄,也就是是刚才哪个设备句柄无效。而所有的绘图操作,都必须在BeginPaint和EndPatin这两个函数之间完成。如上面,通过参数hdc调用DrawText这个函数,因为获取的hdc是通过hwnd这个窗口句柄的,所以这里所有的绘图都会显示在hwnd这个句柄所代表的窗口上,也就是主窗口。rctText是显示文本的矩形的信息,它的大小和位置是通过按钮的大小和当前主窗口的大小信息计算出来的,具体的计算代码中已经写的很清楚了,如有疑惑的可以和我交流交流。 然后还要说的一个就是DT_CENTER 和DT_VCENTER这两个标志表示在刚才那个矩形框中的水平中央和垂直中央显示我们的文本,DT_SINGLELINE就是指示单行显示。

最后留给大家一个问题,以供大家思考,上面的程序中,当你改变窗口的大小的时候,就会出现问题,按钮就不会再位于主窗口的中央了,怎么解决呢? 我提示一下吧,处理WM_SIZE这个消息。好了,留下这个任务给大家,试试吧~~让按钮随时随地位于主窗口的中央。

更详细的注释的完整源代码我会上传群空间供各位下载。

Ok,这章就到这里,由于这些天有些忙,没来得及及时更新,所以多多抱歉了。SDK编程群(81543028)欢迎各位的加入。

MessageBox使用 MessageBox()函数,功能是弹出一个标准的Windows对话框(模态对话框)。包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息。返回值是一个int型的整数,用于判断用户点击了对话框中的哪一个按钮。它不是C函数库的标准函数,而是API函数,但是可以用C语言调用API函数。包含在头文件 windows.h中。 阅读详情

相关推荐

C++实现API Hook拦截MessageBox窗口系统项目

MFC的消息机制是Windows事件驱动模型的抽象体现,通过消息队列、消息循环以及消息映射三大核心组件构建起整个框架的响应体系。理解这一机制是实现MFC消息拦截与处理的前提。消息过滤是指根据预设规则判断是否允许某条消息继续传递。可以通过在钩子回调或窗口过程中添加判断逻辑实现。// 自定义过滤规则// 屏蔽鼠标移动消息return 1;// 返回非零值表示已处理,消息不再传递过滤规则逻辑说明:若返回值为非零,则系统认为消息已被处理,不再传递给窗口过程。

weixin_42462474的博客 933

C# MessageBox最全的详解

MessageBox详解,关于如何使用,以及所有功能

weixin_a18297652723的博客 4万+

【AI概念】迁移学习 vs. 域自适应 vs. 域泛化|定义、核心原理、数学表达、易混淆点与工程选择建议|实际案例、工程实现细节、未来研究趋势、实际应用场景

大家好,我是爱酱。本篇将会详细梳理迁移学习(Transfer Learning)、域自适应(Domain Adaptation)、域泛化(Domain Generalization)三大常被混淆的核心概念,结合数学公式、典型算法与实际应用场景,帮助你厘清它们的本质区别、联系与工程意义。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

AI人工智能爱酱~你的AI学习好帮手~ 2471

C#MessageBox(消息提示框)使用详解

MessageBox的作用MessageBox用来显示消息和用户交互,利用它的Show()方法快速产生消息对话框,便捷好用。一般用法有两种,一是单纯地显示一段消息,二是除了显示消息,还要根据所点按钮进行下一步操作。MessageBox.Show()方法一个MessageBox最多由四个部分组成,如图。因而,它的Show()方法的重载最多有四个参数,分别是内容(text)、标题(caption)、按钮(buttons)、图标(icon)。

lucgh的博客 2万+

移动端抓包实战指南:从HTTPS解密到QUIC协议与证书绑定破解

HTTPS作为保障网络通信安全的核心协议,其工作原理基于TLS/SSL加密与证书信任链验证。在移动应用开发与测试中,抓包是调试接口、分析性能、排查问题的关键技术手段。然而,随着移动端安全性的提升,传统的代理抓包方法常因证书绑定、HTTP/3/QUIC协议等挑战而失效。这要求开发者掌握分层诊断思维,协同使用代理工具、协议分析工具及底层流量捕获工具。例如,面对证书绑定导致的流量不可见,需借助Wireshark进行协议层分析;针对基于UDP的QUIC协议,则需使用支持该协议的抓包工具或临时禁用特性。本文聚焦移动端

weixin_27722377的博客 298

华为防火墙NAT避坑指南:当双ISP出口遇到服务器发布,这些细节不注意会翻车

本文深入解析华为防火墙在双ISP出口环境下服务器发布的实战配置,重点探讨no-reverse参数对Server-Map表的影响、源进源出功能的实现及线路切换时的会话保持问题。通过策略路由和智能选路技术,确保HTTP/FTP服务在多运营商链路中的高可用性,避免路径不对称和NAT映射冲突等常见陷阱。

weixin_30897233的博客 550

分享一个WinForm里面自定义的MessageBox

简单测试了一下,觉得还是比MS自带的要好一点,新建一个项目,添加一个MyMsgBox的窗体,该窗体里面的代码如下: 完整的Demo:MessageBox Demo using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Drawing....

weixin_34224941的博客 863

数模【Mathematica(安装、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例)】

Mathematica(安装and激活、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例) Mathematica_11.3.0 安装教程 Mathematica11.3 激活 P1 笔记本 P2 入门方法 P3 基本计算 P4 基本图形 P5 创建互动模型 P6 利用数据 P7 演示 P8 完整实例

upward 12万+

Windows API入门系列之六 -自己实现MessageBox

我在第四篇文章:一个相当简单的SDK程序 中讲到了通过调用MessageBoxAPI函数来弹出一个对话框,那你有没有想过,我们一句简单的代码背后所隐藏的细节是怎么的呢,那时候让你了解这些未免还早了些,不过现在时机到了,通过一些基本的API函数调用来实现一个自己的对话框其实也不是很难,那么这一篇文章就是这个目的。并顺带介绍一些基本API的应用,由于前面五篇文章的铺垫,我相信你对SDK的程序的大致结构

Qsir的专栏 929

AI驱动Spine骨骼动画生成:从图像拆分到动画自动化的全流程解析

计算机视觉与生成式AI技术正深度赋能传统数字内容生产流程。在2D动画制作领域,骨骼动画技术通过模拟真实生物关节运动,实现了角色动画的高效制作与灵活控制。其核心原理在于将角色拆分为独立部件,通过骨骼层级关系驱动部件变换,结合关键帧插值算法生成流畅动作。这项技术的工程价值在于大幅降低动画制作门槛,提升内容生产效率,尤其适用于游戏开发、影视预演、广告设计等需要快速原型迭代的场景。本文聚焦于如何利用SIFT特征匹配、RANSAC几何验证等CV算法实现部件自动对位,并结合动画12原则的程序化实现,构建从单张角色立绘到

weixin_28696185的博客 1525

锂电池SOC估计 | 基于LSTM长短期记忆神经网络的锂电池SOC估计(附matlab完整代码)

锂电池SOC估计 | 基于LSTM长短期记忆神经网络的锂电池SOC估计(附matlab完整代码)

前程算法屋的博客 1024

API入门系列之六 -自己实现MessageBox -转载

http://blog.csdn.net/beyondcode API入门系列文章的第六篇之自己动手实现MessageBox。 我在第四篇文章:一个相当简单的SDK程序中讲到了通过调用MessageBoxAPI函数来弹出一个对话框,那你有没有想过,我们一句简单的代码背后所隐藏的细节是怎么的呢,那时候让你了解这些未免还早了些,不过现在时机到了,通过一些基本的API函数调用来实现一...

weixin_30507481的博客 100

Android软键盘系统深度解析:架构、原理与实现

Android软键盘系统深度解析:架构与实现原理 本文系统剖析了Android软键盘的核心工作机制。作为系统级输入服务,软键盘具有双重属性:既是可安装的独立应用,又深度集成于系统框架中。文章详细解读了软键盘的系统架构,包括其与InputMethodManagerService(IMMS)和WindowManagerService(WMS)的交互机制,以及通过InputConnection实现的跨进程通信流程。同时分析了输入法窗口的特殊管理策略、布局调整模式,并深入探讨了输入预测引擎的实现原理,包括词典加载、

保持专注,保持热爱 115

API入门系列之七 -完善MessageBox

原创文章,转载请注明作者和出处 http://www.cnblogs.com/beyond-codeSDK编程群号:81543028 欢迎加入各位不好意思,前几天有些事很忙,昨天才稍稍有时间空闲下来,所以我将我的API入门系列文章继续下去,上一篇《自己实现MessageBox》中我们基本已经实现了一个对话框了,可以在中央显示自己的文字,并且显示一个确定按钮,可是,上一篇完的

BEYONDCODE's 流水账 5829

视觉-语言模型:BLIP与Flamingo如何理解图文?

视觉-语言模型:BLIP与Flamingo如何理解图文? ,人工智能,计算机视觉,大模型,AI,在当今人工智能飞速发展的时代,视觉 - 语言模型作为多模态领域的关键技术,正逐渐改变着我们与数字世界交互的方式。它们致力于打破图像与文本之间的模态壁垒,使计算机能够像人类一样,综合理解和处理视觉与语言信息。其中,BLIP 和 Flamingo 两款模型脱颖而出,以独特的架构和创新的训练方法,在图像描述生成、视觉问答、图文检索等任务中展现出卓越的性能。本文将深入剖析 BLIP 与 Flamingo 模型的工作原理。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MessageBox函数

简述   MessageBox()函数,它的功能是弹出一个标准的Windows对话框。返回值是一个int型的整数,用于判断用户点击了对话框中的哪一个按钮。它不是C函数库的标准函数,而是API函数,但是可以用C语言调用API函数。 函数原型 包含在头文件 windows.h中 int MessageBox( HWND hWnd,LPCTSTR lpText, LPCTSTR lpCaption = ...

dark_cy的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【一】Windows API 零门槛编程指南——MessageBox 基本使用及基础讲解

本篇作为Windows API 系列文章的第一篇,将简要的讲解一下什么是Windows API,Windows API能做些什么,并且尽可能讲解一些新出现的专有名词;本系列博文几乎没有难啃的“专业术语”,尽量让读者能够看明白文章所述内容,是本系列博文的核心宗旨之一。 读本系列博文的读者必须具备以下的只是储备: C/C++语言基础语法及了解面向对象概念 以上列出的这一个点是最核心的知识储备,因为...

1_bit 的博客 3988

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Windows API 之 MessageBox函数

转载在:https://blog.csdn.net/ixusy88/article/details/81323188 函数原型及参数: 在WinUser.h中定义: WINUSERAPI int WINAPI MessageBoxA( _In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpC...

parasoft的专栏 1452

messagebox 全部使用_「一」Windows API 零门槛编程指南——MessageBox

本篇作为Windows API 系列文章的第一篇,将简要的讲解一下什么是Windows API,Windows API能做些什么,并且尽可能讲解一些新出现的专有名词;本系列博文几乎没有难啃的“专业术语”,尽量让读者能够看明白文章所述内容,是本系列博文的核心宗旨之一。读本系列博文的读者必须具备以下的知识储备:C/C++语言基础语法及了解面向对象概念以上列出的这一个点是最核心的知识储备,因为本系列博文...

weixin_39743357的博客 216

WinForm 下实现一个自动关闭的MessageBox

WinForm 下实现一个自动关闭的MessageBox Author: eaglet       WinForm 下我们可以调用MessageBox.Show 来显示一个消息对话框,提示用户确认等操作。在有些应用中我们需要通过程序来自动关闭这个消息对话框而不是由用户点击确认按钮来关闭。然而.Net framework 没有为我们提供自动关闭MessageBox 的方法,要实现这个

宜臶瑏芯的博客 2038

Windows API入门:6:自己实现MessageBox

API入门系列文章的第六篇之自己动手实现MessageBox。

Soda Wang的博客 608

MFC中MessageBox的用法

在软件中我们经常会弹出个小窗口,给一点点提示.这就会用到消息对话框. 在Win32 API程序中只有MessageBox这一种用法. 而在MFC中就有三个方法: 1.调用API中的MessageBox; 2.调用CWnd的成员函数MessageBox; 3.调用全局函数AfxMessageBox; 一、 MFC中MessageBox的用法 1、 函数原型及参数  function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integ

qq_36633275的博客 6956

Windows API 之 MessageBox

Windows API 之 MessageBox MessageBox原函数: MessageBox( HWND hWnd, //需要弹出消息框的窗口的句柄 LPCTSTR lpText, //消息框显示的信息 LPCTSTR lpCaption, //消息框的标题 UNION uType); //消息框的其它形 示例1 #include "windows.h" int main () {...

海盗的博客 1073
上一篇: API入门系列之五 -一个正儿八经的SDK程序
下一篇: API入门系列之七 -完善MessageBox
BeYoNDCoDE
博客等级 码龄18年 159粉丝 13原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值