首页
论坛
课程
招聘
[原创]windows程序设计:哆啦A梦
2011-8-11 20:09 23243

[原创]windows程序设计:哆啦A梦

2011-8-11 20:09
23243
程序运行时效果:


程序写得比较麻烦,在学习《windows程序设计》GDI章解的练习,给大家娱乐,下面是源代码:

/*--------------------------------------------
                                        机器猫.C
---------------------------------------------*/

#include <windows.h>
#include <math.h>

#define NUM                1000
#define TWOPI        (2 * 3.1415926)

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
        static TCHAR szAppName[] = TEXT ("HelloWin") ;
        HWND         hwnd ;
        MSG          msg ;
    WNDCLASS     wndclass ;
        int cx, cy ;
        cx = GetSystemMetrics(SM_CXSCREEN) / 2 - 200;
        cy = GetSystemMetrics(SM_CYSCREEN) / 2 - 200;

        wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
        wndclass.lpfnWndProc   = WndProc ;
        wndclass.cbClsExtra    = 0 ;
        wndclass.cbWndExtra    = 0 ;
        wndclass.hInstance     = hInstance ;
        wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
        wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
        wndclass.hbrBackground = (HBRUSH) GetStockObject (/*GRAY*/WHITE_BRUSH) ;
        wndclass.lpszMenuName  = NULL ;
        wndclass.lpszClassName = szAppName ;
       
        if (!RegisterClass (&wndclass))
        {
                MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                        szAppName, MB_ICONERROR) ;
                return 0 ;
        }
       
        RegisterClass (&wndclass);
       
        hwnd = CreateWindow (szAppName,                  // window class name
                TEXT ("The Hello Program"), // window caption
                WS_OVERLAPPEDWINDOW,        // window style
                cx,                                                         // initial x position
                cy,                                                         // initial y position
                400,                                                        // initial x size
                400,                                                        // initial y size
                NULL,                       // parent window handle
                NULL,                       // window menu handle
                hInstance,                  // program instance handle
                NULL) ;                     // creation parameters
       
        ShowWindow (hwnd, iCmdShow) ;
        UpdateWindow (hwnd) ;
       
        while (GetMessage (&msg, NULL, 0, 0))
        {
                TranslateMessage (&msg) ;
                DispatchMessage (&msg) ;
        }
        return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HDC hdc ;
        PAINTSTRUCT ps ;
        static int cxClient, cyClient ;
        HBRUSH hBrush ;
        int i ;
        POINT apt[NUM],
                leftHand[] = {
                                           cxClient / 2 - 60, cyClient / 2 - 20,
                                           cxClient / 2 - 100, cyClient / 2 + 10,
                                           cxClient / 2 - 100, cyClient / 2 + 30,
                                           cxClient / 2 - 60, cyClient / 2 + 10
                                        },
                rightHand[] = {
                                                cxClient / 2 + 60, cyClient / 2 - 20,
                                                cxClient / 2 + 100, cyClient / 2 + 10,
                                                cxClient / 2 + 100, cyClient / 2 + 30,
                                                cxClient / 2 + 60, cyClient / 2 + 10
                } ;

        switch (message)
        {
        case WM_SIZE:
                cxClient = LOWORD (lParam) ;
                cyClient = HIWORD (lParam) + 120;
                return 0 ;

        case WM_PAINT:
                hdc = BeginPaint (hwnd, &ps) ;

                Ellipse (hdc, cxClient / 2 - 70, cyClient / 2 + 55, cxClient / 2, cyClient / 2 + 85) ;                        //脚
                Ellipse (hdc, cxClient / 2, cyClient / 2 + 55, cxClient / 2 + 70, cyClient / 2 + 85) ;

                hBrush = CreateSolidBrush (RGB (100, 150, 255)) ;
                SelectObject (hdc, hBrush) ;
               
//                Rectangle (hdc, cxClient / 2 - 60, cyClient / 2 - 60, cxClient / 2 +60, cyClient / 2 + 70);                //身体
                RoundRect (hdc, cxClient / 2 - 60, cyClient / 2 - 60, cxClient / 2 + 60, cyClient / 2 + 70, 50, 20);

                DeleteObject (hBrush) ;

                hBrush = GetStockObject (WHITE_BRUSH) ;
                SelectObject (hdc, hBrush) ;

                Ellipse (hdc, cxClient / 2 - 50, cyClient / 2 - 50, cxClient / 2 + 50, cyClient / 2 + 50) ;                //肚子部分
               
                hBrush = CreateSolidBrush (RGB (100, 150, 255)) ;
                SelectObject (hdc, hBrush) ;

                Ellipse (hdc, cxClient / 2 - 100, cyClient / 2 - 220, cxClient / 2 +100, cyClient / 2 - 20) ;        //头部

                DeleteObject (hBrush) ;
               
                hBrush = GetStockObject (WHITE_BRUSH) ;
                SelectObject (hdc, hBrush) ;

                Ellipse (hdc, cxClient / 2 - 85, cyClient / 2 - 170, cxClient / 2 + 85, cyClient / 2 - 20) ;        //脸部
                Ellipse (hdc, cxClient / 2 - 40, cyClient / 2 - 190, cxClient / 2, cyClient / 2 - 140 ) ;                //眼眶左
                Ellipse (hdc, cxClient / 2, cyClient / 2 - 190, cxClient / 2 + 40, cyClient /2 - 140) ;                        //眼眶右

                hBrush = GetStockObject (BLACK_BRUSH) ;
                SelectObject (hdc, hBrush) ;

                Ellipse (hdc, cxClient / 2 - 15, cyClient / 2 - 155, cxClient / 2 -10, cyClient / 2 - 150) ;        //眼睛左
                Ellipse (hdc, cxClient / 2 + 10, cyClient / 2 - 155, cxClient / 2 + 15, cyClient / 2 -150) ;        //眼睛右
               
                DeleteObject (hBrush) ;

                hBrush = CreateSolidBrush (RGB (255, 0, 0)) ;
                SelectObject (hdc, hBrush) ;

                Ellipse (hdc, cxClient / 2 - 10, cyClient / 2 - 150, cxClient / 2 +10, cyClient / 2 -130) ;                //鼻子

                MoveToEx (hdc, cxClient / 2, cyClient / 2 -130, NULL) ;
                LineTo (hdc, cxClient / 2, cyClient / 2 - 60) ;

                MoveToEx (hdc, cxClient / 2 - 40, cyClient / 2 - 75, NULL);                                        //嘴
                for (i = 0; i < NUM / 2; i++)
                {
                        apt[i].x = cxClient / 2 - 40 + i * 160 / NUM ;
                        apt[i].y = cyClient / 2 - 75 +(int) (30 * sin (TWOPI * i / NUM)) / 2 ;
                        LineTo(hdc, apt[i].x, apt[i].y) ;
                }
               
                MoveToEx (hdc, cxClient / 2 - 60, cyClient / 2 - 140, NULL) ;                                //胡须
                LineTo (hdc, cxClient / 2 - 20, cyClient / 2 - 120) ;

                MoveToEx (hdc, cxClient / 2 - 60, cyClient / 2 - 110, NULL) ;
                LineTo (hdc, cxClient / 2 - 20, cyClient / 2 - 110) ;

                MoveToEx (hdc, cxClient / 2 - 60, cyClient / 2 - 80, NULL);
                LineTo (hdc, cxClient / 2 - 20, cyClient / 2 - 100) ;

                MoveToEx (hdc, cxClient / 2 + 60, cyClient / 2 -140, NULL) ;
                LineTo (hdc, cxClient / 2 + 20, cyClient / 2 - 120) ;

                MoveToEx (hdc, cxClient / 2 + 60, cyClient / 2 - 110, NULL) ;
                LineTo (hdc, cxClient / 2 +20, cyClient / 2 - 110) ;

                MoveToEx (hdc, cxClient / 2 +60, cyClient / 2 - 80, NULL) ;
                LineTo (hdc, cxClient / 2 + 20, cyClient / 2 - 100) ;

                hBrush = GetStockObject (WHITE_BRUSH) ;                                                                                //口袋
                SelectObject (hdc, hBrush) ;

                Chord (hdc, cxClient / 2 - 40, cyClient / 2 - 40, cxClient / 2 + 40, cyClient / 2 +40,
                        cxClient / 2 - 40, cyClient / 2 + 10, cxClient / 2 +40, cyClient / 2 + 10) ;

               

                hBrush = CreateSolidBrush (RGB (255, 0, 0));                                                                //脖子上的套圈
                SelectObject (hdc, hBrush) ;

                RoundRect (hdc, cxClient / 2 - 70, cyClient / 2 - 40, cxClient / 2 + 70, cyClient / 2 - 20, 20, 20);

                DeleteObject (hBrush) ;

                hBrush = CreateSolidBrush (RGB (100, 150, 255)) ;                                                        //手臂
                SelectObject (hdc, hBrush) ;

                SetPolyFillMode (hdc, WINDING) ;
                Polygon (hdc, leftHand, 4) ;

                SetPolyFillMode (hdc, WINDING) ;
                Polygon (hdc, rightHand, 4) ;

                DeleteObject (hBrush) ;

                hBrush = GetStockObject (WHITE_BRUSH) ;                                                                                //手
                SelectObject (hdc, hBrush) ;
               
                Ellipse (hdc, cxClient / 2 - 115, cyClient / 2 + 5, cxClient / 2 - 85, cyClient / 2 + 35) ;
                Ellipse (hdc, cxClient / 2 + 115, cyClient / 2 + 5, cxClient / 2 + 85, cyClient / 2 + 35) ;

                hBrush = CreateSolidBrush (RGB (250, 255, 150)) ;                                                        //铃铛
                SelectObject (hdc, hBrush) ;
               
                Ellipse (hdc, cxClient / 2 - 10, cyClient / 2 - 35, cxClient / 2 + 10, cyClient / 2 - 15) ;

                DeleteObject (hBrush) ;

                hBrush = GetStockObject (BLACK_BRUSH) ;
                SelectObject (hdc, hBrush) ;

                Ellipse (hdc, cxClient / 2 - 4, cyClient / 2 - 29, cxClient / 2 + 4, cyClient / 2 - 21) ;

                MoveToEx (hdc, cxClient / 2, cyClient / 2 - 25, NULL) ;
                LineTo (hdc, cxClient / 2, cyClient / 2 - 15) ;

                EndPaint (hwnd, &ps) ;
                return 0 ;

        case WM_DESTROY:
                PostQuitMessage (0) ;
                return 0 ;

        }
        return DefWindowProc (hwnd, message, wParam, lParam) ;
}

看雪侠者千人榜,看看你上榜了吗?

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (47)
雪    币: 96
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
yiruirui 活跃值 1 2011-8-11 20:58
2
0
不错,嘿嘿,敢问楼主右上角的最大最小关闭安全你是贴图实现的?我看不是标准的按钮啊。。。。
雪    币: 43
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
baoss 活跃值 2011-8-11 20:58
3
0
挺有意思的。不错,支持一下。
雪    币: 38
活跃值: 活跃值 (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
morphling 活跃值 1 2011-8-11 21:03
4
0
那一个是我桌面主题的原因。
雪    币: 27
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mszjk 活跃值 2011-8-11 21:43
5
0
哈哈很有意思....有耐力...
雪    币: 121
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shuizhilan 活跃值 2011-8-11 22:20
6
0
有毅力,GDI这部分我看了看就略过了,关于窗口重绘那几个消息函数还是模模糊糊。
雪    币: 793
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
happymhx 活跃值 2011-8-12 08:04
8
0
楼主有想法 很好
雪    币: 232
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ylhhch 活跃值 2011-8-13 21:19
9
0
呵呵,不错,我都不会画图的,汗,
雪    币: 321
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pandaforum 活跃值 2011-8-15 19:13
10
0
呵呵 好玩。。。
雪    币: 38
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jptiancai 活跃值 2011-8-15 19:40
11
0
以前看过用C语言话太极图、玫瑰花的  ,、
  现在又开眼界了,顶!!
雪    币: 78
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ronging 活跃值 2011-8-15 21:34
12
0
good idea, i learned this book before but then i didn't have this idea to draw an interesting figure by using GDI.
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-8-15 22:16
13
0
我插,厉害,学习了,Windows使用的最烂的就是画画了.谢谢你
雪    币: 203
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
snickoow 活跃值 2011-8-15 22:45
14
0
学了C,但却又没学C,教育的悲哀。
个人努力最重要。
雪    币: 1510
活跃值: 活跃值 (58)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
rrrfff 活跃值 2011-8-16 11:43
15
0
哈哈,用笔也不见得画的出来
雪    币: 0
活跃值: 活跃值 (21)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
tihty 活跃值 2 2011-8-16 12:52
16
0
很好玩 :)
雪    币: 331
活跃值: 活跃值 (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
高军 活跃值 2011-8-16 12:55
17
0
楼主厉害!!!
雪    币: 1038
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guoye 活跃值 2011-8-16 14:19
18
0
强。。。。。。
雪    币: 273
活跃值: 活跃值 (18)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
代码疯子 活跃值 3 2011-8-16 19:35
19
0
非常赞啊,不知道楼主算这些坐标点算了多久啊
雪    币: 78
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
风的独白 活跃值 2011-8-16 19:38
20
0
楼主厉害!!!!佩服!!
雪    币: 38
活跃值: 活跃值 (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
morphling 活跃值 1 2011-8-16 21:29
21
0
一共写了一下午,坐标就是估计的……没去好好算,感觉差不多就写上去了……
雪    币: 47
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rufeifei 活跃值 2011-8-16 21:42
22
0
类似汤姆猫么
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
losable 活跃值 2011-8-16 23:14
23
0
下载来学习,对GDI不太熟悉,多谢了!
雪    币: 161
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
地精锁匠 活跃值 2011-8-17 09:15
24
0
有创意!我还是自己研究下!GDI我很在行的!哈哈
雪    币: 1660
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
流浪の猫 活跃值 2011-8-17 11:21
25
0
最头疼画画,坐标总是算不好,头疼死了。
游客
登录 | 注册 方可回帖
返回