MASTERPOPY 发表于 2022-7-10 10:49:15

透明对话框

网上的透明对话框代码有一个缺陷,就是开启透明对话框后,yesno box也会变透明。而且源码参数含义不名。
我通过查阅gba硬件参数,重新做了一份透明对话框源码。

原理:gba窗口可以至多分为两个窗口win0和win1,可以通过io参数设定它俩的大小,是否开启混合模式,以及混合颜色的参数等。
win0的优先级高于win1。这里,我们将win1设置为屏幕的上半部分(y坐标0到112),win0设置为屏幕的下半部分(y坐标112-160),
同时开启win0的混合颜色模式。即可达到仅显示对话框部分透明,其余部分不透明的目的。

MASTERPOPY 发表于 2022-7-10 10:49:51

C语言源代码:
    SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240));//left, right
    SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(112, 160));//top bottom
    SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0, 240));//left, right
    SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, 112));//top bottom
    SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_CLR);//开启win0混合模式
    SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0);//混合bg0
    SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x10, 0x5));//混合参数

MASTERPOPY 发表于 2022-7-10 10:50:57

汇编版本源码:
        movs        r1, #240
        movs        r0, #64
        bl        SetGpuReg
        ldr        r1, =28832
        movs        r0, #68
        bl        SetGpuReg
        movs        r1, #240
        movs        r0, #66
        bl        SetGpuReg
        movs        r1, #112
        movs        r0, #70
        bl        SetGpuReg
        movs        r1, #32
        movs        r0, #72
        bl        SetGpuRegBits
        movs        r1, #1
        movs        r0, #80
        bl        SetGpuRegBits
        movs        r1, #162
        movs        r0, #82
        lsls        r1, r1, #3
        bl        SetGpuReg

MASTERPOPY 发表于 2022-7-10 11:16:53

参数参考网址:
https://www.cs.rit.edu/~tjh8300/CowBite/CowBiteSpec.htm#Windowing

jiangzhengwenjz 发表于 2022-7-11 10:58:14

我觉得把YES/NO也完全透明化才对、而不是用window把alpha blending的范围隔离开。如果没记错,那段原始代码会导致YES/NO外面一圈边框显示不正确(没变黑),但是也不难解决
页: [1]
查看完整版本: 透明对话框