C语言一个有趣的小程序(点不到的按钮)

本文展示了如何在Visual Studio 2017下,利用C++和Windows API创建一个简单的窗口应用程序,该程序包含一个按钮,用户点击按钮时,按钮会随机移动并计数,当计数达到10次时弹出提示框并关闭窗口。主要涉及窗口类注册、窗口创建、消息循环以及按钮事件处理等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序源码如下:
编译环境:
vs2017 +win10

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>
#include <tchar.h>
 
HINSTANCE g_hInstance = 0;
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPreInstance,
    LPSTR lpCmdLine,
    int nShowCmd
)
{
    g_hInstance = hInstance;
 
    srand((unsigned)time(NULL));
 
    //1.注册窗口类
    WNDCLASS wc = { 0 };
    wc.lpszClassName = _T("MyClass");
    wc.lpfnWndProc = WndProc;
    wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
 
    RegisterClass(&wc);
 
    //2.创建窗口
    HWND hWnd = CreateWindow(
        wc.lpszClassName,
        _T("顽皮的按钮"),
        WS_OVERLAPPEDWINDOW,
        200, 100,
        640, 480,
        NULL,
        NULL,
        g_hInstance,
        0
    );
 
    //3.更新显示窗口
    UpdateWindow(hWnd);
    ShowWindow(hWnd, SW_SHOW);
 
    //4.消息循环
    MSG Msg = { 0 };
    while (GetMessage(&Msg, 0, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return (int)Msg.lParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static int nCnt = 0;
    switch (uMsg)
    {
    case WM_CREATE:
    {
        HWND hButton = CreateWindow(
            _T("button"),
            _T("来点我"),
            WS_CHILD | WS_VISIBLE,
            10, 10,
            80, 45,
            hWnd,
            HMENU(0x1000),
            g_hInstance,
            0
        );
    }break;
    case WM_COMMAND:
    {
        DWORD nCode = HIWORD(wParam);
        DWORD nId = LOWORD(wParam);
        if (nId == 0x1000 && nCode == BN_CLICKED)
        {
            if (nCnt == 10)
            {
                MessageBox(hWnd, _T("恭喜你点到了!"), _T("嘿嘿"), MB_OK);
                PostMessage(hWnd, WM_CLOSE, 0, 0);
            }
            HWND hButton1 = GetDlgItem(hWnd, 0x1000);
            int x = rand() % 520;
            int y = rand() % 390;
            MoveWindow(hButton1, x, y, 100, 50, true);
            UpdateWindow(hWnd);
            nCnt++;
        }
    }break;
    case WM_CLOSE:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞天的大鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值