minigui 4.0 源代码分析(四)

2020-11-23  本文已影响0人  RonZheng2010

1. 设备描述表

1.1 DC

DC (Device Context,设备描述表)向使用者提供绘制接口,除一组函数集,还包括与绘图方式有关的对象,比如画笔、笔刷、调色板、剪裁区域等。

minigui预定义两个全局的DC实例,一个是__mg_screen_dc,一个是__mg_screen_sys_dc。
用户创建的DC则保存在全局数组DCSlot[]中。

DC DCSlot [16];
DC __mg_screen_dc;
DC __mg_screen_sys_dc;

1.2 HDC

HDC是DC的句柄。它有三类取值。

dc_HDC2PDC()可以从DC句柄得到DC实例。

#define HDC_SCREEN          ((HDC)0)
#define HDC_SCREEN_SYS      ((HDC)1)

PDC dc_HDC2PDC (HDC hdc)                                                               
{
    if (hdc == HDC_SCREEN_SYS) 
        return &__mg_screen_sys_dc; 
    else if (hdc == HDC_SCREEN) 
        return &__mg_screen_dc;

    return (PDC) hdc;
}

1.3 get_valid_dc()

get_valid_dc()得到窗口DC的句柄。如果需要,调用GetDC()等函数创建DC实例。

1.4 GetDC()

在mg_InitGAL()函数中,将__gal_screen设置为GAL_VideoDevice的成员surface。

// newgal.c
int mg_InitGAL (char* engine, char* mode)
{
    if (!(__gal_screen = GAL_SetVideoMode (w, h, depth, GAL_HWPALETTE))) {
    }
    ...
}

1.5 GetClientDC()

GetClientDC()的实现与GetDC()一样。

1.6 GetSecondarySubDC()

GetSecondarySubDC()基于指定的secondary DC,得到子窗口的DC实例。

1.7 mg_InitScreenDC()

mg_InitScreenDC()初始化预定义的DC实例__mg_screen_sys_dc和__mg_screen_dc。

2. 剪裁区域

可以指定一块区域,让DC绘制时不超出这个区域。这个区域就是剪裁区域CLIPRGN。

2.1 InitClipRgn()

InitClipRgn()初始化CLIPRGN实例。

2.2 SetClipRgn()

SetClipRgn()设置CIPRGN的区域。

dc_InitClipRgn()初始化全局数组DCSlot[]中DC的剪裁区域。

它遍历DCSLot[],对其中的DC,

上一篇 下一篇

猜你喜欢

热点阅读