win 32sdk编写贪吃蛇(附源代码)

[Win32SDK基本]开启UI系统风格 最近太忙了,马上就期末考试了,本来想说说模态窗口来的,但是稿子没写完,所以今天先说说系统风格: 先看看我之前做的一系列程序的运行图片: 开启系统风格之后: 可以发现按钮可以文字图片共存了,同时界面漂亮了很多,这是如何实现的呢? 其实系统风格就是使用win32的控件版本6.0 方法一:直接在cpp里头文件include下面加上这么一行即可: #pragma comment 阅读详情


       某天晚上闲着无聊就写了个贪吃蛇链表,然后第二天就开始就主程序了,很快就写完了,所以大家如果有好的思路,不妨也动动手嘛。好记性不如烂笔头嘛。贪吃蛇的思路挺简单的,就是用一个链表来保存蛇的路线,不过这个链表是经过特殊构造的,主要思路就是把客户区分成若干个小方格子,然后链表会保存x和y坐标,这个算是最重要的了,其它的都挺简单的,在这里就不赘述了。

打开vc6,然后新建一个win32空项目就可以了。

 

这个是运行截图

这个是snake_list.h

 

#ifndef SNAKE_LIST_H
#define SNAKE_LIST_H

#define CLIENT_WIDTH	600
#define CLIENT_HEIGHT	600
#define ARRAY_COUNT		1600
#define ARRAY_WIDTH		40
#define ARRAY_HEIGHT	40
#define SANKE_UNIT		15
#define SNAKE_NUM		5

//定制版贪吃蛇链表
typedef struct Snake_List{
	int x;//x坐标
	int y;//y坐标
	struct Snake_List* next;
}snake_list;

extern void init_snake(snake_list** head, char* snake_array);//初始化蛇
extern int add_head_hit(const int* x, const int* y, snake_list** head, char* snake_array);//撞上蛇
extern int add_head_no_hit(const int* x, const int* y, snake_list** head, char* snake_array);//没撞上蛇
extern void destory(snake_list* head);//清空蛇
extern void get_head_info(snake_list* head, int *x, int *y);//获取蛇头

#endif


这个是snake_list.c

#include "snake_list.h"
#include <stdio.h>
#include <stdlib.h>

static snake_list* snake_tail;//蛇伪尾巴
static void set_snake_tail(snake_list* head);//设置新的蛇伪尾巴

void init_snake(snake_list** head, char* snake_array)
{
	snake_list *p, *q;
	int i, max_num;

	max_num = 18 + SNAKE_NUM;
	for (i = 18; i < max_num; i++) {//默认蛇长5个单位 坐标从20*ARRAY_WIDTH 13开始
		p = (snake_list* )malloc(sizeof(snake_list));
		if (i == 18) {
			*head = p;
		} else {
			q->next = p;
			if (i == max_num - 2) {
				snake_tail = p;//设置伪尾巴
			}
		}
		p->x = 30;
		p->y = i;
		snake_array[p->x*ARRAY_WIDTH+p->y] = 1;//更改蛇数组的位
		q = p;
	}
	p->next = NULL;
}

//x, y是撞击的位置坐标,撞击后头部改变,尾巴不变
int add_head_hit(const int* x, const int* y, snake_list** head, char* snake_array)
{
	snake_list *p, *q;
	p = (snake_list*)malloc(sizeof(snake_list));
	q = *head;
	*head = p;
	(*head)->x = *x;
	(*head)->y = *y;
	(*head)->next = q;
	snake_array[*x*ARRAY_WIDTH+*y] = 1;

	return 1;
}
//x, y是前进的位置坐标,前进后头部改变,尾巴改变
int add_head_no_hit(const int* x, const int* y, snake_list** head, char* snake_array)
{
	snake_list *p, *q;
	p = (snake_list*)malloc(sizeof(snake_list));
	q = *head;
	*head = p;
	(*head)->x = *x;
	(*head)->y = *y;
	(*head)->next = q;
	snake_array[*x*ARRAY_WIDTH+*y] = 1;
	p = snake_tail;//设置新的尾巴
	q = p->next;
	p->next = NULL;
	snake_array[q->x*ARRAY_WIDTH+q->y] = 0;
	free(q);
	set_snake_tail(*head); 
	return 1;
}

void destory(snake_list* head)
{
	snake_list *p, *q;

	p = head;
	while (p) {
		q = p->next;
		free (p);
		p = q;
	}
}

void get_head_info(snake_list* head, int *x, int *y)
{
	*x = head->x;
	*y = head->y;
}

static void set_snake_tail(snake_list* head)
{
	snake_list* temp;

	temp = head;
	while (temp->next->next) {//找到到第二个位置
		temp = temp->next;
	}
	snake_tail = temp;
}




 

这个是resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by resource.rc
//
#define IDB_BITMAP1                     101
#define IDI_ICON1                       102

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        103
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif


 

这个是snake.c

 

#include <windows.h>
#include <stdio.h>
#include <time.h>
#include "snake_list.h"
#include "resource.h"

#define bool  int
#define true  1
#define false 0
#define TIMERID 201314

static HINSTANCE ghInstance;
static UINT		 gDirection;
static RECT		 gClientRect;
static POINT	 gSnakeFood;//食物
static bool		 gStop;//是否暂停
static snake_list* gSnakeHead;//蛇头
static bool		   gGameStart;//游戏是否开始
static char		   gSnakeArray[ARRAY_HEIGHT*ARRAY_WIDTH];//保存蛇

的路径

void Init(HWND hwnd);//初始化一些变量
void HandleMove(HWND hwnd, UINT keyCode);//处理上下左右键消息
void HandleQuit(HWND hwnd);//处理用户是否退出
void DrawSnake(HWND hwnd);//绘制蛇的身体
void GenerateFood();//随机产生食物
void AutoForward(HWND hwnd);//自动前进
LRESULT CALLBACK WinProc(HWND hwnd,UINT uMsg,WPARAM wpara,LPARAM lpara);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR 

lpCmdLine, int nShowCmd )
{
	WNDCLASS wndclass;
	MSG msg;
	HWND hwnd;
	RECT windowRect, clientRect;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
	wndclass.hCursor = LoadCursor(hInstance, IDC_UPARROW);//光标属性
	wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE

(IDI_ICON1));//图标
	wndclass.hInstance = hInstance;
	wndclass.lpfnWndProc = WinProc;
	wndclass.lpszClassName = "snake";
	wndclass.lpszMenuName = NULL;//无菜单
	wndclass.style = CS_HREDRAW | CS_VREDRAW;//窗口风格
	ghInstance = hInstance;
	
	//注册窗口
	RegisterClass(&wndclass);
	
	
	//创建窗口
	hwnd = CreateWindow("snake", "Snake-by-inconsolablev", 

WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX, 0, 0,
		CLIENT_WIDTH, CLIENT_HEIGHT, NULL, NULL, ghInstance, 

NULL);
	//调整客户区的大小
	GetWindowRect(hwnd,&windowRect);
	GetClientRect(hwnd,&clientRect);
	windowRect.right += CLIENT_WIDTH - clientRect.right + 

clientRect.left;
	windowRect.bottom += CLIENT_HEIGHT - clientRect.bottom + 

clientRect.top;
	MoveWindow(hwnd, (GetSystemMetrics(SM_CXSCREEN) - 

windowRect.right + windowRect.left) / 2, windowRect.top, 
		windowRect.right - windowRect.left, windowRect.bottom - 

windowRect.top, true);
	Init(hwnd);
	ShowWindow(hwnd, SW_SHOWNORMAL);
	UpdateWindow(hwnd);
	
	while (GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	return 0;
}

LRESULT CALLBACK WinProc(HWND hwnd,UINT uMsg,WPARAM wpara,LPARAM lpara)
{
	switch (uMsg)
	{
	case WM_KEYDOWN:
		if (wpara == VK_SPACE && gGameStart == false) {
			gGameStart = true;
			GenerateFood();
			SetTimer(hwnd, TIMERID, 150, NULL);
		} else if (wpara == VK_RETURN && gGameStart == true) 

{//Enter 暂停
			KillTimer(hwnd, TIMERID);
			gStop = true;
			InvalidateRect(hwnd, &gClientRect, false);
		} else if (wpara == VK_SPACE && gStop == true) {
			//继续游戏
			gStop = false;
			SetTimer(hwnd, TIMERID, 150, NULL);
		} else if (gGameStart == true && gStop == false) {
			HandleMove(hwnd, wpara);
		}
		break;
	case WM_TIMER:
		HandleMove(hwnd, gDirection);
		break;
	case WM_PAINT:
		DrawSnake(hwnd);
		break;
	case WM_CLOSE:
		if (IDYES == MessageBox(hwnd,"是否真的结

束?","snake",MB_YESNO))
		{
			KillTimer(hwnd, TIMERID);
			DestroyWindow(hwnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd,uMsg,wpara,lpara);
	}
	
	return (LRESULT)NULL;
}

void Init(HWND hwnd)
{
	gGameStart = false;
	gStop = false;
	gDirection = VK_LEFT;//默认左边
	memset(gSnakeArray, 0, ARRAY_HEIGHT*ARRAY_WIDTH);
	GetClientRect(hwnd, &gClientRect);
	init_snake(&gSnakeHead, gSnakeArray);
}

void HandleQuit(HWND hwnd)
{
	KillTimer(hwnd, TIMERID);
	destory(gSnakeHead);
	Init(hwnd);
	InvalidateRect(hwnd, &gClientRect, false);
}
void HandleMove(HWND hwnd, UINT keyCode)
{
	static POINT basePoint;
	char	temp;
	
	get_head_info(gSnakeHead, &basePoint.x, &basePoint.y);
	switch (keyCode){
	case VK_UP:
		if (basePoint.x != 0) {//没到达最顶端就可以继续
			basePoint.x--;
			temp = gSnakeArray

[basePoint.x*ARRAY_WIDTH+basePoint.y];
			if (temp == 0) {
				//无障碍物
				gDirection = VK_UP;
				add_head_no_hit(&basePoint.x, 

&basePoint.y, &gSnakeHead, gSnakeArray);
				InvalidateRect(hwnd, &gClientRect, 

false);
			} else if (temp == 2) {
				//碰到食物 吃掉
				gDirection = VK_UP;
				add_head_hit(&basePoint.x, &basePoint.y, 

&gSnakeHead, gSnakeArray);
				GenerateFood();
				InvalidateRect(hwnd, &gClientRect, 

false);
			} else if (temp == 1) {
				if (gDirection != VK_DOWN) {//蛇绕成一团 

而不是后退
					HandleQuit(hwnd);
				}
			}
		} else {
			HandleQuit(hwnd);
		}
		break;
	case VK_DOWN:
		if (basePoint.x != ARRAY_HEIGHT - 1) {//没到达最下端就可

以继续
			basePoint.x++;
			temp = gSnakeArray

[basePoint.x*ARRAY_WIDTH+basePoint.y];
			if (temp == 0) {
				//无障碍物
				gDirection = VK_DOWN;
				add_head_no_hit(&basePoint.x, 

&basePoint.y, &gSnakeHead, gSnakeArray);
				InvalidateRect(hwnd, &gClientRect, 

false);
			} else if (temp == 2) {
				//碰到食物 吃掉
				gDirection = VK_DOWN;
				add_head_hit(&basePoint.x, &basePoint.y, 

&gSnakeHead, gSnakeArray);
				GenerateFood();
				InvalidateRect(hwnd, &gClientRect, 

false);
			} else if (temp == 1) {
				if (gDirection != VK_UP) {//蛇绕成一团 而

不是后退
					HandleQuit(hwnd);
				}
			}
		} else {
			HandleQuit(hwnd);
		}
		break;
	case VK_LEFT:
		if (basePoint.y != 0) {//没到达最左端就可以继续
			basePoint.y--;
			temp = gSnakeArray

[basePoint.x*ARRAY_WIDTH+basePoint.y];
			if (temp == 0) {
				//无障碍物
				gDirection = VK_LEFT;
				add_head_no_hit(&basePoint.x, 

&basePoint.y, &gSnakeHead, gSnakeArray);
				InvalidateRect(hwnd, &gClientRect, 

false);
			} else if (temp == 2) {
				//碰到食物 吃掉
				gDirection = VK_LEFT;
				add_head_hit(&basePoint.x, &basePoint.y, 

&gSnakeHead, gSnakeArray);
				GenerateFood();
				InvalidateRect(hwnd, &gClientRect, 

false);
			} else if (temp == 1) {
				if (gDirection != VK_RIGHT) {//蛇绕成一团 

而不是后退
					HandleQuit(hwnd);
				}
			}
		} else {
			HandleQuit(hwnd);
		}
		break;
	case VK_RIGHT:
		if (basePoint.y != ARRAY_WIDTH - 1) {//没到达最右端就可以

继续
			basePoint.y++;
			temp = gSnakeArray

[basePoint.x*ARRAY_WIDTH+basePoint.y];
			if (temp == 0) {
				//无障碍物
				gDirection = VK_RIGHT;
				add_head_no_hit(&basePoint.x, 

&basePoint.y, &gSnakeHead, gSnakeArray);
				InvalidateRect(hwnd, &gClientRect, 

false);
			} else if (temp == 2) {
				//碰到食物 吃掉
				gDirection = VK_RIGHT;
				add_head_hit(&basePoint.x, &basePoint.y, 

&gSnakeHead, gSnakeArray);
				GenerateFood();
				InvalidateRect(hwnd, &gClientRect, 

false);
			} else if (temp == 1) {
				if (gDirection != VK_LEFT) {//蛇绕成一团 

而不是后退
					HandleQuit(hwnd);
				}
			}
		} else {
			HandleQuit(hwnd);
		}
		break;
	default:
		break;
	}
}

void GenerateFood()
{
	int i = 0, j = 0;
	static short int temp[ARRAY_COUNT];

	for (i = 0; i < ARRAY_COUNT; i++) {
		if (gSnakeArray[i] == 0) {
			temp[j++] = i;//保存是0的位置
		}
	}
	//然后在这些元素是0里面取一个就行了
	srand((unsigned)time(NULL));
	j = rand() % j; //随机获取一个是0的元素
	gSnakeFood.x = temp[j] / ARRAY_WIDTH;
	gSnakeFood.y = temp[j] % ARRAY_WIDTH;
	gSnakeArray[gSnakeFood.x*ARRAY_WIDTH+gSnakeFood.y] = 2;//食物标记
}
void DrawSnake(HWND hwnd)
{
	static HDC hMemDC, hDC;
	static HBRUSH  hBrush, hOldBrush;
	static HBITMAP hBitmap, hOldBitmap;
	static HFONT	hFont, hOldFont;
	static LOGFONT	logFont;
	POINT tempPoint;
	snake_list* temp;
	PAINTSTRUCT ps;
	static RECT	fontRect;
	char str[25];
	
	temp = gSnakeHead;
	hDC = BeginPaint(hwnd, &ps);
	hMemDC = CreateCompatibleDC(hDC);
	hBitmap = (HBITMAP)LoadBitmap(ghInstance, MAKEINTRESOURCE

(IDB_BITMAP1));
	hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);//保存旧的位

图
	hBrush = CreateSolidBrush(RGB(87, 66, 189));
	hOldBrush = (HBRUSH)SelectObject(hMemDC, hBrush);//保存旧的画刷
	SetBkMode(hMemDC, TRANSPARENT);
	while (temp) {//遍历整个蛇 绘制蛇身
		tempPoint.x = temp->y*SANKE_UNIT;//notify this place
		tempPoint.y = temp->x*SANKE_UNIT;
		Rectangle(hMemDC, tempPoint.x, tempPoint.y, 

tempPoint.x+SANKE_UNIT, tempPoint.y+SANKE_UNIT);
		temp = temp->next;
	}
	if (gGameStart == false) {//游戏未开始 写提示
		sprintf(str, "Press Space To Start!");
		SetTextColor(hMemDC, RGB(255, 0, 0));
		ZeroMemory(&logFont,   sizeof(LOGFONT));   
		logFont.lfCharSet = ANSI_CHARSET;   
		logFont.lfHeight = 30;      //设置字体的大小
		logFont.lfWidth	= 15;
		logFont.lfWeight = 10;
		hFont = CreateFontIndirect(&logFont);   
		fontRect.left = 150;
		fontRect.right = fontRect.left+400;
		fontRect.top = 100;
		fontRect.bottom = 400;
		hOldFont = (HFONT)SelectObject(hMemDC,hFont);//保存旧的的

字体
		DrawText(hMemDC, str, strlen(str), &fontRect, DT_BOTTOM);
	} else {
		if (gStop == true) {
			//暂停游戏
			sprintf(str, "Press Space to Continue!");
			SetTextColor(hMemDC, RGB(255, 0, 0));
			hFont = CreateFontIndirect(&logFont);   
			hOldFont = (HFONT)SelectObject(hMemDC,hFont);//保

存旧的的字体
			DrawText(hMemDC, str, strlen(str), &fontRect, 

DT_BOTTOM);
		} else {
			//继续游戏
			sprintf(str, "Press Enter to Stop!");
			SetTextColor(hMemDC, RGB(255, 0, 0));
			hFont = CreateFontIndirect(&logFont);   
			hOldFont = (HFONT)SelectObject(hMemDC,hFont);//保

存旧的的字体
			DrawText(hMemDC, str, strlen(str), &fontRect, 

DT_BOTTOM);
		}//绘制食物
		DeleteObject(hBrush);
		hBrush = CreateSolidBrush(RGB(55, 208, 47));
		hOldBrush = (HBRUSH)SelectObject(hMemDC, hBrush);
		tempPoint.x = gSnakeFood.y*SANKE_UNIT;//notify this place
		tempPoint.y = gSnakeFood.x*SANKE_UNIT;
		Rectangle(hMemDC, tempPoint.x, tempPoint.y, 

tempPoint.x+SANKE_UNIT, tempPoint.y+SANKE_UNIT);
	}
	BitBlt(hDC, 0, 0, gClientRect.right - gClientRect.left, 

gClientRect.bottom - gClientRect.top, hMemDC, 0, 0, SRCCOPY);
	SelectObject(hMemDC, hOldFont);//选回旧的
	SelectObject(hMemDC, hOldBitmap);
	SelectObject(hMemDC, hOldBrush);
	EndPaint(hwnd,&ps);
	DeleteDC(hMemDC);//释放资源
	DeleteDC(hDC);
	DeleteObject(hBitmap);
	DeleteObject(hFont);
	DeleteObject(hBrush);
}

就写到这里把,明天还得早起呢。

 

用Windows API 编写的简单贪吃蛇游戏 一、基础知识笔记           一种结构体,用于在控制台屏幕上定位一个字符的坐标。           应用程序中 的不同对象和同类中的不同的实例,增加了系统对引用对象的控制,句柄不是指针,但是功能类似指针。           SetConsoleCursorPosition(HANDLE Hout,COORD pos) ,定位光标的地址。           SetConso 阅读详情

相关推荐

贪吃蛇(Windows SDK)

图形用windows api绘制,逻辑思路在类Snake中, 用list存储蛇坐标.初学者可以参考一下.

WIN32 SDK界面编程

WIN32 SDK界面编程   在介绍win32 sdk界面编程,先需要了解win32 编程。熟悉win32编程之后,就可以轻松进行win32 界面编程。 一、什么是win32 编程 Win32编程,指的是用Window提供的API(Application Programming Interface)为Window编写应用程序。 之所以称之为Win32,是因为现在的Window都是32位的

zeusuperman1的专栏 6803

YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

《Windows32 SDK教程》01章 SDK入门

现在我们要学的是Windows32的编程,与DOS不同的是,实现的目标是一个具有你所需要的功能的“窗口”。这个“窗口”时时刻刻都在与操作系统之间,通过一个称之为“消息队列”的东西传送数据。因此处理好各种消息便成了Win32编程的核心。 SDK编程是相对于MFC来说的,也就是用C和C++来调用WindowsAPI,这API是操作系统的东西,其他语言(如VB)也可以调用。因此,以前也有人将这种编...

{丸の子} 342

智能客服系统知识库数据清洗

数据清洗(Data Cleaning)是确保智能客服知识库高效运行的重要环节,主要涉及。| 分类 & 标签优化 | 重新组织 FAQ,创建关键字索引 || 定期更新 | 结合用户反馈,每 1-3 个月优化 |才能提供更优质、正确的回答,提升客户满意度!、Zendesk、Intercom 等)中,: FAQ 或客服回答中可能存在。,会影响 AI 匹配的准确性。是一个持续优化的过程,

z1941563559的博客 2098

手把手教你用 Docker 构建自己的 CentOS 基础镜像

目录一、准备CentOS基础镜像二、撰写Dockerfile三、构建Docker镜像四、生成Docker容器 相信码农们经常会听说:虚拟机将成为历史,Docker才是未来 !!! 事实如此,现在大部分公司都在用 Docker 技术,想拥有自己的 Docker 专属镜像,那么 Dockerfile 就是入门,现在让我们一起来看一下 ------ 构建 Docker 镜像的全过程。 好文章 记得收藏...

Nick.Peng's Blogs 1万+

从0开始,Win32API编程

Windows API编程,之所以晦涩难懂,就是各种自带的变量名和奇怪的宏层出不穷;因此,我认为最好的学习路线就是从官方示例的代码开始学起,遇到了一个不懂的概念再去查找资料,这样子学习才事半功倍。

lrui1的博客 1366

CTP接口入门

该文章主要讲什么 这篇文章的面向对象是有一些C++基础,并且想用C++来做程式化交易的同学。 这篇文章可以算是我的程式化学习笔记中的一篇。其中介绍了CTP的简单的使用方式,并且附上了一些代码以及我在试用的时候遇到的一些小坑。 什么是CTP CTP是上海期货推出的一套可供程序调用的交易接口。就好比官方给程序化交易提供了的一个专门的业务窗口。 接口相关文件下载 CTP接口可以在上期...

weizehua的专栏 4万+

[Win32SDK基本] 窗口详解(超详细)

Win32SDK创建窗口,虽然早已经烂大街了,但是那些资料太散,都不全面,无法满足我编程的需要,因此,有必要整理一下。 这篇文章包括一下几个部分: 1。窗口类详解 2。窗口样式详解 3。窗口显示更新详解 4。窗口回调函数和常用消息详解 5。窗口常用API函数和常用控制消息详解 (这篇文章不包含关于绘制窗口的内容,以后我会发布GdiplusFlat(不是Gdiplus哦!)连载

zuishikonghuan的博客 1万+

工业模型导入Unity实战:从ProE/SolidWorks到实时渲染的完整流程

在工业仿真、数字孪生和VR/AR应用开发中,将高精度工程模型导入实时渲染引擎是一个常见的技术挑战。其核心原理在于参数化工程软件与实时渲染引擎的数据结构差异:前者基于精确的B-rep边界表示和特征树,后者依赖轻量化的三角网格与材质贴图。这一转换的技术价值在于实现工程数据的可视化与交互化,为产品展示、虚拟培训和工厂仿真等应用场景提供基础。通过数据翻译与优化流程,特别是利用3ds Max或Blender作为中转站进行网格优化与UV展开,能够有效解决模型破面、材质丢失和性能问题。本文聚焦于ProE(Creo)和So

weixin_33050117的博客 344

OpenCV 实战篇——如何测算出任一副图片中的物体的实际尺寸?传感器尺寸与像元尺寸的关系?

本文介绍了通过相机图像测算物体实际尺寸的方法,重点分析了传感器参数与成像质量的关系。文章首先给出了物体实际尺寸的计算公式,涉及像素尺寸、距离、分辨率等参数。然后详细解析了传感器尺寸与像元尺寸的关系,指出相同分辨率下更大的传感器能获得更好的成像质量。此外还介绍了光学尺寸、像素尺寸对成像的影响,以及帧率的概念。最后提及了相机标定的重要性,并概述了从像素坐标系转换到世界坐标系的基本思路。这些知识为通过相机图像进行精确测量提供了理论基础。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1335

Windows API入门:4:简单的SDK程序

通过一个小小小例子,来回忆一下windows API的相关知识,如Windows的数据类型,特别是和字符和字符串操作相关的数据类型,还有就是Unicode和ASCII在API函数上的具体体现。

Soda Wang的博客 776

PCL 快速均匀下采样

快速均匀下采样 是一种点云降采样技术,通过设置采样步长来实现等距降采样,从而减少点的数量。用户可以通过指定步长,选择每隔一定数量的点采样一个点,这样可以在保持点云几何特性的同时,显著减少点的数量。

纵马踏花向自由 870

win32 asm 贪食蛇

最近> 这本书看了一些章节了. 自从讲完GDI那章,往下就是通用对话框了. 通用对话框那章看起来很没意思,就跳着看了看.下一章是讲控件的,也没啥兴趣. 但是控件那章的窗口子类化,和窗口超类化倒是非常重要,给了我不少启发, 才知道原来各种各样的的漂亮的控件,窗口,无非也就是子类化,超类化,再加上资源作出来的.   再后面,讲的是内存和文件,再再后面,是DLL和HOOK. 各个章节都扫了

杂七杂八 1387

二极管限幅电路和钳位电路

二极管限幅电路和钳位电路学习

HW-BASE的博客 927

华为FusionCompute之计算虚拟化

华为FusionCompute之虚拟化

jks212454的博客 2452

C++图形化编程入门:基于EasyX实现井字棋游戏开发实践

图形用户界面(GUI)编程是软件开发中的重要领域,它通过可视化元素实现人机交互,提升用户体验。其核心原理在于事件驱动模型,程序通过响应鼠标、键盘等输入事件来更新界面状态。在C++生态中,EasyX图形库封装了Windows GDI接口,极大降低了图形编程门槛,使开发者能专注于业务逻辑而非底层API细节。这种技术组合特别适合初学者进行面向对象编程(OOP)实践,将抽象的类、对象概念转化为可视化的交互程序。通过井字棋这类规则明确的经典游戏项目,开发者可以系统练习二维数组处理、状态管理等核心编程技能,同时掌握消息

weixin_30522183的博客 381

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Qt创建SDK库(dll动态库)并调用SDK库(dll动态库)

在windows系统中,DLL库提供了API函数的声明和导入库(.lib),而SDK也是提供windows下程序开发所需的文件和工具的“工具包”,SDK包含了使用API所需的资料,所以通常也罢使用API编程来编写windows应用程序的开发方式叫做SDK编程。release模式下,编译成功后,可以在release文件夹下面看到生成的exampleDLL.dll和exampleDLL.lib,至此,动态库编译就结束了,下面我们开始调用。通过上面的一步,我们完成了动态库的创建,现在我们开始调用创建的动态库。

ifeng12358的博客 5490

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C#调用Win32 api学习总结

从.NET平台调用Win32 API         Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微软留给我们直接控制Windows的接口。 一.    基础知识         Win32 API是C语言(注意,不是C++语言,尽管C语言是C++语言的子集)函数集。

bcbobo21cn的专栏 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VS2017创建第一个win32窗口程序(一)及其详细解释(API,SDK,句柄,WINAPI,WinMain,HINSTANCE,LPSTR,int...这些参数是什么意思?)

1.简要了解 1.API是什么意思? Application programming interface 应用程序编程接口,可以理解为,是函数,是接口。 2.SDK是什么意思? Software development kit 软件开发包,资源的集合 SDK编程=》win32编程 3.窗口的客户区和非客区 4.什么是句柄? 比如有窗口句柄,进程句柄…句柄就是这些资源的ID.标志着这些资源。 2.win32参数解读 #include<Windows.h> int WINAPI WinMain(H

qq_48985554的博客 2624

win32sdk学习-简单的创建一个自己的工具栏

window程序中常使用的一个组件,就是工具栏了,基本上工具栏都是和菜单的选择是对应的。 在win32 api中有一个专门创建工具栏的函数(尽管msdn上说不建议使用) CreateToolbarEx。 自定义的工具栏,除了使用默认系统提供的图像之外,就是使用自己的图片资源了,不知道是不是win32程序兼容的关系,工具栏的图片资源要是bmp并且是8位256色的,网上有其他很多使用真彩图片的办

sujudz的专栏 7008

贪吃蛇详解Windows编程(四)

控制区的代码就不详细讲解了,自己看看就能明白,并没有什么难点。如果有兴趣的画还可以把界面做好一点,把功能做丰富一点。但是我觉得点到为止就行了。我用的是Win32空项目写的,你也可以用自动生成的代码写,但是我觉得那个太乱代码太多。 接下来是全部的代码: #include <windows.h> #include <vector> #include <time.h>//游戏区和控制区宽度高度 #def

_ACME_的博客 3312

【C/C++实战项目】贪吃蛇游戏

C语言代码实现贪吃蛇游戏设计、游戏机制、游戏界面、文件读写、自定义设置

phoenixFlyzzz的博客 7320

Snake Game---贪吃蛇WINAPI版

    经过几天的构思, 终于有一点思路了. 现把雏形贴上, 供大家指点一二. 只实现了移动, 其它的未完成.   用VC++6.0 Win32 Application工程编译通过. /* include files and constant variables here.*/#ifndef _RESOURCE_H_#define _RESOURCE_H_

eryar 939

【源码】用Win32 SDK写的贪吃蛇,欢迎交流

先看运行效果吧:使用mingw编译,语言为C++,下面开始源代码,分为两个文件:以下是header.h:Code: /* LiZhuohua     2010/7/6  */   #ifndef _SNAKE_HEADER_H_   #define _SNAKE_HEADER_H_   #define

AllStarGame的专栏 1324

Win32 游戏开发:贪吃蛇 下篇

因为个人原因更新来晚了,向各位关注的读者道个歉... 前排提示: 文章非常的长!!!(如有不懂的请在文章下方评论) 6)开始码代码啦 经过上面的前期工作,我们应该更清楚我们要做怎么做了(至少有一个方向了吧~) 一、首先是一个基础的Win32的框架(不懂可以看下我的这篇文章) 二、简单介绍贪吃蛇中游戏对象的类 PS:有看过之前一个游戏的会发现,我这个游戏也有Util这个类,以后...

南雨兮 3972
上一篇: 大数据的加法、减法、乘法以及阶乘的计算问题(源代码附上)
下一篇: 记录一下工作这3年多的时光
complety
博客等级 码龄16年 55粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值