网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月17日漏签0天
wpf吧 关注:3,848贴子:8,167
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 3 4 5 6 7 8 9 10 下一页 尾页
  • 639回复贴,共24页
  • ,跳到 页  
<<返回wpf吧
>0< 加载中...

我是WPF 高手,每天只回答一个问题

  • 只看楼主
  • 收藏

  • 回复
  • c252915138
  • 颇具盛名
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如题,把握机会,不要错过


  • 中年谢顶大叔
  • 颇具盛名
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
刚遇的问题,正在想办法,内存中new一个Canvas,不物理呈现的前提下,如何转化为本地的IMage图片文件,求贴出能运行的代码


2025-12-17 23:23:10
广告
不感兴趣
开通SVIP免广告
  • c252915138
  • 颇具盛名
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个问题我遇到过,以前在C/C++里面候经常用GDI保存内存流图片,WPF不能这样,
但有DrawingContext 类似GDI的功能,也不复杂
贴个函数:
private void SavePhoto(string fileName)
{
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
// 画矩形
Rect rect = new Rect(new Point(160, 100), new Size(520, 380));
drawingContext.DrawRectangle(Brushes.Red, (Pen)null, rect);
// 画文字
drawingContext.DrawText(
new FormattedText("陈冠希, world",
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface("Microsoft Yahei"),
36, Brushes.Green),
new Point(100, 60));
drawingContext.Close();
// 利用RenderTargetBitmap对象,以保存图片
RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)this.Width, (int)this.Height, 96, 96, PixelFormats.Pbgra32);
renderBitmap.Render(drawingVisual);
// 利用JpegBitmapEncoder,对图像进行编码,以便进行保存
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
// 保存文件
FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
encoder.Save(fileStream);
// 关闭文件流
fileStream.Close();
}
这种方法并不推荐
如果先呈现出来,然后导出图片,当然是最好的,你这种相当于在内存中画图,然后保存图片,GDI是最好的方法,最好是用winform来搞


  • 三台
  • 闻名一方
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
大神,请问,我想做一个类似flash的软件,用来给视频加一些舞台特效或者动态的图片修饰,可以编辑保存文件,都需要什么知识?


  • sharptim2012
  • 小有美名
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
大神,有没有控件样式或模版的xml库?


  • jpyhx
  • 锋芒毕露
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
请问一下在Storyboard中播放一个关于Viewbox的动画,当一次动画之后,Viewbox的位置不在准确是怎么回事?而且原来是TranslateTransformX,Y两个方向的动画,第二次只有一个方向的了,为什么?


  • jpyhx
  • 锋芒毕露
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Storyboard _storyboard = new Storyboard();
_vb.UpdateLayout();
_vb.Width = 100;
DoubleAnimation diappear = new DoubleAnimation(0.0, 1.0, new TimeSpan(0, 0, 0,1));
_vb.BeginAnimation(Viewbox.OpacityProperty, diappear);
_vb.Child = _autoPlayers[i]._imgface;
double Vx=_autoPlayers[i]._eventPosition.X;
//Canvas.SetLeft(_vb, Vx);
//Canvas.SetBottom(_vb, _autoPlayers[i]._eventPosition.Y);
double Vy=(_midPosition.Y + 7);
_vb.Margin = new Thickness(Vx,0,0,Vy);
_vb.Child = _autoPlayers[i]._imgface;
DoubleAnimationUsingKeyFrames xDAUKF = new DoubleAnimationUsingKeyFrames();
double x = -(_autoPlayers[i]._eventPosition.X - _midPosition.X + 50);
EasingDoubleKeyFrame xEDKF = new EasingDoubleKeyFrame(x, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 3)));
_storyboard.Children.Add(xDAUKF);
DoubleAnimationUsingKeyFrames yDAUKF = new DoubleAnimationUsingKeyFrames();
double y = _autoPlayers[i]._eventPosition.Y - _midPosition.Y / (MainWindow.tles.TimelinePositionPercent * 2);
EasingDoubleKeyFrame yEDKF = new EasingDoubleKeyFrame(y, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 3)));
yDAUKF.KeyFrames.Add(yEDKF);
_storyboard.Children.Add(yDAUKF);
xDAUKF.KeyFrames.Add(xEDKF);
Storyboard.SetTargetProperty(yDAUKF, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)"));
Storyboard.SetTargetName(yDAUKF, _vb.Name);
Storyboard.SetTargetProperty(xDAUKF, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"));
Storyboard.SetTargetName(xDAUKF, _vb.Name);
_storyboard.Completed += new EventHandler(_storyboard_Completed);
_storyboard.Begin(_vb);
_storyboard.Remove(_vb);


  • jpyhx
  • 锋芒毕露
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
_vb是Viewbox


2025-12-17 23:17:10
广告
不感兴趣
开通SVIP免广告
  • 我定要回来
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
private readonly DllImporter mDll = new DllImporter();
private string mFilePath = String.Empty;
private LayerNumber LayerNum = LayerNumber.LN_ONE;
private ParticleSystem[] mParticleSystem = new ParticleSytstemFire[(int)LayerNumber.LN_NUM];
public MainWindow()
{
InitializeComponent();
for (LayerNumber i = LayerNumber.LN_ONE; i < LayerNumber.LN_NUM; ++i)
{
mParticleSystem[Convert.ToInt32(i)] = new ParticleSytstemFire();
}
PropertyGrid1.SelectedObject = mParticleSystem[Convert.ToInt32(LayerNum)];
string a = Environment.CurrentDirectory + "\\libcocos2d.dll";
mDll.Open(a); // 这里会崩掉 里面执行 mDll(和前面的mDll不一样) = LoadLibrary(path);
mDll.Invoke<MInitializeApplication, bool>(Panel1.Handle.ToInt32());
}


  • 我定要回来
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我在WPF里面嵌套 <WindowsFormsHost HorizontalAlignment="Left" VerticalAlignment="Center" Name="windowsFormsHost2" Height="782" Margin="0,28,0,-9" Width="804" Grid.ColumnSpan="2">
<my:Panel x:Name="Panel1"></my:Panel>
</WindowsFormsHost>
这时候我要获取Panel x:Name="Panel1的句柄呢


  • 我定要回来
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
namespace MedusaSimulator
{
class DllImporter
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string path);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr lib, string funcName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr lib);
///
/// Loadlibrary 返回的函数库模块的句柄
///
private IntPtr mDll = IntPtr.Zero;
///
/// GetProcAddress 返回的函数指针
///
public IntPtr farProc = IntPtr.Zero;
public bool IsLoaded
{
get
{
return mDll != IntPtr.Zero;
}
}
public DllImporter()
{
//var myAssemblyName = new AssemblyName { Name = "DllImporter" };
//var myAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
//mModuleBuilder = myAssemblyBuilder.DefineDynamicModule("DllImporter");
}
public void Open(string path)
{
if (mDll == IntPtr.Zero)
{
mDll = LoadLibrary(path);
}
if (mDll == IntPtr.Zero)
{
throw (new Exception(" 没有找到 :" + path + "."));
}
}
public void Close()
{
if (mDll != IntPtr.Zero)
{
FreeLibrary(mDll);
mDll = IntPtr.Zero;
}
}
//private readonly ModuleBuilder mModuleBuilder;
private readonly Dictionary<Type, MethodInfo> mMethods = new Dictionary<Type, MethodInfo>();
public T InvokeMethod<T>() where T : class
{
var methodType = typeof(T);
var methodPtr = GetProcAddress(mDll, methodType.Name);
var callback = Marshal.GetDelegateForFunctionPointer(methodPtr, methodType);
return callback as T;
}
public TR Invoke<T, TR>(params object[] parameters) where T : class
{
var delegateType = typeof(T);
if (mMethods.ContainsKey(delegateType))
{
var methodInfo = mMethods[delegateType];
return (TR)methodInfo.Invoke(null, parameters);
}
var myAssemblyName = new AssemblyName { Name = "DllImporter" };
var myAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
var myModuleBuilder = myAssemblyBuilder.DefineDynamicModule("DllImporter");
var delegateMethod = delegateType.GetMethod("Invoke");
var paramInfos = delegateMethod.GetParameters();
var paramTypes = paramInfos.Select(parameterInfo => parameterInfo.ParameterType).ToArray();
var methodPtr = GetProcAddress(mDll, delegateType.Name);
var myMethodBuilder = myModuleBuilder.DefineGlobalMethod(delegateType.Name, MethodAttributes.Public | MethodAttributes.Static, delegateMethod.ReturnType, paramTypes);
var il = myMethodBuilder.GetILGenerator();
for (var i = 0; i < paramInfos.Length; i++)
{
il.Emit(OpCodes.Ldarg, i); //by value
//IL.Emit(OpCodes.Ldarga, i); //by ref
}
il.Emit(OpCodes.Ldc_I4, methodPtr.ToInt32());
//switch (IntPtr.Size)
//{
// case 4:
// il.Emit(OpCodes.Ldc_I4, methodPtr.ToInt32());
// break;
// case 8:
// il.Emit(OpCodes.Ldc_I8, methodPtr.ToInt64());
// break;
// default:
// throw new PlatformNotSupportedException();
//}
il.EmitCalli(OpCodes.Calli, CallingConvention.StdCall, delegateMethod.ReturnType, paramTypes);
il.Emit(OpCodes.Ret);
myModuleBuilder.CreateGlobalFunctions();
var myMethodInfo = myModuleBuilder.GetMethod(delegateType.Name);
mMethods[delegateType] = myMethodInfo;
return (TR)myMethodInfo.Invoke(null, parameters);
}
}
}
// 这是我的 DllImporter.cs文件


  • 我定要回来
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
// 这是我再MainWindow.xaml.cs 中去获得libcocos2d.dll的
private readonly DllImporter mDll = new DllImporter();
private string mFilePath = String.Empty;
private LayerNumber LayerNum = LayerNumber.LN_ONE;
private ParticleSystem[] mParticleSystem = new ParticleSytstemFire[(int)LayerNumber.LN_NUM];
public MainWindow()
{
InitializeComponent();
for (LayerNumber i = LayerNumber.LN_ONE; i < LayerNumber.LN_NUM; ++i)
{
mParticleSystem[Convert.ToInt32(i)] = new ParticleSytstemFire();
}
PropertyGrid1.SelectedObject = mParticleSystem[Convert.ToInt32(LayerNum)];
string a = Environment.CurrentDirectory + "\\libcocos2d.dll";
mDll.Open(a); // 这里会崩掉 里面执行 mDll(和前面的mDll不一样) = LoadLibrary(path);
mDll.Invoke<MInitializeApplication, bool>(Panel1.Handle.ToInt32());
}
//


  • c252915138
  • 颇具盛名
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
WPF里面的控件是没有句柄的,WPF中的控件不是传统的Win32控件,WPF中的元素是通过DirectX来绘制在屏幕上的,因此是没有HWND的。只有一个包装整个Window的对象才有一个句柄,就是我们可以在Spy++中看见的 HwndWrapper 类型,这个类型是用来包装WPF窗体的。如果你是在一个Win32/Winform中嵌入了一个WPF组件,这个组件其实也会通过这个类来包装,具体你可以使用Spy++来查看。下面我举个例子,比如你登陆一个用DirectX开发的游戏的时候, 有一个游戏登陆框, 这里面的输入框是抓不到句柄的,其实这里的输入框就相当于是画出来的,通过DX的一些基本函数绘制出的图形而已,并不是所谓Win32里面的独立的控件了。


  • 贴吧用户_068X4GJ
  • 小有名气
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
请问DataGrid里的行列的分割线怎么去除? 改颜色也行!


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 3 4 5 6 下一页 尾页
  • 639回复贴,共24页
  • ,跳到 页  
<<返回wpf吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示