会GDI绘图的朋友帮忙看看

Yun__ 2012-07-25 04:59:46


请问这样是数据结构错误了吗?

有谁可以帮我解答一下可能出现的情况么?

位图我是这样创建的

IntPtr TempHdc = GetDC(Hwnd);
Hdc = CreateCompatibleDC(TempHdc);
ReleaseDC(Hwnd, TempHdc);
//创建窗口
BITMAPINFO BMI = new BITMAPINFO();
BMI.bmiHeader.biSize = 40;
BMI.bmiHeader.biWidth = Size .cx ;
BMI.bmiHeader.biHeight = Size.cy;
BMI.bmiHeader.biPlanes = 1;
BMI.bmiHeader.biBitCount = 32;
BMI.bmiHeader.biSizeImage = BMI.bmiHeader.biWidth * BMI.bmiHeader.biHeight * 32 / 8;
hDIB = CreateDIBSection(Hdc, ref BMI,0,0,0,0);
SelectObject(Hdc, hDIB);

这样刷新的


Point TempPoint = new Point(0, 0);
BLENDFUNCTION TempBlend = new BLENDFUNCTION();

TempBlend.AlphaFormat = 1;
TempBlend.BlendFlags = 0;
TempBlend.BlendOp = 0;
TempBlend.SourceConstantAlpha = 255;

bool a = UpdateLayeredWindow(Hwnd, 0, ref Point, ref Size, Hdc, ref TempPoint, 0, ref TempBlend, 2);
其中申明是


struct BITMAPINFO
{
public BITMAPINFOHEADER bmiHeader;
public RGBQUAD bmiColors;
}
struct RGBQUAD
{
public byte rgbBlue;
public byte rgbGreen;
public byte rgbRed;
public byte rgbReserved;
}
struct BITMAPINFOHEADER
{
public uint biSize;
public int biWidth;
public int biHeight;
public short biPlanes;
public short biBitCount;
public int biCompression;
public int biSizeImage;
public int biXPelsPerMeter;
public int biYPelsPerMeter;
public int biClrUsed;
public int biClrImportant;
}

public struct BLENDFUNCTION
{
public byte BlendOp;
public byte BlendFlags;
public byte SourceConstantAlpha;
public byte AlphaFormat;
}

...全文
168 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yun__ 2012-07-26
  • 打赏
  • 举报
回复
重新说下问题

绘制出来的图像 会变成半 透明 鼠标也会穿透窗口

但是我检查了各种参数。 没发现那里是写成半透明的
都是 255

我原本以为是刷子出问题了 后来我又弄了图片

但是还是半透明的 并且还会直接透明过去

鼠标点击会穿透到下面的窗口

我怀疑是几个结构出问题了 下面是我画板所有代码 有会的朋友帮忙检查下哪里出问题了?

窗口为控制台 窗口风格为WS_VISIBLE | WS_SYSMENU 扩展风格为WS_EX_LAYERED 。



using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace dome_7_25
{
class ReceptionDraw
{
private Size Size =new Size (0,0);
private Point Point = new Point(0, 0);
private byte Alpha = 255;
private IntPtr Hwnd;
private IntPtr Hdc;
private IntPtr hDIB;
private IntPtr TempHdc;
public void DeleteDraw()
{
if (hDIB != IntPtr.Zero)
{
DeleteObject(hDIB);//销毁hDIB
}
if (Hdc != IntPtr.Zero)
{
DeleteDC(Hdc);//销毁Hdc
}
if (TempHdc != IntPtr .Zero )
{

ReleaseDC(Hwnd, TempHdc);
}
Alpha = 255;
Size.cx = 0;
Size.cy = 0;
Point.x = 0;
Point.y = 0;
Hwnd = IntPtr.Zero;
Hdc = IntPtr.Zero;
hDIB = IntPtr.Zero;
TempHdc =IntPtr .Zero ;
}
public IntPtr CreateDarw(IntPtr LHwnd, int x, int y, int Width, int hegiht)
{
if (LHwnd != IntPtr.Zero)
{

if (Hwnd == IntPtr.Zero)
{
DeleteDraw();
}
Hwnd = LHwnd;
Size TempSize = new Size(Width, hegiht);
Size = TempSize;
Point TempPoint = new Point(x, y);
Point = TempPoint;
//初始化数据完成


int EXSTYLE = GetWindowLong(Hwnd, GWL_EXSTYLE);
SetWindowLong(Hwnd, GWL_EXSTYLE, EXSTYLE | WS_EX_LAYERED);
//初始化窗口风格


TempHdc = GetDC(Hwnd);
Hdc = CreateCompatibleDC(TempHdc);
//创建Hdc
BITMAPINFO BMI = new BITMAPINFO();
BMI.bmiHeader.biSize = 40;
BMI.bmiHeader.biWidth = Size .cx ;
BMI.bmiHeader.biHeight = Size.cy;
BMI.bmiHeader.biPlanes = 1;
BMI.bmiHeader.biBitCount = 32;


BMI.bmiHeader.biSizeImage = BMI.bmiHeader.biWidth * BMI.bmiHeader.biHeight * 32 / 8;
hDIB = CreateDIBSection(Hdc,ref BMI,0,0,0,0);
SelectObject(Hdc, hDIB);

//创建位图


//创建完成
return Hdc;
}
return IntPtr .Zero ;
}
public void DrawRectangle(int Color , int x ,int y , int Widht , int hegith)
{
if (Color == -1)
{
Color = 0;
}else if(Color == 0)
{
Color = 1;
}


IntPtr khb = CreatePen(5, 0, 0);
IntPtr open = SelectObject(Hdc , khb);
IntPtr brush = CreateSolidBrush(Color);
IntPtr obrush = SelectObject(Hdc , brush);
Rectangle(Hdc, x, y, Widht , hegith );
SelectObject(Hdc, open);
SelectObject(Hdc, obrush);
DeleteObject(khb);
}

public bool UpdateLayered(byte? LAlpha)
{
byte temp;
if (LAlpha != null)
{
temp = LAlpha.Value;
Alpha = temp;
}
else
{
temp = Alpha;

}


Point TempPoint = new Point(0, 0);
BLENDFUNCTION TempBlend = new BLENDFUNCTION();

TempBlend.AlphaFormat = 1;
TempBlend.BlendFlags = 0;
TempBlend.BlendOp = 0;
TempBlend.SourceConstantAlpha = Alpha;

bool a = UpdateLayeredWindow(Hwnd, 0, ref Point, ref Size, Hdc, ref TempPoint, 0, ref TempBlend, 2);
return a;
}
public void DrawBitmap(IntPtr Bitmap ,int x,int y)
{


IntPtr dmc=CreateCompatibleDC (TempHdc );
BITMAP bmps = new BITMAP();
GetObject (Bitmap ,7*4,ref bmps);
Point temppoint =new Point (bmps .bmWidth ,bmps .bmHeight );
IntPtr oldbitmap = SelectObject (dmc,Bitmap );
int a= BitBlt (Hdc ,x,y,temppoint .x,temppoint.y ,dmc,0,0,13369376);
SelectObject (dmc,oldbitmap );
DeleteObject (dmc);
}

public const byte AC_SRC_OVER = 0x00;
public const byte AC_SRC_ALPHA = 0x01;

public const int GWL_EXSTYLE = -20;
public const int WS_EX_LAYERED = 0x00080000;

[DllImport("gdi32.dll")]
public static extern int BitBlt(
IntPtr hDestDC,
int x,
int y,
int nWidth,
int nHeight,
IntPtr hSrcDC,
int xSrc,
int ySrc,
int dwRop);//创建画笔


[DllImport("user32.dll",EntryPoint = "LoadImageA")]
public static extern IntPtr LoadImage(
int hInst,
string lpsz,
int un1,
int n1,
int n2,
int un2);//创建画笔

[DllImport("gdi32.dll",EntryPoint = "GetObjectA")]
public static extern IntPtr GetObject(
IntPtr hInst,
int size,
ref BITMAP un1);//创建画笔
[DllImport("gdi32.dll")]
public static extern IntPtr CreatePen(
int Style,
int width,
int color);//创建画笔
[DllImport("gdi32.dll")]
public static extern IntPtr CreateSolidBrush(
int color);//创建纯色刷子
[DllImport("gdi32.dll")]
public static extern int Rectangle(
IntPtr HDC,
int x,
int y,
int width,
int height);//Rectangle
[DllImport("user32.dll", EntryPoint = "SetWindowLongA")]
public static extern int SetWindowLong(
IntPtr hwnd,
int nIndex,
int dwNewLong);//设置风格
[DllImport("user32.dll", EntryPoint = "GetWindowLongA")]
public static extern int GetWindowLong(
IntPtr hwnd,
int nIndex);//获取风格


[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(
IntPtr hdc,
IntPtr hobject);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象

[DllImport("gdi32.dll")]
public static extern IntPtr CreateDIBSection(
IntPtr Hwdc,
ref BITMAPINFO pBitmapInfo,
int un,
int lplpVoid,
int handle,
int dw);//创该函数创建应用程序可以直接写入的、与设备无关的位图(DIB)。该函数提供一个指针,该指针指向位图位数据值的地方。可以给文件映射对象提供句柄,函数使用文件映射对象来创建位图,或者让系统为位图分配内存

[DllImport("user32.dll")]
public static extern IntPtr ReleaseDC(
IntPtr Hwnd,
IntPtr Hdc);//函数释放设备上下文环境(DC)供其他应用程序使用。函数的效果与设备上下文环境类型有关。它只释放公用的和设备上下文环境,对于类或私有的则无效

[DllImport("Gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(
IntPtr hdc);//该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联

[DllImport("gdi32.dll")]
public static extern int DeleteDC(
IntPtr Hdc);//该函数删除指定的设备上下文环境(Dc)
[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
public static extern bool UpdateLayeredWindow(
IntPtr hwnd,
int hdcDst,
ref Point pptDst,
ref Size psize,
IntPtr hdcSrc,
ref Point pprSrc,
int crKey,
ref BLENDFUNCTION pblend,
int dwFlags);//刷新函数
[DllImport("gdi32.dll")]
public static extern int DeleteObject(
IntPtr hObject);//该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了

[DllImport("user32.dll")]
public static extern IntPtr GetDC(
IntPtr Hwnd);//创建一个上下文环境
}

struct BITMAPINFO
{
public BITMAPINFOHEADER bmiHeader;
public RGBQUAD bmiColors;
}
struct RGBQUAD
{
public byte rgbBlue;
public byte rgbGreen;
public byte rgbRed;
public byte rgbReserved;
}
struct BITMAP
{
public int bmType;
public int bmWidth;
public int bmHeight;
public int bmWidthBytes;
public int bmPlanes;
public int bmBitsPixel;
public byte bmBits;
}
struct BITMAPINFOHEADER
{
public uint biSize;
public int biWidth;
public int biHeight;
public short biPlanes;
public short biBitCount;
public int biCompression;
public int biSizeImage;
public int biXPelsPerMeter;
public int biYPelsPerMeter;
public int biClrUsed;
public int biClrImportant;
}

public struct BLENDFUNCTION
{
public byte BlendOp;
public byte BlendFlags;
public byte SourceConstantAlpha;
public byte AlphaFormat;
}

[StructLayout(LayoutKind.Sequential)]
public struct Point
{
public int x;
public int y;
public Point(int x, int y)
{
this = new Point();
this.x = x;
this.y = y;
}
}

[StructLayout(LayoutKind.Sequential)]
public struct Size
{
public int cx;
public int cy;
public Size(int cx, int cy)
{
this = new Size();
this.cx = cx;
this.cy = cy;
}

}
}


Yun__ 2012-07-26
  • 打赏
  • 举报
回复
对了 鼠标也会穿透过去。 不能发源码 坑的。
Yun__ 2012-07-26
  • 打赏
  • 举报
回复
GDI 复制 刷新比GDI+ 速度快一些 用来做最后处理 也可以全局控制透明度 现在这样创建也能像迅雷那样的伸缩窗口 感觉比较方便。
长江支流 2012-07-26
  • 打赏
  • 举报
回复
直接用GDI+
Yun__ 2012-07-26
  • 打赏
  • 举报
回复
变成半透明了。 但是我刷新的时候TempBlend.SourceConstantAlpha 是255 这样就是全部不透明的。
dylike 2012-07-25
  • 打赏
  • 举报
回复
不知道你的问题是什么
  • 打赏
  • 举报
回复
没时间玩这种低级的GDI啊。
stonespace 2012-07-25
  • 打赏
  • 举报
回复
你没初始化DIB位图?
NewUser2008 2012-07-25
  • 打赏
  • 举报
回复
出了什么问题,你的目的是什么?
maji_lulu 2012-07-25
  • 打赏
  • 举报
回复
你这个有错误吗?

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧