接上篇: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);
}