人山人海的十一假期结束了,继续我们的游戏开发学习,今天继续我们的win32基础编程,在窗体上创建菜单、事件响应和绘制图形等。好吧(你已经烦了),废话少说,开始了:
一、窗口上添加菜单
首先,创建菜单头文件MENU.H文件,定义菜单选项,内容如下:
#define MENU_FILE_ID_OPEN 10000
#define MENU_FILE_ID_CLOSE 10001
#define MENU_FILE_ID_SAVE 10002
#define MENU_FILE_ID_EXIT 10003
然后,创建资源文件MENU.RC,声明菜单按钮,内容如下:
#include "MENU.H"
MainMenu MENU DISCARDABLE
{
POPUP "文件"
{
MENUITEM "打开",MENU_FILE_ID_OPEN
MENUITEM "关闭",MENU_FILE_ID_CLOSE
MENUITEM "保存",MENU_FILE_ID_SAVE
MENUITEM "退出",MENU_FILE_ID_EXIT
}
}
最后加载菜单:
winclass.lpszMenuName="MainMenu";//菜单资源名称
//将菜单句柄传入createWindow()函数
LoadMenu(hinstance,"MainMenu")//返回菜单句柄
好了运行的你的工程,出现结果了吗?我相信你肯定出现了,因为你超牛的!
二、响应菜单事件
其实,很简单啦,当您每次单击菜单时,就向我们定义的winproc回调函数发送了一个WM_COMMAND类型的消息,所以我们只要处理该消息,便可以达到响应事件的效果,我们在毁掉函数中加入如下代码:
case WM_COMMAND:
{
switch(LOWORD(wparam)){//老实说:我也不知道这个函数是什么意思,从何而来,起什么作用
case MENU_FILE_ID_EXIT:
{
// 退出
PostQuitMessage(0);
} break;
case MENU_FILE_ID_OPEN:
{
} break;
case MENU_FILE_ID_CLOSE:
{
} break;
case MENU_FILE_ID_SAVE:
{
} break;
}
}
好了,随便你怎么搞了,总之,在里面做你想做的事情!
三、在窗体上画点东西
根据windows的处理方法,我们需要创建画笔和刷子这两个对象,然后,让他和图形设备描述表关联之后,我们才能驱动硬件在屏幕上绘制图形。所以,我们的步骤如下:
先获取图形设备描述表
HDC hdc = GetDC(hwnd);
其次,创建画笔和刷子
HPEN white_pen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
HPEN black_pen = CreatePen(PS_SOLID, 1, RGB(0,0,0));
HBRUSH green_brush = CreateSolidBrush(RGB(0,255,0));
HBRUSH black_brush = CreateSolidBrush(RGB(0,0,0));
然后,关联
SelectObject(hdc, black_pen);
SelectObject(hdc, black_brush);
之后,画圆
Ellipse(hdc, ball_x, ball_y, ball_x + 50, ball_y + 50);
上面只是关键得代码,下面我贴上完整的代码:
#include "main2.h"
#include "MENUs.h"
#define WIN32_LEAN_AND_MEAN
#include <stdlib.h>
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <math.h>
#include <mmsystem.h>
#define WINDOW_CLASS_NAME "MY_CLASS"
#define WINDOW_WIDTH GetSystemMetrics(SM_CXFULLSCREEN)
#define WINDOW_HEIGHT GetSystemMetrics(SM_CYFULLSCREEN)
//系统进程回调函数
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
PAINTSTRUCT ps;//图形绘制结构体
HDC hdc;//句柄
switch(msg)
{
case WM_CREATE: //窗口创建时
{
return(0);
} break;
case WM_PAINT: //窗口重绘时
{
hdc = BeginPaint(hwnd,&ps); //开始绘制
EndPaint(hwnd,&ps);//结束绘制
return(0);
} break;
case WM_DESTROY://窗口销毁时
{
PostQuitMessage(0);
return(0);
} break;
case WM_COMMAND:
{
switch(LOWORD(wparam)){//老实说:我也不知道这个函数是什么意思,从何而来,起什么作用
case MENU_FILE_ID_EXIT:
{
// 退出
PostQuitMessage(0);
} break;
case MENU_FILE_ID_OPEN:
{
} break;
// handle each of sounds
case MENU_FILE_ID_CLOSE:
{
} break;
case MENU_FILE_ID_SAVE:
{
} break;
}
}
default:break;
}
//将消息队列中 不属于该进程的消息发送给系统进程
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
//程序入口
int WINAPI WinMain(HINSTANCE hinstance,//应用程序当前事例的句柄
HINSTANCE hprevinstance,//应用程序的前事例的句柄。对于一个32的位程序,该参数总为NULL
LPSTR lpcmdline,//指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine
int ncmdshow//指明窗口如何显示
)
{
WNDCLASSEX winclass;//声明窗体信息结构体
HWND hwnd=NULL;
MSG msg;
HDC hdc;
winclass.cbSize=sizeof(WNDCLASSEX);//计算结构体大小
winclass.style=CS_DBLCLKS | CS_OWNDC;//设置窗口风格,宽和高改变时刷新窗口
winclass.lpfnWndProc=WindowProc;//指向时间句柄的函数指针,基本上都是响应某个操作的回调函数(是我们自己定义的函数),这里设为空。
//下面两个字段原本是为了指示windows将附加的运行时间告诉系统的,大多数人都设为0
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;
winclass.hInstance=hinstance;//系统传给winmain函数的句柄
winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//设置窗体图标
winclass.hCursor=LoadCursor(NULL,IDC_ARROW);//设置光标
winclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取系统画刷、画笔、调色板或字体的一个句柄。
winclass.lpszClassName=WINDOW_CLASS_NAME;//为自己创建的结构体赋别名,将来用它可以来引用该结构体
winclass.lpszMenuName="MainMenu";//菜单资源,以后再作解释
winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);//应用程序图标
//注册结构体
if(!RegisterClassEx(&winclass)){
return(0);
}
int x=GetSystemMetrics(SM_CXFULLSCREEN);//获取全屏 x的宽度
int y=GetSystemMetrics(SM_CYFULLSCREEN);//获取全屏 y的高度
//创建窗口
hwnd=CreateWindowEx(
NULL,
WINDOW_CLASS_NAME,
"哥的第一个窗口",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
0,
0,
x,
y,
NULL,
LoadMenu(hinstance,"MainMenu"),
hinstance,
NULL
);
if(NULL==hwnd){
return(0);
}
//得到图形设备描述表
hdc = GetDC(hwnd);
//创建花笔和刷子
HPEN white_pen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
HPEN black_pen = CreatePen(PS_SOLID, 1, RGB(0,0,0));
HBRUSH green_brush = CreateSolidBrush(RGB(0,255,0));
HBRUSH black_brush = CreateSolidBrush(RGB(0,0,0));
// 园的开始坐标
int ball_x = WINDOW_WIDTH/2;
int ball_y = WINDOW_HEIGHT/2;
// 园的移动距离
int xv = 5;
int yv = 5;
// 循环发送消息
while(TRUE)
{
// 获取消息
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
// 是否退出
if (msg.message == WM_QUIT)
break;
//转换消息
TranslateMessage(&msg);
// 发送消息
DispatchMessage(&msg);
}
// 图形设备描述表选择画笔和刷子
SelectObject(hdc, black_pen);
SelectObject(hdc, black_brush);
//画圆
Ellipse(hdc, ball_x, ball_y, ball_x + 50, ball_y + 50);
//移动园
ball_x+=xv;
ball_y+=yv;
// 边界检测
if (ball_x < 0 || ball_x > WINDOW_WIDTH - 50)
{
xv=-xv;
ball_x+=xv;
}
else
// 边界检测
if (ball_y < 0 || ball_y > WINDOW_HEIGHT - 50)
{
yv=-yv;
ball_y+=yv;
}
// 图形设备描述表选择画笔和刷子
SelectObject(hdc, white_pen);
SelectObject(hdc, green_brush);
// 画圆
Ellipse(hdc, ball_x, ball_y, ball_x +50, ball_y + 50);
//休眠10毫秒
Sleep(50);
} // end while
//释放所有笔和刷子
DeleteObject(white_pen);
DeleteObject(black_pen);
DeleteObject(green_brush);
DeleteObject(black_brush);
//释放图形设备描述表
ReleaseDC(hwnd,hdc);
return(msg.wParam);
}
分享到:
相关推荐
《C/C++语言硬件程序设计——基于TMS320C5000系列DSP》是一本深入探讨如何使用C和C++编程语言进行数字信号处理(DSP)的专著,特别关注德州仪器(TI)的TMS320C5000系列 DSP 芯片。该书涵盖了从基础概念到高级应用的...
——代码完成于2021-11-12 整体思路: 用两个数组分别模拟 A->B 和B->A间通讯的信道。A、B两主机各自拥有独立线程。线程move用来模拟信道中信号的移动。线程show用于打印信道。其中线程move和show detach()后作为...
1. 熟悉 C/C++ 的人员 2. 正在做关于 Qt 可视化却无从下手的人员 3. 希望做一个小项目,但没有合适的框架的人员 我主要能学到什么: 1. 该项目包含 鼠标点击响应与绘图相关的算法 2. 该项目包含 创建、删除、编辑 ...
《C/C++程序员实用大全——C/C++最佳编程指南》是一本专为C/C++开发者设计的详尽参考资料,旨在帮助读者深入理解这两种强大的编程语言,并掌握高效的编程实践。本书涵盖了从基础知识到高级特性的全面内容,对于初学...
在sublime 和其他需要自己配置c/c++环境时所需要的文件
虚拟机的设计与实现——C/C++.pdf
本项目名为“C语言/C++信息管理系统——考勤管理系统”,它是一个适合课程设计或程序实训的实践项目,旨在帮助学习者掌握C语言和C++编程技能,同时理解信息管理系统的基本原理。 首先,我们来了解一下C语言和C++这...
### C/C++程序设计经典书籍概览 #### 引言:C语言——现代程序设计的基石 自1973年Dennis M. Ritchie设计并实现C语言以来,计算机程序设计领域经历了...C语言的学习之旅,有了这些书籍的陪伴,无疑将更加充实和高效。
C语言是基础,以其高效和对硬件的接近性而闻名,而C++则在C的基础上增加了面向对象编程的概念,使得代码更易于管理和复用。 【描述】"c/c++语言程序设计课件 中国矿业大学出版社" 提供的是由知名教育机构——中国...
为了考虑到程序兼容性,通常我们编译C/C++程序会编译32位和64位两个版本,像VisualStudio,devcpp这类集成开发环境确实不用自己设置就能做到,但是他们都有不方便的地方,如VisualStudio的占用空间太大,如果初学C/...
密码学:C/C++语言实现(原书第2版)主要阐述如何使用C和C++语言实现密码学算法,包括编写专家级的密码所需要掌握的知识和技术,以及如何安全并高效地实现密码学算法。第2版包括了许多全新内容,同时对原有内容进行了...
“Turbo C++ 3.0”软件是Borland公司在1992年推出的强大的——C语言程序设计与C++面向对象程序设计 的集成开发工具。它只需要修改一个设置选项,就能够在同一个IDE集成开发环境下设计和编译以标准 C 和 C++ 语法设计...
Visual C++源代码 3 如何使用表格定位窗体控件Visual C++源代码 3 如何使用表格定位窗体控件Visual C++源代码 3 如何使用表格定位窗体控件Visual C++源代码 3 如何使用表格定位窗体控件Visual C++源代码 3 如何使用...
分享一套课程——Linux GDB C/C++调试基础与提升视频课程,提供源码+PPT下载。
虚拟机的设计和实现(C/C++) 虚拟机的设计和实现(C/C++) 虚拟机的设计和实现(C/C++) 虚拟机的设计和实现(C/C++)
《C语言 C++程序设计完整版——谭浩强》是一份综合性的编程学习资源,包含了谭浩强教授编写的C语言和C++编程教程。这个压缩包中的内容旨在为初学者提供全面的基础知识,帮助他们掌握这两门重要的编程语言。 首先,...
1. **Borland C/C++**:Borland C/C++是Borland公司的旗舰级编程工具,它不仅提供了C语言的编译器,还包含了C++的编译支持。该套件以其高效、快速的编译速度和优秀的调试能力而闻名,同时还集成了代码编辑器、项目...
————|————|————Source(目录,存放API绘图小例程源代码)<br/>| | |<br/>|————|————|————EXE(目录,存放API绘图小例程可执行文件)<br/>| | |<br/>|————|————|————Setup(目录...
虚拟机的设计与实现——C/C++ 这都是神级的书
C/C++语言期末课程设计——学生成绩管理系统(源代码+详细注释)