win32窗口绘制

win32窗口绘制

win32在WM_PAINT消息类型中绘制窗口

//5、窗口过程函数:处理窗口接收的消息
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        //关闭窗口
    case WM_DESTROY:        
        PostQuitMessage(0);
        break;
        //通知窗口需要重绘
    case WM_PAINT: 
        Paint(hwnd);
        break;
        //都不符合
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);//转给windows处理,默认的窗口过程
    }
    return 0;
}

窗口绘图基本流程

绘图设备 DC(Device Context),绘图上下文,绘图描述表
HDC:DC句柄

绘图步骤:
1、得到绘图设备

HDC BeginPaint(
    HWND hWnd,               //窗口句柄
    LPPAINTSTRUCT lpPaint   //存储绘画操作的指针
    );

2、开始绘画
3、结束绘画,将绘画结果提交到屏幕上。

BOOL EndPaint(
     HWND hWnd,                  //窗口句柄
     CONST PAINTSTRUCT *lpPaint  //存储绘画操作的指针
);

开始绘画

基本图形绘制

1、画点 设置指定点的颜色

返回值为点原来的颜色
COLORREF SetPixel(
    HDC hdc,        //绘图设备句柄
    int x,          //点的X坐标
    int y,          //点的Y坐标
    COLORREF color  //点的颜色
    );

2、画线(直线、弧线)

当前点:上一次绘图时的最后一点,初始为(0,0)点
MoveToEx:指定窗口当前点

BOOL MoveToEx(
    HDC hdc,           //绘图设备句柄
    int x,             //指定当前点的X坐标
    int y,             //指定当前点的Y坐标
    LPPOINT lppt       //原本的当前点指针
);

LineTo:从窗口当前点到(LineTo)指定点绘制一条直线

BOOL LineTo(
    HDC hdc,       //绘图设备句柄
    int x,         //指定点的X坐标
    int y          //指定点的Y坐标
    );

3、绘制封闭图形(能使用画刷填充的图形)

矩形:Rectangle

BOOL Rectangle(
   HDC hdc,        //绘图设备句柄
   int left,       //矩形的左
   int top,        //矩形的上
   int right,      //矩形的右
   int bottom      //矩形的下
   );

通常和结构体RECT配合使用,RECT用于定义要绘制的矩形的边界,而Rectangle函数则根据这些边界信息在屏幕上绘制矩形。

typedef struct RECT {
    LONG left;
    LONG top;
    LONG right;
    LONG bottom;
} ;

圆形:Ellipse

BOOL Ellipse(
   HDC hdc,        //绘图设备句柄
   int left,       //外接矩形的左
   int top,        //外接矩形的上
   int right,      //外接矩形的右
   int bottom      //外接矩形的下
   );

GDI绘图对象

HGDIOBJ:GDI绘图对象句柄,兼容画笔句柄,画刷句柄等
HPEN:画笔句柄,描绘线的样式(虚线、点线、实线)、线粗、颜色
HBRUSH:画刷句柄,给封闭图形(不管线型)填充颜色和图案
步骤:
1、创建GDI绘图对象句柄(画笔、画刷)

// 画笔
 HPEN CreatePen(
    int iStyle,     //样式    PS_SOLID:实心线,可以支持多个像素宽,其他类型只能支持一个像素宽
    int cWidth,     //线粗
    COLORREF color  //颜色
 );
// 画刷
 HBRUSH CreateSolidBrush(   //创建实心画刷,填充单一颜色
    COLORREF color          //颜色
 );
 HBRUSH CreateHatchBrush(   //创建纹理画刷,填充纹理线
    int iHatch,             //纹理样式
    COLORREF color          //颜色
    );

2、将创建的GDI绘图对象句柄应用到DC(绘图设备)中,此时自动取出原来的GDI绘图对象句柄
只能置换同种GDI绘图对象,即画刷换画刷,画笔换画笔

 HGDIOBJ SelectObject(      //返回值为原来的GDI绘图对象句柄
    HDC hdc,                //绘图设备句柄
    HGDIOBJ hgdiobj         //GDI绘图对象句柄(画笔句柄、画刷句柄)
 );

3、绘图
4、取出DC(绘图设备)中的GDI绘图对象句柄
使用SelectObject(hdc,原来的GDI绘图对象句柄),即可将之前创建的GDI绘图对象句柄(画笔、画刷)取出
且不需要接收返回值,因为之前创建GDI绘图对象时已有此对象句柄,此时只是将此GDI绘图对象从DC中取出
5、释放GDI绘图对象句柄
只能删除现在不被DC使用的GDI绘图对象,所以释放前要取出创建的GDI绘图对象

 BOOL DeleteObject(
    HGDIOBJ hgdiobj         //GDI绘图对象句柄(画笔句柄、画刷句柄)
 );

可以使用GetStockObject函数获取系统维护的画刷、画笔等
GetStockObject返回的画刷只要取出DC即可,不需要释放,因为是向操作系统借的

HGDIOBJ GetStockObject( 
int i      //NULL_BRUSH:获取透明的画刷,如果没有使用透明画刷,封闭图形内部颜色为白色
);

位图绘制

光栅图像:记录图像中每一点的颜色等信息
矢量图像:记录图像算法、绘图指令等
HBITMAP:位图句柄,既是一种GDI绘图对象,又是一种资源
步骤:
1、添加位图资源
资源文件->添加->资源->Bitmap->绘制保存后,硬盘中保存有该资源文件,程序启动时进程进入内存,内存中有该资源文件
2、加载位图资源LoadBitmap
在本进程的内存中找到该位图资源

     HBITMAP LoadBitmap(        //返回值为该位图资源句柄
        HINSTANCE hInstance,    //当前实例句柄
        LPCWSTR lpBitmapName    //位图ID
        );

3、创建一个与当前DC(在屏幕上绘画)相匹配的DC(内存DC:在内存的一个虚拟区域中绘画)和内存中的虚拟区域

     HDC CreateCompatibleDC(    //返回创建好的内存DC句柄
        HDC hdc                 //当前DC句柄,可为NULL(使用屏幕DC)
     )

4、将位图数据放入内存DC,内存DC在虚拟区中将图像绘制出来

     HGDIOBJ SelectObject(      //返回值为原来的GDI绘图对象句柄,初始时没有原来的位图也要接收这个对象为假位图,之后才能换出来
        HDC hdc,                //绘图设备句柄(内存DC)
        HGDIOBJ hgdiobj         //GDI绘图对象句柄(位图句柄)
     );

5、屏幕成像

//1:1成像
 BOOL BitBlt(
     HDC hdc,       //目的DC
     int x,         //目的左上X坐标
     int y,         //目的左上Y坐标
     int cx,        //目的宽度
    int cy,        //目的高度
     HDC hdcSrc,    //源DC
     int x1,        //源左上X坐标
     int y1,        //源左上Y坐标
     DWORD rop      //成像方法 SRCCOPY:原样成像
 );
 //缩放成像
 BOOL StretchBlt(
     HDC hdc,       //目的DC
     int x,         //目的左上X坐标
     int y,         //目的左上Y坐标
     int cx,        //目的宽度
     int cy,        //目的高度
     HDC hdcSrc,    //源DC
     int x1,        //源左上X坐标
     int y1,        //源左上Y坐标
     int wSrc,      //源DC宽
     int hSrc,      //源DC高
     DWORD rop      //成像方法 SRCCOPY:原样成像
 );

6、取出位图
SelectObject(hdc,原来的GDI绘图对象句柄(位图句柄))
7、释放位图
DeleteObject(位图句柄)
8、释放内存DC
DeleteDC

文本绘制

TextOut:将文字绘制在指定坐标位置,只能绘制单行字符串,不能换行

BOOL TextOut(
    HDC hdc,                //绘图设备句柄
    int x                   //绘制位置,x坐标
    int y,                  //绘制位置,y坐标
    LPCWSTR lpString,       //绘制内容(字符串)
    int c                   //绘制内容(字符串)长度
    );

DrawText:在矩形范围内画字符串,可以绘制多行字符串

int DrawText(
    HDC hdc,                //绘图设备句柄
    LPCWSTR lpchText,       //字符串
    int cchText,            //字符数量
    LPRECT lprc,            //绘制文字的矩形框
    UINT format             //绘制的方式
    );

文字颜色:SetTextColor

COLORREF SetTextColor(
   HDC hdc
   COLORREF color
   );

文字背景色:SetBkColor

COLORREF SetBkColor(
   HDC hdc,
   COLORREF color
   );

文字背景模式:SetBkMode

SetBkMode(OPAQUE/TRANSPARENT):不透明背景/透明背景

字体

HFONT:字体句柄,GDI绘图对象之一
步骤:
1、创建GDI绘图对象句柄(字体)

HFONT CreateFont(
   int cHeight,                //字体高度
   int cWidth,                 //字体宽度
   int cEscapement,            //字符串倾斜角度     单位:0.1度
   int cOrientation,           //字符旋转角度
   int cWeight,                //字体粗细
   DWORD bItalic,              //斜体               1/0
   DWORD bUnderline,           //字符下划线         1/0
   DWORD bStrikeOut,           //删除线             1/0
   DWORD iCharSet,             //字符集             GB231
   DWORD iOutPrecision,        //输出精度             0
   DWORD iClipPrecision,       //剪切精度             0
   DWORD iQuality,             //输出质量             0
   DWORD iPitchAndFamily,      //匹配字体             0
   LPCWSTR pszFaceName         //字体名称
   );

2、将创建的GDI绘图对象句柄应用到DC(绘图设备)中,此时自动取出原来的GDI绘图对象句柄
只能置换同种GDI绘图对象,即画刷换画刷,画笔换画笔

HGDIOBJ SelectObject(      //返回值为原来的GDI绘图对象句柄(原字体句柄)
   HDC hdc,                //绘图设备句柄
   HGDIOBJ hgdiobj         //GDI绘图对象句柄(字体句柄)
);

3、绘制文本
TextOut/DrawText
4、取出DC(绘图设备)中的GDI绘图对象句柄
使用SelectObject(hdc,原来的GDI绘图对象句柄),即可将之前创建的GDI绘图对象句柄(字体)取出,
且不需要接收返回值,因为之前创建GDI绘图对象时已有此对象句柄,此时只是将此GDI绘图对象从DC中取出
5、释放GDI绘图对象句柄
只能删除现在不被DC使用的GDI绘图对象,所以释放前要取出创建的GDI绘图对象

BOOL DeleteObject(
   HGDIOBJ hgdiobj         //GDI绘图对象句柄(字体句柄)
);

相关链接

创建窗口

https://www.cnblogs.com/wa2211lq/p/18540536

posted @   刘倩_网安2211  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示