ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

gdi绘制的文字在win7和win8下变透明的解决方案

2021-07-29 21:31:27  阅读:320  来源: 互联网

标签:win8 bmiHeader win7 bitmapInfo vision gdi BYTE bitmap rect


问题是这样的,使用gdi绘制带文本的窗口,在win7和win8下显示的时候有时候文本会变成透明的,显示的时候会穿透过去,显示出后面的背景颜色。

具体现象如下图所示:

先说一下原因吧,在绘制文字的时候,在win7和win8下颜色不支持Alpha通道,导致绘制的文字的透明度,变成一个随机值,不一定是255,这就导致在有些情况下透明度可能变成0导致文字显示变成透明。

针对问题的解决方案是遍历绘制文本的每个像素点,然后将透明度修改为255,修改的代码示例如下所示:

#include <win_version.h>
//创建位图的时候拿到位图的数据指针
//然后依据数据指针取进行像素处理
BYTE* createBitmap(HBITMAP &bitmap, int width, int height)
{
    BYTE * pDIBBits = nullptr;
    BITMAPINFO bitmapInfo = { 0 };
    bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bitmapInfo.bmiHeader.biWidth = width;
    bitmapInfo.bmiHeader.biHeight = height;
    bitmapInfo.bmiHeader.biPlanes = 1;
    bitmapInfo.bmiHeader.biBitCount = 32;
    bitmapInfo.bmiHeader.biCompression = BI_RGB;
    bitmapInfo.bmiHeader.biSizeImage = 0;
    bitmapInfo.bmiHeader.biXPelsPerMeter = 0;
    bitmapInfo.bmiHeader.biYPelsPerMeter = 0;
    bitmapInfo.bmiHeader.biClrUsed = 0;
    bitmapInfo.bmiHeader.biClrImportant = 0;
    bitmap = CreateDIBSection(nullptr, &bitmapInfo, 
    DIB_RGB_COLORS, (VOID**)&pDIBBits, nullptr, 0);
	return pDIBBits;
}
//将对应像素点的透明度修改为255
void modify_alpha_value(BYTE* bitmap_bits,Rect vision_rect){
    WinVer winver;
	if (!winver.IsWin10())
	{    //win10不需要做透明度修正
        struct RGBALPHA
        {
        BYTE rgbBlue;
        BYTE rgbGreen;
        BYTE rgbRed;
        BYTE rgbAlpha;
        };
        auot get_rgb_alpha= [&](int pos_x,int pos_y)->RGBALPHA*{
             return (RGBALPHA*)bitmap_bits+ (pos_y) * vision_rect.Width + (pos_x)       
        };
        for (size_t y = vision_rect.Y; y < (vision_rect.Y + vision_rect.Height); y++)
        {
            for (size_t x = vision_rect.X; x < (vision_rect.X + vision_rect.Width); x++)
            {
            
            	if (bitmap_bits != nullptr)
            	{
            		RGBALPHA *ppxl = get_rgb_alpha(x, y);
            		if (ppxl->rgbAlpha != 255)
            			ppxl->rgbAlpha = 255;
            	}
            
            }
        }
    }    
}
void onPaint()
{
    //创建200*200的位图
    BITMAP bitmap;
    BYTE* bit_info = createBitmap(bitmap, 200,200);
    ......//进行对应的绘制操作
    Rect update_rect; //需要刷线显示透明字的文字区域
    modify_alpha_value(bit_info,update_rect);
}

文字变透明这个问题,跟平台相关,并且还是在特殊场景下触发,比较诡异,很难发现,建议在win7/win8下进行gdi文字绘制的时候,都对文字透明度进行修正,这样就能规避这个问题了。希望有帮助。

标签:win8,bmiHeader,win7,bitmapInfo,vision,gdi,BYTE,bitmap,rect
来源: https://blog.csdn.net/yang1fei2/article/details/119221031

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有