在 Dev-C++中编译运行GUI 程序介绍(二)示例:祝福程序

在 Dev-C++中编译运行GUI 程序介绍(二)示例:祝福程序

前期见:

在 Dev-C++中编译运行GUI 程序介绍(一)基础 https://blog.csdn.net/cnds123/article/details/147019078

示例1、祝福程序

本文中的这个祝福程序是一个使用 Windows API 编写的简单 GUI 应用程序,比较简单,可在 Dev-C++中编译运行,主要用于显示中秋节的祝福语。

运行效果

【编译设置

在 Dev-C++ 中,找到 "工具" 菜单并选择 "编译选项"。

在 "编译器" 选项卡中,将以下内容添加到 "链接器" 中:

-luser32 -lgdi32

-lgdi32 -lcrypt32

运行时,是否可以不显示cmd黑窗口?

在 Dev-C++ 中隐藏命令提示符窗口条件:确保您创建的是一个 Windows GUI 应用程序,而不是控制台应用程序。在 "链接器" 部分,添加 -mwindows 参数。这个参数告诉编译器链接为 Windows 应用程序,而不是控制台应用程序。

详见签约博文。】

源码(参考自网路)如下

#include <windows.h>
#include <iostream>  //string greetings[]用 using namespace std;//一个字符串数组,包含了祝福语。  
string greetings[] = {"祝你每天如意吉祥!","祝你家庭幸福美满!","愿你合家欢乐,幸福美满,好运连连!","祝你事业顺利,万事如意,梦想成真!","祝你幸福快乐每一天!","祝你万事如意,笑容如花,事业有成,家庭美满!"
};int win_w,win_h;  //用于存储窗口的宽度和高度。HWND label,wish;  //HWND 类型的句柄,分别用于窗口中的标签和祝福文本。//该函数会从 greetings 数组中随机选择一条祝福语,并将其设置为窗口中显示的文本。 
void get_rand() {int index = rand() % (sizeof(greetings) / sizeof(greetings[0]));SetWindowText(wish, greetings[index].c_str());
}//这是 Windows 应用程序的核心功能,处理所有发送到窗口的消息 
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {switch(Message) {case WM_CREATE: {//界面元素的创建static HFONT hFont = CreateFont(40,0,0,0,0,FALSE,FALSE,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"微软雅黑");//创建字体// labellabel = CreateWindow("static", TEXT("祝福语言"), WS_CHILD | WS_VISIBLE | SS_CENTER, 0, 0, win_w, 45, hwnd,(HMENU)1,((LPCREATESTRUCT)lParam)->hInstance,NULL);SendMessage(label,WM_SETFONT,(WPARAM)hFont,TRUE);// wishstatic HFONT hFont2 = CreateFont(25,0,0,0,0,FALSE,FALSE,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"微软雅黑");//创建字体wish = CreateWindow("static", TEXT(""), WS_CHILD | WS_VISIBLE | SS_CENTER, 0, 50, win_w, 45, hwnd,(HMENU)1,((LPCREATESTRUCT)lParam)->hInstance,NULL);SendMessage(wish,WM_SETFONT,(WPARAM)hFont2,TRUE);CreateWindow("button", TEXT("随机"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 100, 150, 100, 45, hwnd,(HMENU)1001,((LPCREATESTRUCT)lParam)->hInstance,NULL);CreateWindow("button", TEXT("退出"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 300, 150, 100, 45, hwnd,(HMENU)1002,((LPCREATESTRUCT)lParam)->hInstance,NULL);LONG style = GetWindowLong(hwnd, GWL_STYLE);        style &= ~(WS_MAXIMIZEBOX|WS_SIZEBOX|WS_MINIMIZE);        SetWindowLong(hwnd, GWL_STYLE, style);        get_rand();break;}case WM_COMMAND: {if(LOWORD(wParam)==1001){get_rand();} else if (LOWORD(wParam)==1002) {DestroyWindow(hwnd);}break; }case WM_DESTROY: {PostQuitMessage(0);break;}default:return DefWindowProc(hwnd, Message, wParam, lParam);}return 0;
}//这是 Windows 应用程序的入口点。 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {WNDCLASSEX wc;HWND hwnd;MSG Msg;memset(&wc,0,sizeof(wc));wc.cbSize                 = sizeof(WNDCLASSEX);wc.lpfnWndProc         = WndProc; /* insert window procedure function here */wc.hInstance         = hInstance;wc.hCursor                 = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wc.lpszClassName = "WindowClass";wc.hIcon                 = LoadIcon(NULL, IDI_APPLICATION); /* use "A" as icon name when you want to use the project icon */wc.hIconSm                 = LoadIcon(NULL, IDI_APPLICATION); /* as above */if(!RegisterClassEx(&wc)) {MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}win_h = 240;win_w = 640;hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","祝福",WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,win_w,win_h,NULL,NULL,hInstance,NULL);if(hwnd == NULL) {MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}while(GetMessage(&Msg, NULL, 0, 0) > 0) {TranslateMessage(&Msg);DispatchMessage(&Msg);}return Msg.wParam;
}

说明

windows.h:包含 Windows API 的所有功能,允许进行窗口创建、消息处理等。

iostream:用于输入输出操作。

窗口过程函数

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { ... }

这是 Windows 应用程序的核心功能,处理所有发送到窗口的消息,包括:

  • WM_CREATE:窗口创建时调用,创建界面元素(标签和按钮)并初始化文本。
  • WM_COMMAND:处理按钮点击事件。如果点击“随机”按钮,就调用 get_rand() 函数;如果点击“退出”按钮,就销毁窗口。
  • WM_DESTROY:窗口被销毁时,发送退出消息。
  • 其他消息则调用默认窗口处理过程。

WinMain 函数

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ... }

这是 Windows 应用程序的入口点。主要步骤包括:

  • 定义窗口类,并设置其属性(如窗口过程、光标、背景等)。
  • 注册窗口类。
  • 创建窗口并显示。
  • 进入消息循环,等待和处理窗口消息。

在 WinMain 函数中,调用 CreateWindowEx 创建窗口,并通过 ShowWindow 和 UpdateWindow 显示窗口。

特别提示

需要注意的是,Windows API 开发应用程序并不一定都是图形用户界面(GUI)的。Windows API(应用程序编程接口)是一个功能丰富的库,支持多种类型的应用程序开发,包括命令行工具、后台服务、驱动程序以及传统的 GUI 应用程序。

一个简单的 Windows API 控制台应用程序示例源码:

#include <windows.h>
#include <stdio.h>int main() {SYSTEM_INFO sysInfo;GetSystemInfo(&sysInfo);printf("处理器数量: %d\n", sysInfo.dwNumberOfProcessors);printf("页面大小: %d bytes\n", sysInfo.dwPageSize);MEMORYSTATUSEX memInfo;memInfo.dwLength = sizeof(MEMORYSTATUSEX);GlobalMemoryStatusEx(&memInfo);printf("总物理内存: %lld MB\n", memInfo.ullTotalPhys / (1024 * 1024));printf("可用物理内存: %lld MB\n", memInfo.ullAvailPhys / (1024 * 1024));return 0;
}

运行效果:

通过灵活使用 Windows API,你可以开发出适应各种场景的高效应用程序! 

我们这个系列主题,重点关注的是用户交互界面(窗口)的GUI 应用程序。

开发简单的小项目或游戏来应用所学知识,参考其他人的例子是一种好方法。后面还将给出我收集的更多的例子。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion 四重调参优化——项目学习记录

学习记录还原&#xff1a;在本次实验中&#xff0c;我基于 Stable Diffusion v1.5模型&#xff0c;通过一系列优化方法提升生成图像的质量&#xff0c;最终实现了图像质量的显著提升。实验从基础的 Img2Img 技术入手&#xff0c;逐步推进到参数微调、DreamShaper 模型和 Contro…

Solidity智能合约漏洞类型与解题思路指南

一、常见漏洞类型与通俗解释 1. 重入攻击(Reentrancy) 🌀 通俗解释:就像你去银行取钱,柜台人员先给你钱,然后再记账。你拿到钱后立即又要求取钱,由于账还没记,柜台又给你一次钱,这样循环下去你就能拿走银行所有的钱。 漏洞原理:合约在更新状态前调用外部合约,允许…

Docker部署.NetCore8项目

在VS.net新建.netCore8项目&#xff0c;生成项目的发布文件&#xff0c;之后添加Dockerfile&#xff0c;内容如下&#xff1a; FROM mcr.microsoft.com/dotnet/aspnet:8.0 # 设置工作目录 WORKDIR /app # 挂载临时卷&#xff08;类似于 VOLUME /tmp&#xff09; VOLUME /tmp …

【C++】右值引用、移动语义与完美转发

左值、右值是C常见的概念&#xff0c;那么什么是右值引用&#xff0c;移动语义&#xff0c;完美转发呢&#xff1f;本UP带大家了解一下C校招常问的C11新特性。 左值与右值 左值&#xff1a;明确存储未知、可以取地址的表达式 右值&#xff1a;临时的、即将被销毁的&#xff…

艾尔登法环地图不能使用鼠标移动或点击传送点原因和设置方法

今天玩艾尔登法环突发发现地图不能用鼠标点击传送点了。 找了半天发现设置地图选单的游标移动方式只有键盘了&#xff0c;改成键盘与鼠标就好啦。

【算法】——一键解决动态规划

前言 动态规划是一种高效解决​​重叠子问题​​和​​最优子结构​​问题的算法思想。它通过​​分治记忆化​​&#xff0c;将复杂问题分解为子问题&#xff0c;并存储中间结果&#xff0c;避免重复计算&#xff0c;从而大幅提升效率。 ​​为什么重要&#xff1f;​ ​​优化…

uniApp开发微信小程序-连接蓝牙连接打印机上岸!

历经波折三次成功上岸&#xff01; 三次经历简单絮叨一下&#xff1a;使用uniAppvue开发的微信小程序&#xff0c;使用蓝牙连接打印机&#xff0c;蓝牙所有的接口都是插件中封装的&#xff0c;用的插件市场中的这个&#xff1a; dothan-lpapi-ble &#xff1b;所以&#xff0c…

软件系统安全设计方案,信息化安全建设方案(Word原件)

1.1 总体设计 1.1.1 设计原则 1.2 物理层安全 1.2.1 机房建设安全 1.2.2 电气安全特性 1.2.3 设备安全 1.2.4 介质安全措施 1.3 网络层安全 1.3.1 网络结构安全 1.3.2 划分子网络 1.3.3 异常流量管理 1.3.4 网络安全审计 1.3.5 网络访问控制 1.3.6 完…

wsl2+ubuntu22.04安装blenderproc教程

本章教程,介绍如何在windows操作系统上通过wsl2+Ubuntu22.04上安装blenderproc。 一、pipi安装方式 推荐使用minconda3安装Python环境。 pip install Blenderproc二、源码安装 1、下载源码 git clone https://github.com/DLR-RM/BlenderProc2、安装依赖 cd BlenderProc &am…

Blender 转 STL 文件全攻略:从基础到进阶

在 3D 建模与打印领域&#xff0c;Blender 凭借其强大的功能和开源特性&#xff0c;深受创作者喜爱。而 STL 文件格式&#xff0c;作为 3D 打印行业的通用标准&#xff0c;能被绝大多数 3D 打印软件和设备所识别。因此&#xff0c;将 Blender 模型转换为 STL 文件&#xff0c;是…

Ansys Electronics 变压器 ACT

你好&#xff0c; 在本博客中&#xff0c;我将讨论如何使用 Ansys 电子变压器 ACT 自动快速地设计电力电子电感器或变压器。我将逐步介绍设计和创建电力电子变压器示例的步骤&#xff0c;该变压器为同心组件&#xff0c;双绕组&#xff0c;采用正弦电压激励&#xff0c;并应用…

nacos配置达梦数据库驱动源代码步骤

1.在父工程pom.xml添加依赖&#xff1a; <dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.1.193</version> </dependency> 2.在nacos-config模块pom.xml添加依赖&#xff1…

4.9-4.10学习总结 Stream流练习+方法引用+异常

Stream流练习&#xff1a; 1.打印数组内的偶数。 import java.util.*; import java.util.function.BiConsumer; public class test {public static void main(String[] args) {ArrayList<Integer> listnew ArrayList<>();Collections.addAll(list,1,2,3,4,5,6,7,…

FPGA系统开发板调试过程不同芯片的移植步骤介绍

目录 1.我目前使用的开发板 2.不同开发板的移植 步骤一&#xff1a;芯片型号设置 步骤二&#xff1a;约束修改 步骤三、IP核更新 关于FPGA系统开发板调试过程中不同芯片的移植。我需要先理清楚FPGA开发中移植到不同芯片的一般流程。首先&#xff0c;移植通常涉及到更换FPG…

复现QGIS-MCP教程

由于Claude国内下载不了尝试使用Cursor 下载安装Cursor Cursor - The AI Code Editor 本示例安装的是0.46版本 UV安装 简介 安装 安装成功 配置环境变量 验证 下载代码 git clone gitgithub.com:jjsantos01/qgis_mcp.git QGIS插件安装 文件拷贝 您需要将 qgis_mcp_plu…

java笔记03

基本数据类型 数据值是存储在自己的空间中。 特点&#xff1a;赋值给其他变量&#xff0c;也是赋的真实的值。 引用数据类型 数据值是存储在其他空间中&#xff0c;自己空间中存储的是地址值。 特点&#xff1a;赋值给其他变量&#xff0c;赋的地址值。 综合练习 使用 ctrl…

【开发工具】快速自定义图标元素的颜色

如果你想要一个轻量级、简单易用 的小工具来快速自定义图标元素的颜色&#xff08;比如调整 SVG/PNG 图标的颜色&#xff0c;或者生成多色图标&#xff09;&#xff0c;可以试试以下工具&#xff1a; 1. 在线工具&#xff08;无需安装&#xff09; SVG/PNG 图标改色 - Recol…

【CompletableFuture】异步编程

CompletableFuture异步编程 CompletableFuture介绍与传统 Future 的对比使用方法1. 使用 supplyAsync&#xff08;有返回值&#xff09;使用 runAsync&#xff08;无返回值&#xff09;指定自定义线程池 处理异步结果1. thenApply&#xff1a;转换结果2.thenAccept&#xff1a;…

【TS学习】(23)理解类的双重角色

在 TypeScript 中&#xff0c;类&#xff08;class&#xff09;不仅是一个运行时的值&#xff08;即可以实例化对象的构造函数&#xff09;&#xff0c;同时也是一个类型声明。具体来说&#xff0c;类在 TypeScript 中既声明了值&#xff0c;也声明了类型&#xff0c;并且它的类…

IAP Firmware Upload Tools.exe IAP 网络固件升级教程

IAP是In Application Programming的简写&#xff0c;IAP升级可以被视为固件升级的一种形式,它是一种在应用程序运行过程中对固件进行更新的技术手段。允许MCU在运行过程中对MCU User Flash的部分区域进行烧写,目的是为了代替编程器对MCU烧录的依赖。 主程序UI 软件按钮说明&a…