C语言基础(三十四)

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

运行结果如下:

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值