C语言基础(三十四)

news2024/12/26 23:43:57

Win32 API(Application Programming Interface)是微软Windows操作系统提供的一套底层的应用程序编程接口,允许开发者直接与Windows操作系统交互,创建和管理窗口、图形界面、系统资源等。Win32 API主要用于开发桌面应用程序,支持C和C++编程语言。

开发环境准备(本文采用Dev-C++)
开始Win32开发,需要:
安装Visual Studio:Visual Studio是微软开发的集成开发环境(IDE),支持Win32应用程序的开发。可以从微软官网下载并安装适合开发需求的Visual Studio版本。
选择或创建项目:在Visual Studio中,可以选择创建一个新的Win32项目,帮助设置基本的项目结构和一些常用的Win32 API调用。

基本概念
窗口(Window):Win32 API中的基本单位是窗口,它代表了一个矩形区域,可以在其中绘制文本、图形或接受用户输入。
消息(Message):Windows通过消息与应用程序通信。这些消息可以是由用户行为(如点击鼠标或按键)触发的,也可以是由系统内部事件(如窗口需要重绘)触发的。
消息循环(Message Loop):Win32应用程序通过消息循环持续监听和处理消息。应用程序从消息队列中取出消息,并调用相应的消息处理函数(也称为窗口过程)处理这些消息。
句柄(Handle):在Win32编程中,句柄是用来标识对象(如窗口、画笔、字体等)的数值。

开发步骤
定义窗口类:通过调用WNDCLASSEX结构来定义窗口类的样式、行为、图标等属性。
注册窗口类:使用RegisterClassEx函数将窗口类注册到Windows系统中。
创建窗口:通过调用CreateWindowEx函数创建窗口实例。
显示和更新窗口:使用ShowWindow和UpdateWindow函数显示和更新窗口。
消息循环:在消息循环中,应用程序通过GetMessage、TranslateMessage和DispatchMessage函数从消息队列中取出消息,并将其分发给相应的窗口过程进行处理。
窗口过程:窗口过程是一个函数,它处理发送给窗口的各种消息。在Win32编程中,需要实现一个窗口过程函数,并处理常见的消息,如WM_PAINT(窗口需要重绘)、WM_DESTROY(窗口被销毁)等。

测试代码1:创建线程

#include "date.h" 
#include <windows.h>  
#include <stdio.h>  
  
// 线程函数  
DWORD WINAPI ThreadFunction(LPVOID lpParam) {  
    // 将传入的参数转换为适当类型  
    int* pValue = (int*)lpParam;  
  
    // 使用参数  
    printf("线程运行中,参数值 = %d\n", *pValue);  
  
    // 模拟线程工作  
    Sleep(1000); // 暂停1秒  
  
    // 线程结束  
    return 0;  
}  
  
int main() {  
    int time = getTime();
    // 线程ID  
    HANDLE hThread;  
  
    // 传递给线程的参数  
    int threadParam = 123;  
  
    // 创建线程  
    // 第一个参数为安全属性,NULL表示使用默认安全属性  
    // 第二个参数为线程堆栈大小,0表示使用默认大小  
    // 第三个参数为线程函数  
    // 第四个参数为传递给线程函数的参数  
    // 第五个参数为创建线程的初始状态,0表示立即运行  
    // 第六个参数为接收线程ID的变量地址  
    hThread = CreateThread(  
        NULL,                   // 默认安全属性  
        0,                      // 默认堆栈大小  
        ThreadFunction,         // 线程函数  
        &threadParam,           // 传递给线程函数的参数  
        0,                      // 默认创建标志  
        NULL);                  // 不需要获取线程ID  
  
    // 等待线程结束  
    WaitForSingleObject(hThread, INFINITE);  
  
    // 关闭线程句柄  
    CloseHandle(hThread);  
  
    return 0;  
}

运行结果如下:

测试代码2:创建一个窗口,并显示日期和时间。

#include <windows.h>
#include <time.h>
// 一个简单的Windows应用程序,用于创建一个窗口,窗口显示当前时间,并且时间每秒更新一次。 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
    	// WM_CREATE消息:在窗口创建时设置定时器,每隔1秒触发一次更新时间的操作。
        case WM_CREATE: {
            SetTimer(hwnd, 1, 1000, NULL); // 每隔1秒更新时间
            break;
        }
        // WM_TIMER消息:在定时器触发时刷新窗口。
        case WM_TIMER: {
            if (wParam == 1) {
                InvalidateRect(hwnd, NULL, TRUE); // 刷新窗口
            }
            break;
        }
        // 在窗口需要重绘时,获取当前时间并绘制在窗口中。
        case WM_PAINT: {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            
            // 获取当前时间
            time_t now = time(NULL);
            struct tm* timeinfo = localtime(&now);
            char buffer[80];
            strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", timeinfo);
            
            // 在窗口中绘制当前时间
            TextOut(hdc, 10, 10, buffer, strlen(buffer));
            
            EndPaint(hwnd, &ps);
            break;
        }
        // 销毁定时器和释放资源。
        case WM_DESTROY: {
            KillTimer(hwnd, 1); // 销毁定时器
            PostQuitMessage(0);
            break;
        }
        
        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
    
    return 0;
}
// WinMain函数注册窗口类WNDCLASS,创建窗口hwnd,并显示窗口。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = "ClockWindowClass";
    
    RegisterClass(&wc);

    HWND hwnd = CreateWindowEx(0, "ClockWindowClass", "Window", WS_OVERLAPPEDWINDOW, 
                           CW_USEDEFAULT, CW_USEDEFAULT, 400, 200, NULL, NULL, hInstance, NULL);
    
    ShowWindow(hwnd, nCmdShow);
    
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return msg.wParam;
}

调整设置:选择Win32 GUI

运行结果如下:

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

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

相关文章

【OpenWrt(2)】编译OpenWrt 的SDK,以linksys e8450 的MT7622 CPU为例

资源 参考 https://downloads.openwrt.org/releases/ 文章目录 资源依赖下载 SDK查询 CPU 信号 解压使用 feed 编译后台运行 依赖 apt-get update apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache gettext libssl-dev xsltproc wget…

气膜体育馆空气质量保障:健康运动新选择—轻空间

随着气膜体育馆的广泛应用&#xff0c;人们对其内部空气质量的关注日益增加。许多人担心封闭的气膜结构可能会导致空气流通不畅&#xff0c;进而影响健康。然而&#xff0c;现代气膜体育馆凭借独特的建筑设计、先进的空气净化系统以及良好的通风和换气机制&#xff0c;能够有效…

传统CV算法——边缘算子与图像金字塔算法介绍

边缘算子 图像梯度算子 - Sobel Sobel算子是一种用于边缘检测的图像梯度算子&#xff0c;它通过计算图像亮度的空间梯度来突出显示图像中的边缘。Sobel算子主要识别图像中亮度变化快的区域&#xff0c;这些区域通常对应于边缘。它是通过对图像进行水平和垂直方向的差分运算来…

MyBatis错误(一)

说明&#xff1a;记录一次MyBatis错误&#xff0c;错误信息如下&#xff0c;说数字转换异常&#xff0c;显然&#xff0c;把一个字符串类型转为数字类型&#xff0c;肯定是不行的。 2024-08-29 19:44:43.198 ERROR 24216 --- [nio-9090-exec-2] o.a.c.c.C.[.[.[/].[dispatcher…

Leetcode面试经典150题-54.螺旋矩阵

解法都在代码里&#xff0c;不懂就留言或者私信 这个题可能和算法关联不大&#xff0c;coding技巧为上 class Solution {public List<Integer> spiralOrder(int[][] matrix) {/**先定义结果集 */List<Integer> ans new ArrayList<>();/**当前位置从(0,0)开…

SpringMVC使用:类型转换数据格式化数据验证

01-类型转换器 先在pom.xml里面导入依赖&#xff0c;一个是mvc框架的依赖&#xff0c;一个是junit依赖 然后在web.xml里面导入以下配置&#xff08;配置的详细说明和用法我在前面文章中有写到&#xff09; 创建此测试类的方法用于测试springmvc是具备自动类型转换功能的 user属…

AI智能分析/智慧安防EasyCVR视频汇聚平台新版本(V3.6.0)播放鉴权与播放限制时长的区别介绍

随着科技的飞速发展&#xff0c;视频技术已成为现代社会不可或缺的一部分&#xff0c;广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。EasyCVR视频汇聚平台作为视频技术的佼佼者&#xff0c;不断推陈出新&#xff0c;通过功能更新迭代&#xff0c;为用户提供更加…

PyTorch 卷积层详解

PyTorch 卷积层详解 卷积层&#xff08;Convolutional Layers&#xff09;是深度学习中用于提取输入数据特征的重要组件&#xff0c;特别适用于处理图像和序列数据。PyTorch 提供了多种卷积层&#xff0c;分别适用于不同维度的数据。本文将详细介绍这些卷积层&#xff0c;特别…

江协科技stm32————11-5 硬件SPI读写W25Q64

一、开启时钟&#xff0c;开启SPI和GPIO的时钟 二、初始化GPIO口&#xff0c;其中SCK和MOSI是由硬件外设控制的输出信号&#xff0c;配置为复用推挽输出 MISO是硬件外设的输入信号&#xff0c;配置为上拉输入&#xff0c;SS是软件控制的输出信号&#xff0c;配置为通用推挽输出…

【Linux网络】应用层协议HTTP(1)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux网络 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 应用层协议HTTP 的相关内容。 如果看到最后您觉得这篇文章写得…

Codeforces Round 971 (Div. 4) ABCD题详细题解(C++,Python)

前言: 本文为Codeforces Round 971 (Div. 4) ABCD题的题解&#xff0c;包含C,Python语言描述&#xff0c;觉得有帮助或者写的不错可以点个赞 比赛打了没一半突然unrated了就不是很想继续写了,早起写个题解&#xff0c;下午再更新后面EFG1的&#xff0c;G2有点难应该写不出来&am…

桌球棋牌计时计费管理系统软件 可以语音报价停电可以恢复上次时间状态 佳易王计时计费管理系统操作教程

一、前言 桌球棋牌计时计费管理系统软件 可以语音报价停电可以恢复上次时间状态 佳易王计时计费管理系统操作教程 1、佳易王桌球计时计费软件&#xff0c;在使用中如遇到突然停电&#xff0c;再次打开软件的时候&#xff0c;可以点击 恢复上次状态按钮&#xff0c;时间可以恢…

CRIO与Windows下LabVIEW开发对比

LabVIEW在CRIO和Windows平台上开发时&#xff0c;尽管同属于一个编程环境&#xff0c;但在硬件架构、实时性能、模块化设计等方面存在显著差异。CRIO系统通常应用于工业自动化和嵌入式控制&#xff0c;具有实时操作系统支持和强大的I/O扩展能力&#xff1b;而Windows系统则更适…

【word导出带图片】使用docxtemplater导出word,通知书形式的word

一、demo-导出的的 二、代码操作 1、页面呈现 项目要求&#xff0c;所以页面和导出来的word模版一致 2、js代码【直接展示点击导出的js代码】 使用插件【先下载这五个插件&#xff0c;然后页面引入插件】 import docxtemplater from docxtemplater import PizZip from pizzip …

生成密码c

需求 目前需要实现生成8-12位密码&#xff0c;密码要求至少包含一位数字&#xff0c;一位大写字母&#xff0c;一位小写字母&#xff0c;一位特殊字符。特殊字符仅包含&#xff08;“”&#xff0c;“&#xff01;”&#xff0c;“_”&#xff09; 需求分析 可知我们需要1个…

SVD的diffusers版本代码解析

https://zhuanlan.zhihu.com/p/701223363https://zhuanlan.zhihu.com/p/701223363ComfyUI中SVD 1.1:文生图,图生图,LCM应用 - 腾讯云开发者社区-腾讯云

[工具使用]git

git fetch 获取远程仓库内容&#xff0c;但未合入本地仓库&#xff1b; git rebase 获取远程仓库内容&#xff0c;并更改基地合入本地仓库&#xff1b; 将master分支的内容合入feature分支&#xff1a; 当在feature分支上执行git rebase master时&#xff0c;git会从master…

如何在不重装的前提下,将1TB的硬盘克隆到500GB的固态硬盘?

借助傲梅分区助手&#xff0c;你能够在Windows 11、10、8、7中轻松的将1TB硬盘克隆到500GB固态硬盘。并且无需重新安装系统&#xff0c;即可轻松实现1TB机械硬盘升级至固态硬盘。 问&#xff1a;可以克隆到较小的固态硬盘吗&#xff1f; “大家下午好&#xff01;我刚买了一块…

《数字信号处理》学习03-矩形序列,实指数序列和复指数序列

目录 一&#xff0c;矩形序列 1&#xff0c;由单位阶跃序列组成 2&#xff0c;由单位冲击序列组成 二&#xff0c;实指数序列 三&#xff0c;复指数序列 这篇文章着重学习&#xff1a;矩形序列&#xff0c;实指数序列和复指数序列。其它序列都比较简单&#xff0c;这里不再…

计算机毕业设计PySpark深度学习动漫推荐系统 动漫视频推荐系统 机器学习 协同过滤推荐算法 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计

本推荐系统采用的是分层模型设计思想&#xff0c;第一层为前端页面模型设计&#xff0c;注重为实现页面的展示效果&#xff0c;主用的编程语言为JavaScript,和前端主流框架bootstrap。 第二层为后端模型设计&#xff0c;编程语言选了简单易懂的python&#xff0c;用Django作为后…