服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言百行代码绘制圣诞水晶球

C语言百行代码绘制圣诞水晶球

2022-07-28 10:58MAX在码字 C/C++

今天就是圣诞节了,本文将再教大家一个圣诞项目——圣诞水晶球,今天这个呢代码不多,但难度会有点。感兴趣的小伙伴可以跟随小编一起学习学习

我爱你,不是因为你是一个怎样的人,而是因为我喜欢与你在一起时的感觉。

嗨!这里是狐狸~~

今天就是圣诞节了,再过一个星期就是2022年了,最近总是感觉伤感,有些事情就是比想象中来的快一些,希望大家都可以把握2021年最后的时间,不留遗憾吧,后天圣诞节,今天再教大家一个圣诞项目吧,圣诞水晶球,今天这个呢代码不多,但难度会有点,因为这个涉及桌面,就是可以在桌面实现,希望大家可以认真看,认真学吧。

同样,先给大家看效果吧

C语言百行代码绘制圣诞水晶球

效果还是很不错的,再加上一个音乐,女朋友看完就马上同意你了,嘿嘿,这里就不再是简单的窗口了,难度有一些,但也不大,毕竟代码也不多,好了,认真学,认真的尝试哦!

项目代码

这是我第一次只用一个代码段,因为代码确实不多,我觉得分段就没必要了,而且其中必要的地方,我也加了详细的注释,应该还好,难就难在之前没有用Windows库,这次用了,效果看起来就会舒服很多,怎么样,学会了赶快拿给心中的那个人看吧!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <stdio.h>
#include <windows.h>
#include <graphics.h>
#include <commctrl.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
 
int main()
{
    keybd_event(VK_LWIN, 0, 0, 0);
    keybd_event('D', 0, 0, 0);
    keybd_event('D', 0, 2, 0);
    keybd_event(VK_LWIN, 0, 2, 0);
    
    Sleep(3000);
    int CX = GetSystemMetrics(SM_CXSCREEN);
    int CY = GetSystemMetrics(SM_CYSCREEN);
 
    HWND hwnd = initgraph(500,500); //创建一个窗口hwnd
    HRGN Ellip = CreateEllipticRgn(10, 32, 100+10, 100+32);//设置一个逻辑的图形rect
    SetWindowRgn(hwnd, Ellip, true);  //设置窗口的区域
    SetForegroundWindow(hwnd);
    MoveWindow(hwnd, CX / 2 - 120, CY / 2, 500, 500, true);
 
    mciSendString("open res/music.mp3", 0, 0, 0);    //打开
    mciSendString("play res/music.mp3 repeat", 0, 0, 0);    //播放
    bool isplay = true//音乐是否正在播放
 
    int sence = 3;  //场景
    int frame = 0;  //帧数
    IMAGE img[30];
    int maxframe[] = { 20, 7, 4, 15, 10}; //每一种场景的图片的张数
    char picpath[30] = { 0 };  //字符串 图片的路径
    for (int i = 0; i < maxframe[sence]; i++)
    {
        sprintf(picpath, "res/%02d-%02d.bmp", sence, i);
        loadimage(&img[i], picpath, 100, 100);
    }
 
    /*---------------------------------------------------------*/
    //获取到桌面图标的窗口
    HWND zmWnd = FindWindow("Progman","Program Manager");  //桌面窗口
    HWND bzWnd = FindWindowEx(zmWnd, 0, "SHELLDLL_DefView", NULL);  //壁纸窗口
    HWND tbWnd = FindWindowEx(bzWnd, 0, "SysListView32", "FolderView");  //图标窗口
 
    HWND workHwnd = NULL;
    while (tbWnd == NULL)//必须存在桌面窗口层次
    {
        workHwnd = FindWindowExA(0, workHwnd, "WorkerW", NULL);//获得WorkerW类的窗口
        if (workHwnd == NULL)
            break;//未知错误
        bzWnd = FindWindowExA(workHwnd, NULL, "SHELLDLL_DefView", NULL);
        if (bzWnd == NULL)
            continue;
        tbWnd = FindWindowExA(bzWnd, NULL, "SysListView32", NULL);
    }
 
    DWORD dwStyle = (DWORD)GetWindowLong(tbWnd, GWL_STYLE);
    if (dwStyle & LVS_AUTOARRANGE)
        SetWindowLong(tbWnd, GWL_STYLE, dwStyle & ~LVS_AUTOARRANGE);
 
    DWORD dwExStyle = (DWORD)ListView_GetExtendedListViewStyle(tbWnd, GWL_EXSTYLE);
    if (dwExStyle & LVS_EX_SNAPTOGRID)
        ListView_SetExtendedListViewStyle(tbWnd, dwExStyle & ~LVS_EX_SNAPTOGRID);
 
 
    //指挥它 威胁它 图标的窗口
    int count = SendMessage(tbWnd, LVM_GETITEMCOUNT, 0, 0);
    for (int i = 0; i < count; i++)
        SendMessage(tbWnd, LVM_SETITEMPOSITION, i, (3000 << 16) + 100);
    POINT dir[14] = { { 868 * CX / 1920, 316 * CY / 1080 }, { 730 * CX / 1920, 207 * CY / 1080 },
    { 591 * CX / 1920, 221 * CY / 1080 }, { 515 * CX / 1920, 327 * CY / 1080 }, { 542 * CX / 1920, 469 * CY / 1080 },
    { 610 * CX / 1920, 624 * CY / 1080 }, { 723 * CX / 1920, 746 * CY / 1080 }, { 870 * CX / 1920, 814 * CY / 1080 },
    { 1012 * CX / 1920, 744 * CY / 1080 }, { 1130 * CX / 1920, 626 * CY / 1080 },
    { 1219 * CX / 1920, 485 * CY / 1080 }, { 1225 * CX / 1920, 328 * CY / 1080 }, { 1156 * CX / 1920, 225 * CY / 1080 },
    { 1012 * CX / 1920, 217 * CY / 1080 } };
 
    ExMessage m;                         //定义消息
    int oldsence;
    while (1){
 
        if (peekmessage(&m, EM_MOUSE))   //如果获取到一条鼠标消息
        {
            switch (m.message)
            {
            case WM_LBUTTONDOWN:  //点下左键  换一个场景
                oldsence = sence;
                do
                {
                    sence = rand() % (sizeof(maxframe) / sizeof(maxframe[0])); //0-5
                } while (sence == oldsence);
 
                for (int i = 0; i < maxframe[sence]; i++)
                {
                    sprintf(picpath, "res/%02d-%02d.bmp", sence, i);
                    loadimage(&img[i], picpath, 100, 100);
                }
                SendMessage(hwnd, WM_SYSCOMMAND, 0xf012, 0);
            
                break;
            case WM_RBUTTONDOWN:
                if (isplay)  //正在播放
                    mciSendString("pause res/music.mp3", 0, 0, 0); 
                else
                    mciSendString("play res/music.mp3 repeat", 0, 0, 0);
                
                isplay = !isplay; //取反
                break;
            }
        }
        else  //绘制界面
        {
            putimage(0, 0, &img[frame++]);
            if (frame > maxframe[sence] - 1)frame = 0;
 
            for (int i = 0; i < 14; i++)
            {
                SendMessage(tbWnd, LVM_SETITEMPOSITION, i, (dir[i].y << 16) + dir[i].x);
            }
 
            int x = dir[0].x;
            int y = dir[0].y;
            for (int i = 0; i < 13; i++)
            {
                dir[i].x = dir[i + 1].x;
                dir[i].y = dir[i + 1].y;
            }
            dir[13].x = x;
            dir[13].y = y;
        }
    }
    return 0;
}

总结

代码真的非常的少,认真理解每一行的作用,相信你们很快就可以理解了。圣诞节快到了,程序员的快乐无非就是可以代码写出一些特别的东西了,主要是确实好用,哈哈哈,不管男女,好啦,希望大家可以在圣诞节的那天都会有好运气,提前祝大家圣诞节快乐啦!

视频讲解

这次也有视频讲解,代码不多,看视频会理解的更快!

到此这篇关于C语言百行代码绘制圣诞水晶球的文章就介绍到这了,更多相关C语言绘制圣诞水晶球内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_45713725/article/details/122104942

延伸 · 阅读

精彩推荐
  • C/C++C++中一维数组与指针的关系详细总结

    C++中一维数组与指针的关系详细总结

    以下是对C++中一维数组与指针的关系进行了详细的总结介绍,需要的朋友可以过来参考下...

    C++教程网2592020-12-24
  • C/C++C++实现两个有序数组的合并

    C++实现两个有序数组的合并

    这篇文章主要为大家详细介绍了C++实现两个有序数组的合并,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    sigma2beta8522021-08-13
  • C/C++详解C/C++内存管理

    详解C/C++内存管理

    内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,今天给大家分享C/C++内存管理的实例代码,需...

    2021dragon3552021-11-15
  • C/C++C语言实现将double/float 转为字符串(带自定义精度)

    C语言实现将double/float 转为字符串(带自定义精度)

    这篇文章主要介绍了C语言实现将double/float 转为字符串(带自定义精度),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝...

    snow_lyGirl9952022-03-11
  • C/C++浅析C++中单链表的增、删、改、减

    浅析C++中单链表的增、删、改、减

    以下是对C++中单链表的增、删、改、减进行了详细的介绍,需要的朋友可以过来参考下...

    C++教程网2532020-12-24
  • C/C++解析static在C和C++中的用法以及区别

    解析static在C和C++中的用法以及区别

    以下是对static在C和C++中的用法以及区别进行了详细的分析介绍。需要的朋友可以过来参考下...

    C语言教程网5522020-12-23
  • C/C++利用反射获得类的public static/const成员的值实例

    利用反射获得类的public static/const成员的值实例

    下面小编就为大家带来一篇利用反射获得类的public static/const成员的值实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来...

    C语言教程网6332021-04-25
  • C/C++VS2019开发Linux C++程序的实现步骤

    VS2019开发Linux C++程序的实现步骤

    由于很多unix特有的函数无法在Windows上使用,而Vim又用的不太顺手,突然想到最初用vs的时候有一个基于Linux的C++开发。本文就来介绍一下,感兴趣的可以了...

    Respect@6562021-11-25