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.pswp.cn/news/253503.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253503.shtml
英文地址,請注明出處:http://en.pswp.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…

????YAFFS2文件系統在嵌入式LINUX系統中的應用

YAFFS2文件系統在嵌入式LINUX系統中的應用 2011-03-31 19:59 181人閱讀 評論(0) 收藏 舉報 1&#xff0e;文件系統簡述 隨著32位CPU價格不斷下跌&#xff0c;片上存儲設備的容量相比越來越大&#xff0c;越來越多的嵌入式系統開始應用各種嵌入式操作系統。一般在嵌入式領域&am…

【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分析的最小單…

NAND FLASH ECC

NAND需要ECC以確保數據完整性。NAND閃存的每一個頁面上都包括額外的存儲空間&#xff0c;它就是64個字節的空閑區(每512字節的扇區有16字節)。該區能存儲ECC代碼及其它像磨損評級或邏輯到物理塊映射之類的信息。ECC能在硬件或軟件中執行&#xff0c;但是&#xff0c;硬件執行有…

快速上手SpyGlass——CDC檢查

隨著技術的發展&#xff0c;數字電路的集成度越來越高&#xff0c;設計也越來越復雜。很少有系統會只工作在同一個時鐘頻率。一個系統中往往會存在多個時鐘&#xff0c;這些時鐘之間有可能是同步的&#xff0c;也有可能是異步的。如果一個系統中&#xff0c;異步時鐘之間存在信…

laravel session redis 設置

Laravel 在使用 Redis 作為 Session 驅動之前&#xff0c; 需要通過 Composer 安裝 predis/predis 擴展包 (~1.0)。 當然也可以用原生自帶的&#xff0c;具體使用見 https://laravel-china.org/docs/laravel/5.6/redis/1402#phpredis 操作即可。 然后在database 配置文件中配置…

數字后端——低功耗單元庫

在之前的文章中&#xff0c;介紹了低功耗設計物理實施的方案&#xff1a; 數字后端——低功耗設計物理實施_滄海一升的博客-CSDN博客_低功耗設計低功耗設計方案所涉及到的物理實施相關內容https://blog.csdn.net/qq_21842097/article/details/119918312 為了實現例如門…

【CUDA開發】CUDA面內存拷貝用法總結

【CUDA開發】CUDA面內存拷貝用法總結 標簽&#xff08;空格分隔&#xff09;&#xff1a; 【CUDA開發】 主要是在調試CUDA硬解碼并用D3D9或者D3D11顯示的時候遇到了一些代碼&#xff0c;如下所示&#xff1a; CUdeviceptr g_pRgba 0; CUDA_MEMCPY2D memcpy2D { 0 }; memcp…

PerfMon常用計數器

摘要: 故事來源于《sql server2012 深入解析和性能分析》 1.重要的PerfMon CPU計數器 計數器查看內容發生問題的條件Processor%Processor TimeCPU為生產環境的請求提供服務消耗的時間占總CPU時間的百分比>80%Processor%Privilege Time  CPU為內核模式請求提供服務消耗的時…

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;由于未開…