Windows 下窗口画图---十天教会你俄罗斯方块

接上篇:https://blog.csdn.net/qq_41603898/article/details/80968333

1、WM_PAINT

2、Rectangle

3、兼容性DC

一.在回调函数中

补上一种case

case WM_PAINT://窗口变化时重绘

hDC = BeginPaint(hWnd,&ps);

       OnPaint(hDC);//自定义函数,包括Rectangle

  EndPaint(hWnd,&ps);

        break;

二.Rectangle 顾名思义矩形,画矩形

BOOL Rectangle(HDC hdc, // handle to DC

int nLeftRect, // x-coord of upper-left corner of rectangle

int nTopRect, // y-coord of upper-left corner of rectangle

int nRightRect, // x-coord of lower-right corner of rectangle

int nBottomRect // y-coord of lower-right corner of rectangle);//通过给左上角和右下角一个点对角线画矩形

将画矩形函数装在OnPaint函数中,为后面兼容DC准备

void OnPaint(HDC hDC){//画矩形框Rectangle(hDC,RECT_UPPER_X,RECT_UPPER_Y,RECT_LOWER_X,RECT_LOWER_Y);}

#define WND_HEIGHT 640//比RECT_LOWER_Y大

#define RECT_UPPER_X 0

#define RECT_UPPER_Y 0

#define RECT_LOWER_X 300

#define RECT_LOWER_Y 600//也就是两个点坐标,规范正式而已

写在后面记得声明

三.兼容性DC(详情

根据设备DC创建兼容性DC,并在兼容性DC上把绘图操作全部绘制完,

然后再一次性拷贝到源设备DC上,避免屏幕刷新闪烁

1.创建兼容性DC

2.创建兼容性位图

3.将位图与DC绑定在一起

4.释放位图

5.释放DC

将内存DC传递到窗口DC

BOOL BitBlt( HDC hdcDest, int nXDest, int nYDest, nt nWidth, int nHeight,HDC hdcSrc, nt nXSrc, int nYSrc, DWORD dwRop );

返回值:失败返回0, 成功返回非零

参数1: 目标DC,窗口DC

参数2,3: 目标的起始位置,注意是基于我们的窗口

参数4,5: 区域的大小

参数6: 源DC,也就是我们的内存DC

参数7,8: 内存图片的起始位置

参数9: 传递的方式

最后的OnPaint()

void OnPaint(HDC hDC) { HDC mDC = CreateCompatibleDC(hDC); HBITMAP hBitmap = CreateCompatibleBitmap(hDC, 300, 600); SelectObject(mDC, hBitmap); Rectangle(hDC, 0, 0, 300, 600); BitBlt(hDC, 0, 0, 300, 600, mDC, 0, 0, SRCCOPY); DeleteObject(hBitmap); DeleteDC(mDC); }

结合上一篇文章更新的代码:

#include <windows.h> #include "Resource.h" #include "stdafx.h" #define WND_POS_X 100 #define WND_POS_Y 100 #define WND_WIDTH 500 #define WND_HEIGHT 660 #define IDR_MENU1                       130 #define IDR_MENU3                       133 #define IDI_ICON2                       134 //声明 LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnPaint(HDC hDC); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hWnd;//窗口句柄 MSG mSg; HMENU hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU3)); //创建窗口结构体 WNDCLASSEX wc; wc.cbClsExtra = 0;//暂时不用 wc.cbSize = sizeof(wc);//结构体大小 wc.cbWndExtra = 0;//暂时不用 wc.hbrBackground = (HBRUSH)COLOR_WINDOW;//背景颜色 wc.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE(IDI_HAND));//光标 wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2));//窗口左上角的图标 wc.hIconSm = NULL;//状态栏中的图标,默认与左上角图标一致 wc.hInstance = hInstance;//实例句柄 wc.lpfnWndProc = WndProc;//回调函数 wc.lpszClassName = "nanhang";//结构体名字 wc.lpszMenuName = ("MEAN");//菜单栏名字 wc.style = CS_HREDRAW | CS_VREDRAW;//窗口水平变化或是垂直变化时重绘窗口   //注册窗口结构体 if (0 == RegisterClassEx(&wc)) { int eNum = GetLastError();//注册失败的错误代码 return 0;//注册失败 } //创建窗口 hWnd = CreateWindowEx(WS_EX_WINDOWEDGE, "nanhang", "俄罗斯方块", WS_OVERLAPPEDWINDOW, WND_POS_X, WND_POS_Y, WND_WIDTH, WND_HEIGHT, NULL, hMenu, hInstance, NULL); if (NULL == hWnd) { return 0;//创建失败 } //显示窗口 ShowWindow(hWnd, nCmdShow); //消息循环 while (GetMessage(&mSg, NULL, 0, 0)) { //翻译消息 TranslateMessage(&mSg); //分发消息 DispatchMessage(&mSg); } return 0; } //回调函数 LRESULT CALLBACK WndProc(HWND hWnd, UINT uID, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hDC; switch (uID) {case WM_PAINT: hDC = BeginPaint(hWnd, &ps); OnPaint(hDC); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0);//点击叉后,关闭窗口同时退出程序 break; } return DefWindowProc(hWnd, uID, wParam, lParam);//让系统自动处理一些默认消息 } void OnPaint(HDC hDC) { HDC mDC = CreateCompatibleDC(hDC); HBITMAP hBitmap = CreateCompatibleBitmap(hDC, 300, 600); SelectObject(mDC, hBitmap); Rectangle(hDC, 0, 0, 300, 600); BitBlt(hDC, 0, 0, 300, 600, mDC, 0, 0, SRCCOPY); DeleteObject(hBitmap); DeleteDC(mDC); }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博客

Win8中缩放视图(SemanticZoom控件)

    SemanticZoom控件可以让用户缩放具有相同内容的两个不同视图。其中有一个是主视图。另外一个视图可以让用户进行快速导航。例如,当用户查看地址簿时,...

751
来自专栏iOSDevLog

《iOS UI 开发捷径 利用 Interface Builder 高效、优雅地开发 UI》 读书笔记第1章 Interface Bundle 概要第2章 使用 Interface Builder第3

4818
来自专栏落影的专栏

Metal入门教程(一)图片绘制

这里是一篇Metal新手教程,先定个小目标:把绘制一张图片到屏幕上。 Metal系列教程的代码地址; OpenGL ES系列教程在这里;

1K5
来自专栏JackieZheng

漫谈可视化Prefuse(二)---一分钟学会Prefuse

  前篇《漫谈可视化Prefuse(一)---从SQL Server数据库读取数据》主要介绍了prefuse如何连接数据库sql server并读取数据进行可视...

2816
来自专栏移动开发面面观

GIF格式解析

5425
来自专栏小灰灰

Java 借助ImageMagic实现图片编辑服务

Java 借助ImageMagic实现图片编辑服务 java原生对于图片的编辑处理并没有特别友好,而且问题也有不少,那么作为一个java后端,如果要提供图片的编...

8296
来自专栏生信技能树

学IGV必看的初级教程

Integrative Genomics Viewer (IGV)作为一个高性能的可视化工具,可以交互式的察看综合的基因组相关数据,也友好的支持多种数据类型,自...

1.1K12
来自专栏每日一篇技术文章

SceneKit_入门13_骨骼动画

1.创建工程(略) 2.加载场景文件(略) 3.添加框架SceneKit/Scenekit.h 4.创建场景资源对象

2843
来自专栏wOw的Android小站

[iOS] 输入框高度随输入内容变化

对于第一点,有一个方便的计算方法,就是获取UITextView内容的高度比上UITextView的字体的高度,即可得到当前的行数。

2451
来自专栏张善友的专栏

在ASP.NET MVC 4中使用Kendo UI Grid

Kendo UI 是Telerik推出的一套based on jQuery 的 Framework,提供了很多控件(Menu 、Grid 、Combox等......

2747

扫码关注云+社区

领取腾讯云代金券