win32框架,GDI图形编程写一个HelloWorld游戏_c语言

1.如图,实现功能:

  • Hello World!字符串跟随鼠标移动
  • 鼠标左击Hello World!颜色为红色
  • 鼠标右击Hello World!颜色为蓝色

鼠标滚轮滚动改变Hello World!颜色的RGB中的G值

2.实现工具:

  • vs2013

3.实现步骤:

 新建一个win32项目

如图,看到HelloWorldGame.cpp中

_tWinMain()的函数是程序入口函数,

WndProc()是处理主窗口的所有消息,

About()是显示关于信息

这样就搭建好了win32框架

接下来开始使用GDI图形编程

 

  在WndProc函数中找到case WM_PAINT,在注释中可以看出,WM_PAINT表示绘制消息,我们就是在此

进行绘制操作,我们加入以下代码

TextOut(hdc,0,0,L"Hello World!",12);

/*

  参数解释:

hdc 待输出的设备

0 坐标x

0 坐标y

L"Hello World!"  L表示将ANSI字符转换为unicode 以便支持中文,Hello World!表示要打印的字符串

12 表示要输出的字符数

*/

F5运行

 效果如图

 

好,接下来我们来添加颜色

 

在变量声明区域加入以下代码

int r = 125;
int g = 125;
int b = 125;
COLORREF color = RGB(r, g, b);

//定义一个颜色索引color

并在TextOut函数前加入

SetTextColor(hdc, color);//设置文本的颜色

F5运行

如图

 

好的继续,我们来增加一些互动性,添加更多的消息处理

在WndProc函数中

添加以下代码

case WM_LBUTTONDOWN://鼠标左击消息
color = RGB(255, 0, 0);
break;
case WM_RBUTTONDOWN://鼠标右击消息
color = RGB(0, 0, 255);
break;

F5运行一下看看,哈哈O(∩_∩)O哈!是不是发现没效果!

对!没效果是对的,为什么呢?

因为没有及时发出重新绘制消息

case WM_LBUTTONDOWN://鼠标左击消息
color = RGB(255, 0, 0);
InvalidateRect(hWnd, NULL, TRUE);
break;
case WM_RBUTTONDOWN://鼠标右击消息
color = RGB(0, 0, 255);
InvalidateRect(hWnd, NULL, TRUE);

这样就行了

/*

InvalidateRect参数

hWnd 窗口句柄

NULL 设置矩形

TRUE 设置重画

*/

F5运行

好的,我们实现了鼠标左右击颜色变化

 

接下来,我们加入鼠标移动消息处理,让Hello World!跟着鼠标移动

首先在声明区声明

WCHAR str[64];
int x = 200, y = 150;

然后在WndProc中加入

case WM_MOUSEMOVE:
x = LOWORD(lParam);//得到x坐标
y = HIWORD(lParam);//得到y坐标
InvalidateRect(hWnd, NULL, TRUE);//发出重绘消息
break;

F5运行

 

好的,接下来添加鼠标滚轮消息

case WM_MOUSEWHEEL:
//得到鼠标滚轮的参数
int zDelta = (short)HIWORD(wParam);
if (zDelta > 0) //正值向前
{
if (g<255)
g += 1;

}
else //负值向后
{
if (g>0)
g--;
}
color = RGB(0, g, 122);
InvalidateRect(hWnd, NULL, TRUE);
break;

 编译运行试试,你发现了什么,haha,编译不同过

因为在case 中定义变量需要用括号把整个部分包含起来才行

case WM_MOUSEWHEEL:
{
//得到鼠标滚轮的参数
int zDelta = (short)HIWORD(wParam);
if (zDelta > 0) //正值向前
{
if (g<255)
g += 1;

}
else //负值向后
{
if (g>0)
g--;
}
color = RGB(0, g, 122);
InvalidateRect(hWnd, NULL, TRUE);
}
break;

我们再添加显示x,y,r,g,b值

定义

int r = 125;
int g = 125;
int b = 125;
COLORREF color = RGB(r, g, b);
WCHAR infor[64];
int x = 200, y = 150;

在case WM_PAINT:中

swprintf_s(infor, L"r:%d,g:%d,b:%d\nx=%d,y=%d",r,g,b, x, y);//格式化字符串
TextOut(hdc, x, y - 100, infor, wcslen(infor));

F5运行一下

就得到了实现的效果

下面给出 HelloWorldGame.cpp的代码

  1 // HelloWorldGame.cpp : Defines the entry point for the application.
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "HelloWorldGame.h"
  6 
  7 #define MAX_LOADSTRING 100
  8 
  9 // Global Variables:
 10 HINSTANCE hInst;                                // current instance
 11 TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text
 12 TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
 13 
 14 //
 15 int r = 125;
 16 int g = 125;
 17 int b = 125;
 18 COLORREF color = RGB(r, g, b);
 19 WCHAR infor[64];
 20 int x = 200, y = 150;
 21 //
 22 // Forward declarations of functions included in this code module:
 23 ATOM                MyRegisterClass(HINSTANCE hInstance);
 24 BOOL                InitInstance(HINSTANCE, int);
 25 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
 26 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 27 
 28 int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
 29     _In_opt_ HINSTANCE hPrevInstance,
 30     _In_ LPTSTR    lpCmdLine,
 31     _In_ int       nCmdShow)
 32 {
 33     UNREFERENCED_PARAMETER(hPrevInstance);
 34     UNREFERENCED_PARAMETER(lpCmdLine);
 35 
 36     // TODO: Place code here.
 37     MSG msg;
 38     HACCEL hAccelTable;
 39 
 40     // Initialize global strings
 41     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
 42     LoadString(hInstance, IDC_HELLOWORLDGAME, szWindowClass, MAX_LOADSTRING);
 43     MyRegisterClass(hInstance);
 44 
 45     // Perform application initialization:
 46     if (!InitInstance(hInstance, nCmdShow))
 47     {
 48         return FALSE;
 49     }
 50 
 51     hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_HELLOWORLDGAME));
 52 
 53     // Main message loop:
 54     while (GetMessage(&msg, NULL, 0, 0))
 55     {
 56         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
 57         {
 58             TranslateMessage(&msg);
 59             DispatchMessage(&msg);
 60         }
 61     }
 62 
 63     return (int)msg.wParam;
 64 }
 65 
 66 
 67 
 68 //
 69 //  FUNCTION: MyRegisterClass()
 70 //
 71 //  PURPOSE: Registers the window class.
 72 //
 73 ATOM MyRegisterClass(HINSTANCE hInstance)
 74 {
 75     WNDCLASSEX wcex;
 76 
 77     wcex.cbSize = sizeof(WNDCLASSEX);
 78 
 79     wcex.style = CS_HREDRAW | CS_VREDRAW;
 80     wcex.lpfnWndProc = WndProc;
 81     wcex.cbClsExtra = 0;
 82     wcex.cbWndExtra = 0;
 83     wcex.hInstance = hInstance;
 84     wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_HELLOWORLDGAME));
 85     wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
 86     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
 87     wcex.lpszMenuName = MAKEINTRESOURCE(IDC_HELLOWORLDGAME);
 88     wcex.lpszClassName = szWindowClass;
 89     wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 90 
 91     return RegisterClassEx(&wcex);
 92 }
 93 
 94 //
 95 //   FUNCTION: InitInstance(HINSTANCE, int)
 96 //
 97 //   PURPOSE: Saves instance handle and creates main window
 98 //
 99 //   COMMENTS:
100 //
101 //        In this function, we save the instance handle in a global variable and
102 //        create and display the main program window.
103 //
104 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
105 {
106     HWND hWnd;
107 
108     hInst = hInstance; // Store instance handle in our global variable
109 
110     hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
111         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
112 
113     if (!hWnd)
114     {
115         return FALSE;
116     }
117 
118     ShowWindow(hWnd, nCmdShow);
119     UpdateWindow(hWnd);
120 
121     return TRUE;
122 }
123 
124 //
125 //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
126 //
127 //  PURPOSE:  Processes messages for the main window.
128 //
129 //  WM_COMMAND    - process the application menu
130 //  WM_PAINT    - Paint the main window
131 //  WM_DESTROY    - post a quit message and return
132 //
133 //
134 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
135 {
136     int wmId, wmEvent;
137     PAINTSTRUCT ps;
138     HDC hdc;
139 
140     switch (message)
141     {
142     case WM_COMMAND:
143         wmId = LOWORD(wParam);
144         wmEvent = HIWORD(wParam);
145         // Parse the menu selections:
146         switch (wmId)
147         {
148         case IDM_ABOUT:
149             DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
150             break;
151         case IDM_EXIT:
152             DestroyWindow(hWnd);
153             break;
154         default:
155             return DefWindowProc(hWnd, message, wParam, lParam);
156         }
157         break;
158     case WM_LBUTTONDOWN://鼠标左击消息
159         color = RGB(255, 0, 0);
160         InvalidateRect(hWnd, NULL, TRUE);
161         break;
162     case WM_RBUTTONDOWN://鼠标右击消息
163         color = RGB(0, 0, 255);
164         InvalidateRect(hWnd, NULL, TRUE);
165         break;
166     case WM_MOUSEMOVE:
167         x = LOWORD(lParam);//得到x坐标
168         y = HIWORD(lParam);//得到y坐标
169         InvalidateRect(hWnd, NULL, TRUE);//发出重绘消息
170         break;
171     case WM_MOUSEWHEEL:
172     {
173         //得到鼠标滚轮的参数
174         int zDelta = (short)HIWORD(wParam);
175         if (zDelta > 0) //正值向前
176         {
177             if (g<255)
178                 g += 1;
179 
180         }
181         else //负值向后
182         {
183             if (g>0)
184                 g--;
185         }
186         color = RGB(0, g, 122);
187         InvalidateRect(hWnd, NULL, TRUE);
188     }
189         break;
190     
191     case WM_PAINT:
192         hdc = BeginPaint(hWnd, &ps);
193         // TODO: Add any drawing code here...
194         SetTextColor(hdc, color);
195         TextOut(hdc, x, y, L"Hello World!", 12);
196         swprintf_s(infor, L"r:%d,g:%d,b:%d\nx=%d,y=%d",r,g,b, x, y);//格式化字符串
197         TextOut(hdc, x, y - 100, infor, wcslen(infor));
198         EndPaint(hWnd, &ps);
199         break;
200     case WM_DESTROY:
201         PostQuitMessage(0);
202         break;
203     default:
204         return DefWindowProc(hWnd, message, wParam, lParam);
205     }
206     return 0;
207 }
208 
209 // Message handler for about box.
210 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
211 {
212     UNREFERENCED_PARAMETER(lParam);
213     switch (message)
214     {
215     case WM_INITDIALOG:
216         return (INT_PTR)TRUE;
217 
218     case WM_COMMAND:
219         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
220         {
221             EndDialog(hDlg, LOWORD(wParam));
222             return (INT_PTR)TRUE;
223         }
224         break;
225     }
226     return (INT_PTR)FALSE;
227 }
HelloWorldGame.cpp

 

转载于:https://www.cnblogs.com/ncgds/p/6288885.html

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

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

相关文章

全景图像拼接——图像融合

图像融合技术就是将配准过后的图像融合成一幅宽视角、大场景的图像。但由于图像采集过程中各种因素的影响,例如光照、角度、距离等,从而导致图像间的光照不均匀、颜色上不连续。 经过配准以后,参考图像和输入图像已经在同一个坐标系下,如果只是取某一幅图像的信息或者简单地…

极详细的ECC讲解 -OOB与ECC

http://blog.csdn.net/dongzhichen/article/details/8249228 详细的ECC讲解 -OOB与ECC 在网络编程中 OOB&#xff08;out of band&#xff09;带外数据 在MTD设备中 OOB 如下所示&#xff1a; http://www.cnblogs.com/bcxx_qin/archive/2009/06/11/1501271.html 极详细的ECC…

前端进阶(8) - 前端开发需要了解的工具集合:webpack, eslint, prettier, ...

前端开发需要了解的工具集合&#xff1a;webpack, eslint, prettier, ... 前端开发需要了解的一些工具&#xff0c;这些工具能够帮助你在项目开发中事半功倍。 1. nrm: npm registry 管理器 registry: npm 远程仓库的地址。 由于众所周知的原因&#xff0c;npm 官方仓库在国内特…

CMOS图像传感器——TOF 图像传感器

一、3D成像技术概述 图像传感器一直以来都是人类研究的热点。但随着当代科学技术发展, 人类对于传统的 2D 图像传感器的要求越来高,不仅期望着更高分辨率,更快速度,更大的动态范围,人类加希望能够获得物体深信息,但是 2D 成 像技术现在已经不能满足人类的需求,所以应运…

AndroidStudio创建jinLibs文件夹

在文件中的buildTypes节点下添加 sourceSets.main { jniLibs.srcDir libs } 如图 转载于:https://www.cnblogs.com/kim-liu/p/7479360.html

内嵌Tomcat的Connector对象的静态代码块

在排查问题的过程中发现Connector对象有一个静态代码块&#xff1a; static {replacements.put("acceptCount", "backlog");replacements.put("connectionLinger", "soLinger");replacements.put("connectionTimeout", &quo…

【Python爬虫学习笔记1】网络协议及请求基础

http协议与https协议 HTTP协议(全称为HyperText Transfer Protocol&#xff0c;超文本传输协议)&#xff0c;是发布和接收HTML页面的方法&#xff0c;其服务端口号为80。 HTTPS协议为HTTP协议的加密版本&#xff0c;其在HTTP下加入了SSL层&#xff0c;服务端口号为443。 URL结构…

快速上手SpyGlass——基本流程

SpyGlass&#xff0c;这是一个很强大的RTL验证级工具。它不仅仅能检查sdc的错误&#xff0c;还能做以下各种检查&#xff1a;Low Power, DFT&#xff0c;CDC&#xff08;Cross Domain Check&#xff09;。 一、基本概念 1、方法学相关 Rule: 是SpyGlass 进行RTL分析的最小单…

快速上手SpyGlass——CDC检查

随着技术的发展&#xff0c;数字电路的集成度越来越高&#xff0c;设计也越来越复杂。很少有系统会只工作在同一个时钟频率。一个系统中往往会存在多个时钟&#xff0c;这些时钟之间有可能是同步的&#xff0c;也有可能是异步的。如果一个系统中&#xff0c;异步时钟之间存在信…

数字后端——低功耗单元库

在之前的文章中&#xff0c;介绍了低功耗设计物理实施的方案&#xff1a; 数字后端——低功耗设计物理实施_沧海一升的博客-CSDN博客_低功耗设计低功耗设计方案所涉及到的物理实施相关内容https://blog.csdn.net/qq_21842097/article/details/119918312 为了实现例如门…

NandFlash详述

1. 硬件特性&#xff1a; 【Flash的硬件实现机制】 Flash全名叫做Flash Memory&#xff0c;属于非易失性存储设备(Non-volatile Memory Device)&#xff0c;与此相对应的是易失性存储设备(Volatile Memory Device)。这类设备&#xff0c;除了Flash&#xff0c;还有其他比较常见…

史上最全的MySQL高性能优化实战总结!

1.1 前言 MySQL对于很多Linux从业者而言&#xff0c;是一个非常棘手的问题&#xff0c;多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行MySQL的优化之前必须要了解的就是MySQL的查询过程&#xff0c;很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器…

低功耗设计——基于UPF进行设计

UPF&#xff0c; 统一电源格式UPF(Unified Power Format)是新思(Synopsys)公司通用的电源格式&#xff0c;是一组标准的类Tcl 语言的集合&#xff0c;用来描述芯片设计中的低功耗意图&#xff08;Low-Power Design Intent&#xff09;。 使用UPF 的语言&#xff0c;可以描述供电…

用公众号获取 任意公众号文章列表 软件还是免费

用公众号获取 任意公众号文章列表 软件还是免费还不快点下载 下载 地址 https://pan.baidu.com/s/1jI44Wjs转载于:https://www.cnblogs.com/wx85437898/p/7488590.html

CentOS7时间设置问题

本地安装一个VMWare player虚拟机客户端&#xff0c;并安装了Linux CentOS7 Basic Web Server系统&#xff0c;时区在安装时已经选择了Asia/Shanghai,但是安装完成后&#xff0c;时间和当前外部的时间不一致&#xff0c;如下图 图一 图二 图三 后经搜索发现&#xff0c;由于未开…

低功耗设计——功耗估算

根据在功耗分析的过程中是否有输入向量的提供&#xff0c;功耗估算方法可以分为仿真的方法&#xff08;Simulative&#xff09;和非仿真的方法&#xff08;Non-simulative&#xff09;&#xff1a; 仿真的方法是根据用户所提供的大量输入向量来对电路进行模拟&#xff0c;利用…

Deep Learning(深度学习)学习笔记整理系列三

Deep Learning&#xff08;深度学习&#xff09;学习笔记整理系列 声明&#xff1a; 1&#xff09;该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的。具体引用的资料请看参考文献。具体的版本声明也参考原文献。 2&#xff09;本文仅供学术交流&…

Conformal ECO 流程介绍

之前听说过一句话&#xff0c;没有修过ECO的人生是不完整的。最近就给我整得再次完整了。。。。。。 最近赶项目&#xff0c;RTL freeze之后&#xff0c;后仿发现出了bug&#xff08;还好拦下来了&#xff0c;不然头更大&#xff09;&#xff0c;于是做了一次function ECO&…

Zabbix discoverer processes more than 75% busy

原文发表于cu&#xff1a;2016-06-22 Zabbix discoverer processes more than 75% busy原因及处理。 一&#xff0e;现象 配置了discovery任务后&#xff0c;zabbix dashboard 告警如下&#xff1a; Zabbix discoverer processes more than 75% busy 二&#xff0e;原因 1. 配置…

图像紫边消除(depurple)

图像紫边广泛存在于目前的手机摄像头、数码相机、监控摄像头等数字成像系统所得图像中,当我们使用这些设备在逆光、大光圈等条件下拍摄时,所得图像的局部区域,特别是高反差区域(亮暗对比反差很大的图像区域,比如天空、灯管与物体相接的边缘)会比较容易观察到紫边,解决图…