|
这个函数用来替代游戏中的一个纹理绘制函数,在纹理上绘制文字,弹出显示纹理,类似气泡提示的效果。
所以无法自己创建纹理,只能得到游戏中的纹理指针。
实际纹理比弹出框大,函数的最后2个参数是实际显示弹出框的高和宽。
我的方法是下面这种,通过Gdi绘制文字,然后锁住纹理区域循环修改像素alpha值(GDI貌似不支持0xffffffff这种颜色)
需要知道的是有没有效率更高的方法。
void __stdcall DrawPopTexture(LPDIRECT3DTEXTURE9 lpTex,DWORD dwSrcX,DWORD dwSrcY,const PWCHAR pText,DWORD dwLen,DWORD dwColor,DWORD BoxH,DWORD BoxW)
{
RECT rect;
IDirect3DSurface9 *p_dds;
D3DSURFACE_DESC surfaceDesc;
D3DLOCKED_RECT lockedRect;
HDC hdc;
RECT box;
//D3DXSaveTextureToFileW(L"test.dds",D3DXIFF_DDS,lpTex,NULL);
lpTex->GetSurfaceLevel(0,&p_dds);
p_dds->GetDesc(&surfaceDesc);
p_dds->GetDC(&hdc);
SelectObject(hdc, hfont);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, 0xffffff);
SetRect(&box,0,0,BoxW,BoxH);
DrawTextW(hdc,pText,dwLen,&box,DT_CENTER | DT_EDITCONTROL | DT_WORDBREAK);
p_dds->ReleaseDC(hdc);
p_dds->Release();
//D3DXSaveTextureToFileW(L"test1.dds",D3DXIFF_DDS,lpTex,NULL);
lpTex->LockRect(0,&lockedRect,0,0);
DWORD* imageData = (DWORD*)lockedRect.pBits;
int index;
for(int i = 0; i < BoxH; i++)
{
for(int j = 0; j < BoxW; j++)
{
index = i * lockedRect.Pitch / 4 + j;
if (imageData[index] == 0x00ffffff)
imageData[index] = 0xffffffff;
}
}
lpTex->UnlockRect(0);
//D3DXSaveTextureToFileW(L"test2.dds",D3DXIFF_DDS,lpTex,NULL);
} |
|