win32强化练习5.1_动画秒表(位图初步)
2016-11-28 22:15
316 查看
我们开始进入到GDI绘图的练习了!
这一节的练习是做一个动画秒表,其中的数字0~9是从图片中取得的,示例如下:
![](https://img-blog.csdn.net/20161128215411755)
练习开始,步骤如下:
1. 先拿到一张图,看一下属性470* 56,然后数一下有1行10列,则每个数字就是47*56;
![](https://img-blog.csdn.net/20161128215715913)
2. 将图片放到程序文件夹下,并导入位图资源,其实就是在.rc文件中加了一句:IDB_BITMAP1 BITMAP ".\\Numbers.bmp" 并在.h中#define
3. 声明全局变量:HBITMAP hBit;
4. 在WM_CREATE消息处理中,加载位图资源
hBit = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));
5. 在WM_PAINT消息处理中,先整张显示这个图片,用Bitblt函数
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);//兼容DC
SelectObject(hdcMem, hBit);
BitBlt(hdc, 10 , 20, 47 *10 , 56, hdcMem, 0, 0, SRCCOPY); //位图
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
}6. 在WM_CREATE中开启定时器,并在WM_TIMER中处理全局变量gCnt ,让它在0~60之间进行变化
case WM_TIMER:
{
gCnt ++;
if (gCnt >= 60)
gCnt = 0;
InvalidateRect(hwnd, NULL, TRUE); //重绘
}7. 将WM_PAINT的处理封装一个函数show(HDC hdc, int n),这里的n是来自于定时器中会更新的全局变量gCnt
void show(HDC hdc, int n)
{
int s = n % 10; //得到个位数
int d = n / 10 % 10; //得到十位数
HDC hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBit);
BitBlt(hdc, 10 + 0 , 20, 47, 56, hdcMem, 47 * d, 0, SRCCOPY);
BitBlt(hdc, 10 + 47, 20, 47, 56, hdcMem, 47 * s, 0, SRCCOPY);
DeleteDC(hdcMem);
}8. 把BitBlt改写成TransparentBlt,去掉白色背景色,关键在于TransparentBlt这个函数不是那么轻松调用的!
如果是VS系列,连接到库msimg32.lib就可以了(#pragma),但如果是GCC系列,除了链接到库以外,还需要在编译时加入
-DWINVER=0x0500,而且这里用#define _WIN32_WINNT 0x0501 还不起作用!
将上面的BitBlt更改即可:
TransparentBlt(hdc, 10, 20, 47, 56, hdcMem, 47*d, 0, 47,56,RGB(255,255,255));
TransparentBlt(hdc, 10 + 47, 20, 47 *1 , 56, hdcMem, 47*s, 0, 47,56,RGB(255,255,255));
至此,我们的动画秒表练习就完成了~
这一节的练习是做一个动画秒表,其中的数字0~9是从图片中取得的,示例如下:
练习开始,步骤如下:
1. 先拿到一张图,看一下属性470* 56,然后数一下有1行10列,则每个数字就是47*56;
2. 将图片放到程序文件夹下,并导入位图资源,其实就是在.rc文件中加了一句:IDB_BITMAP1 BITMAP ".\\Numbers.bmp" 并在.h中#define
3. 声明全局变量:HBITMAP hBit;
4. 在WM_CREATE消息处理中,加载位图资源
hBit = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));
5. 在WM_PAINT消息处理中,先整张显示这个图片,用Bitblt函数
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);//兼容DC
SelectObject(hdcMem, hBit);
BitBlt(hdc, 10 , 20, 47 *10 , 56, hdcMem, 0, 0, SRCCOPY); //位图
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
}6. 在WM_CREATE中开启定时器,并在WM_TIMER中处理全局变量gCnt ,让它在0~60之间进行变化
case WM_TIMER:
{
gCnt ++;
if (gCnt >= 60)
gCnt = 0;
InvalidateRect(hwnd, NULL, TRUE); //重绘
}7. 将WM_PAINT的处理封装一个函数show(HDC hdc, int n),这里的n是来自于定时器中会更新的全局变量gCnt
void show(HDC hdc, int n)
{
int s = n % 10; //得到个位数
int d = n / 10 % 10; //得到十位数
HDC hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBit);
BitBlt(hdc, 10 + 0 , 20, 47, 56, hdcMem, 47 * d, 0, SRCCOPY);
BitBlt(hdc, 10 + 47, 20, 47, 56, hdcMem, 47 * s, 0, SRCCOPY);
DeleteDC(hdcMem);
}8. 把BitBlt改写成TransparentBlt,去掉白色背景色,关键在于TransparentBlt这个函数不是那么轻松调用的!
如果是VS系列,连接到库msimg32.lib就可以了(#pragma),但如果是GCC系列,除了链接到库以外,还需要在编译时加入
-DWINVER=0x0500,而且这里用#define _WIN32_WINNT 0x0501 还不起作用!
将上面的BitBlt更改即可:
TransparentBlt(hdc, 10, 20, 47, 56, hdcMem, 47*d, 0, 47,56,RGB(255,255,255));
TransparentBlt(hdc, 10 + 47, 20, 47 *1 , 56, hdcMem, 47*s, 0, 47,56,RGB(255,255,255));
至此,我们的动画秒表练习就完成了~
相关文章推荐
- win32强化练习4.2_菜单勾选与图标变换
- win32强化练习4.4_状态栏、坐标与时钟
- win32强化练习4.5_标准工具栏的使用
- win32强化练习2.2_单选与复选控件
- WIN32汇编: 25.位图初步
- win32强化练习3.7_拖动窗口
- win32强化练习4.6_自定义图标或图像的工具栏
- win32强化练习0.1_开发环境搭建
- win32强化练习2.3_四则计算器(组合框控件)
- win32强化练习1.1_MessageBox简单应用及手动编译
- win32强化练习3.3_定时器与弹球
- win32强化练习3.6_贪吃蛇半部
- win32强化练习4.0_资源相关练习简介
- win32强化练习2.4_双击播放MP3(列表框与通知码)
- win32强化练习4.3_粗糙的SPY获取别人的窗口
- win32强化练习3.1_键盘控制小球移动
- win32强化练习3.4_绘制坦克及四向移动(键盘进阶)
- win32强化练习2.0_手工打造自己的对话框程序模板
- win32强化练习2.5_滚动条初步
- win32强化练习4.7_快速建立TreeView