应该不是单击时吧?
应该是获得焦点吧?
设置这个button1Focus()
或者设置button1IsDefault = True(如果你做了这个Trigger的话)
一 介绍
本文将以一个实例来说明如何将WPF技术集成在基于MFC的应用程序中 这种技术的主要目的是为了增强基于Win /MFC的应用程序的在图形方面的表现能力 本文所提供的演示程序将在MFC对话框架应用程序中显示一个WPF动画时钟 界面如图 所示
本文需要的开发工具和开发库 为了建立和运行demo程序 我们需要安装如下的组件
Visual Studio 或Visual Studio NET Framework 或 NET Framework
所需要的平台 demo程序必须在下面支持 NET Framework 的 *** 作系统平台上运行
Windows Vista Windows XP SP Windows Server SP
如果你是一名C++开发人员 并且想使用WPF技术来增强自己的基于Win /MFC应用程序 本文非常适合你 为了能从本文学习到更多的知识 我们需要熟悉VC++/CLi MFC XAML和C# 但是 如果我们不了解C#或XAML 我们仍然可以通过引用现成的DLL来使用WPF程序
二 什么是WPF
WPF是Windows Presentation Foundation的缩写 它是微软 NET Framework 的一个子系统 这种技术允许开发人员高效地创建可视化的应用程序 并改善用户体验 由于WPF的发布 使用Windows程序在富控件的设计 开发上更如虎添翼 WPF主要关注一套应用程序服务 用户接口 D和 D 矢量图 动画 数据绑字 音频 并提供一个在UI和商业逻辑之间的非常清晰的界限
WPF API是被管制的代码 但是大多数Win /MFC程序是非管制的C++代码 按著惯例 WPF API不能通过非常制程序调用 然后 通过使用VC编译器的/clr选项 我们可以建立一个由管制和非管制混合而面的系统 在这个系统中 我们可以使管制和非管制代码无缝地混合在一起
有一个要注意的是在C++工程中不允许编译XAML文件 因此 我们必须建立一个包含在本例中所需要的所有XAML而的C# DLL 然后在C++工程中包含这个Dll引用
有两种基本的技术可以融合WPF和Win /MFC代码
将WPF放到Win /MFC程序中 使用这种技术 开发人员可以使用WPF的高级图形能力来渲染Win /MFC应用程序
将Win /MFC放到WPF中 使用这种技术 开发人员可以在WPF中使用已经存在的
Win /MFC控件 并通过一定的机制来传递数据
在本文中将采用第一种方法
三 融合Win /MFC和WPF程序
上面部分所说的是本例的基本规则 下面在本节中将介绍如何编写具体的实现代码 在本例中 我首先会演示使用XAML和C#建立WPF内容 并在VC++中引用这个DLL
本例的目的是建立一个用于设置日期和时间的设置工具 其中动画部分使用WPF实现 程序的其他部分仍然使用MFC实现
这个演示程序由两部分组成 一个是MFCHostMPF(由VC++/MFC代码组成) 另一个是WPFControls(由XAML和C#代码组成) 这个MFCHostWPF工程将由WPFControls工程所产生的DLL作为一个外部的引用 如图 所示
向MFC工程中加入一个WPF引用 如图 和图 所示
三 在MFC应用程序中加入和WPF相关的代码
先提一下 gcnew关键字被用于建立一个管制类型的实例 在本例中将建立一个垃圾回收集合栈的实例 所有被gcnew分配的内存空间将被垃圾回收器自动管理 而开发人员并不需要为什么时间释放它们而 *** 心
为了使用WPF程序 关键是System::Windows::Interop::HwndSource类 这个类将在Win 窗口中使用WPF程序 因此 WPF程序可以作为MFC窗口的子窗口放到UI上 而在WPF对象和Win 窗口之间的通讯要通过引用C++程序中被存储的静态字段 这些静态字段的代码如下
ref class Globals { public: static System::Windows::Interop::HwndSource^ gHwndSource; static WPFControls::AnimClock^ gwcClock; };
HWND hwndWPF; // 和WPF相关的hwnd 为了建立一个HwndSource 首先需要建立一个HwndSourceParameters结构 这个结构需要如下的参数 类 窗口 窗口类型 窗口的初始位置 窗口的初始尺寸 父窗口 一但我们将HwndSourceParameters结构编写完 就可以将这个结构到HwndSource的构造方法HwndSource(HwndSourceParameters)中 最后 我们将WPF时钟的引用赋值给HwndSource对象的RootVisual属性 并通过调用Handle ToPointer()返回HwndSource的HWND 代码如下HWND GetHwnd(HWND parent int x int y int width int height) { System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew System::Windows::Interop::HwndSourceParameters ( MFCWPFApp ); sourceParams >PositionX = x; sourceParams >PositionY = y; sourceParams >Height = height; sourceParams >Width = width; sourceParams >ParentWindow = IntPtr(parent); sourceParams >WindowStyle = WS_VISIBLE | WS_CHILD; Globals::gHwndSource = gcnew System::Windows::Interop::HwndSource(sourceParams); DateTime tm = DateTime::Now; Globals::gwcClock = gcnew WPFControls::AnimClock(); Globals::gwcClock >ChangeDateTime(tm Year tm Month tm Day tm Hour tm Minute tm Second); FrameworkElement^ myPage = Globals::gwcClock; Globals::gHwndSource >RootVisual = myPage; return (HWND) Globals::gHwndSource >Handle ToPointer(); }
因此 无论用户如何变化时钟 我们的MFC代码都会调用RefereshWPFControl()来刷新WPF时钟void RefreshWPFControl() { FrameworkElement^ page; DateTime tm = DateTime::Now; Globals::gwcClock >ChangeDateTime(tm Year tm Month tm Day tm Hour tm Minute tm Second); page = Globals::gwcClock; Globals::gHwndSource >RootVisual = page; return; }
现在我们已经有了大部分我们需要的功能了 而最后的任务是在MFC对话框代码中找个地方调用HwndSource实现创建函数 当然 有很多地方可以做这个工作 但是OnCreate也许是最好的位置 在OnCreate事件句柄中调用GetHwnd()函数的代码如下int CMFCHostWPFDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == ) return ; hwndWPF = GetHwnd(this >GetSafeHwnd() ); return ; }
四 结论 lishixinzhi/Article/program/net/201311/11996
如果不是工作需要,不建议学 WPF。它相对于 ASPNET Core 来说找工作的路径更窄。ASPNET Core 技术栈工作机会更多,学起来也比 WPF 更轻松,更容易找到成就感。
另外,ASPNET Core Blazor 也可以开发桌面应用,基于 WASM,性能可以接近原生,可以满足大部分 *** 作实时性要求较高的场景。
目前微软定位 NET 平台未来的桌面应用的产品线主要是 MAUI、WinUI 和 Blazor。除了 Blazor,MAUI、WinUI 和 WPF 技术点和编程思想都差不多,像 Prism 这类的框架也可以通用,基本上可以一学多用。所以,只要你熟悉其中之一,不管后面主流 NET 原生桌面技术框架怎么变化,你都可以轻松切换。
如果你毅然要学习 WPF,并“ 获得编程的完整经验 ”,下面是我觉得适用于大多数技术学习的通用路径:
1、学习语言基础(C#),看书或看视频都可以,网上资源很多。
2、学习框架(WPF、Prism 等)的使用,同时要掌握框架的编程思想。WPF 框架相关的书比较少,即使有也很老旧,可以去 B 站找找视频教程。
3、学习和模仿优秀的开源项目,从易到难,去 GitHub 找开源项目研究,然后参考模仿,自己动手做一个类似的项目。
4、整理自己学到的技能和知识点,经过整理后,用文章或视频的方式讲述给其他人看。制定计划,不断坚持。
以上,个人浅见,仅供参考。
Maui是一个高层次框架,底层在Windows上是用winUI3,在其他平台上是用其他平台的UI组件,不是一个级别的东西,不要搞混了
买本《实战》之类的书参考一下,当然最好的经验必须从实践中来。自己尝试写一个项目,比如把书上的例子弄完善,做过自然知道什么是需要懂的。反正你不是求职,慢慢来。
usercontrol本身是自定义的东西,怎么可能会获取到MyWindow里的东西,除非你自己写方法,然后mywindow在使用usercontrol的时候给你写的方法传递你需要让usercontrol接受的东西。
控制命令源控件的IsEnabled属性。根据查询WPF的官网得知,canexecute作用是用来控制命令源控件的IsEnabled属性。WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于NET Framework 30的一部分。
命名空间:SystemDrawing
程序集:SystemDrawing(在 systemdrawingdll 中)
封装一个 GDI+ 绘图图面。无法继承此类。
C# 用法
public sealed class Graphics : MarshalByRefObject, IDeviceContext, IDisposable
SystemDrawingPen myPen = new SystemDrawingPen(SystemDrawingColorRed);//画笔
SystemDrawingSolidBrush myBrush = new SystemDrawingSolidBrush(SystemDrawingColorRed);//画刷
SystemDrawingGraphics formGraphics = thisCreateGraphics();
formGraphicsFillEllipse(myBrush, new Rectangle(0,0,100,200));//画实心椭圆
formGraphicsDrawEllipse(myPen, new Rectangle(0,0,100,200));//空心圆
formGraphicsFillRectangle(myBrush, new Rectangle(0,0,100,200));//画实心方
formGraphicsDrawRectangle(myPen, new Rectangle(0,0,100,200));//空心矩形
formGraphicsDrawLine(myPen, 0, 0, 200, 200);//画线
formGraphicsDrawPie(myPen,90,80,140,40,120,100); //画馅饼图形 //画多边形
formGraphicsDrawPolygon(myPen,new Point[]{ new Point(30,140), new Point(270,250), new Point(110,240), new Point (200,170), new Point(70,350), new Point(50,200)}); //清理使用的资源
myPenDispose();
myBrushDispose();
formGraphicsDispose();
使用Graphics对象绘制线条和形状、呈现文本或显示与 *** 作图像,所用到的属性和方法如表所示。
graphics方法-属性
名称
说明
Clip 获取或设置 Region,该对象限定此 Graphics 的绘图区域。
ClipBounds 获取一个 RectangleF 结构,该结构限定此 Graphics 的剪辑区域。
CompositingMode 获取一个值,该值指定如何将合成图像绘制到此 Graphics。
CompositingQuality
获取或设置绘制到此 Graphics 的合成图像的呈现质量。
DpiX 获取此 Graphics 的水平分辨率。
DpiY 获取此 Graphics 的垂直分辨率。
InterpolationMode 获取或设置与此 Graphics 关联的插补模式。
IsClipEmpty 获取一个值,该值指示此 Graphics 的剪辑区域是否为空。
IsVisibleClipEmpty 获取一个值,该值指示此 Graphics 的可见剪辑区域是否为空。
PageScale 获取或设置此 Graphics 的全局单位和页单位之间的比例。
PageUnit 获取或设置用于此 Graphics 中的页坐标的度量单位。
PixelOffsetMode 获取或设置一个值,该值指定在呈现此 Graphics 的过程中像素如何偏移。
RenderingOrigin 为抵色处理和阴影画笔获取或设置此Graphics 的呈现原点。
SmoothingMode 获取或设置此 Graphics 的呈现质量。
TextContrast 获取或设置呈现文本的灰度校正值。
TextRenderingHint 获取或设置与此 Graphics 关联的文本的呈现模式。
Transform
获取或设置此Graphics 的世界变换。
VisibleClipBounds 获取此 Graphics 的可见剪辑区域的边框。
graphics方法-方法
名称
说明
AddMetafileComment
向当前 Metafile 添加注释。
BeginContainer
保存具有此 Graphics 的当前状态的图形容器,然后打开并使用新的图形容器。可重载。
Clear
清除整个绘图面并以指定背景色填充。
CopyFromScreen
执行颜色数据从屏幕到 Graphics 的绘图图面的位块传输。可重载。
CreateObjRef
创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (从 MarshalByRefObject 继承。)
Dispose
释放由Graphics使用的所有资源。
DrawArc
绘制一段弧线,它表示由一对坐标、宽度和高度指定的椭圆部分。可重载。
DrawBezier
绘制由4个Point 结构定义的贝塞尔样条。可重载。
DrawBeziers
用 Point 结构数组绘制一系列贝塞尔样条。可重载。
DrawClosedCurve
绘制由 Point 结构的数组定义的闭合基数样条。可重载。
DrawCurve
绘制经过一组指定的 Point 结构的基数样条。可重载。
DrawEllipse
绘制一个由边框(该边框由一对坐标、高度和宽度指定)定义的椭圆。可重载。
DrawIcon
在指定坐标处绘制由指定的 Icon 表示的图像。可重载。
DrawIconUnstretched
绘制指定的 Icon 表示的图像,而不缩放该图像。
DrawImage
在指定位置并且按原始大小绘制指定的 Image。可重载。
DrawImageUnscaled
在由坐标对指定的位置,使用图像的原始物理大小绘制指定的图像。可重载。
DrawImageUnscaled AndClipped
在不进行缩放的情况下绘制指定的图像,并在需要时剪辑该图像以适合指定的矩形。
DrawLine
可重载。绘制一条连接由坐标对指定的两个点的线条。
DrawLines
可重载。绘制一系列连接一组Point结构的线段。
DrawPath
绘制GraphicsPath。
DrawPie
可重载。绘制一个扇形,该形状由一个坐标对、宽度、高度以及两条射线所指定的椭圆定义。
DrawPolygon
可重载。绘制由一组 Point 结构定义的多边形。
DrawRectangle
可重载。绘制由坐标对、宽度和高度指定的矩形。
DrawRectangles
绘制一系列由 Rectangle 结构指定的矩形。可重载。
DrawString
在指定位置并且用指定的Brush 和Font对象绘制指定的文本字符串。可重载。
EndContainer
关闭当前图形容器,并将此Graphics的状态还原到通过调用BeginContainer方法保存的状态。
EnumerateMetafile
将指定Metafile中的记录逐个发送到回调方法以在指定的点处显示。可重载。
Equals
已重载。 确定两个 Object 实例是否相等。 (从 Object 继承。)
ExcludeClip
更新此Graphics的剪辑区域,以排除Rectangle结构所指定的区域。可重载。
FillClosedCurve
填充由 Point 结构数组定义的闭合基数样条曲线的内部。可重载。
FillEllipse
填充边框所定义的椭圆的内部,该边框由一对坐标、一个宽度和一个高度指定。可重载。
FillPath
填充 GraphicsPath 的内部。
FillPie
填充由一对坐标、一个宽度、一个高度以及两条射线指定的椭圆所定义的扇形区的内部。可重载。
FillPolygon
可重载。 填充 Point 结构指定的点数组所定义的多边形的内部。
FillRectangle
填充由一对坐标、一个宽度和一个高度指定的矩形的内部。可重载。
FillRectangles
填充由 Rectangle 结构指定的一系列矩形的内部。可重载。
FillRegion
填充Region的内部。
Flush
强制执行所有挂起的图形 *** 作并立即返回而不等待 *** 作完成。可重载。
FromHdc
从设备上下文的指定句柄创建新的Graphics。可重载。
FromHdcInternal
返回指定设备上下文的Graphics。
FromHwnd
从窗口的指定句柄创建新的Graphics。
FromHwndInternal
创建指定 Windows 句柄的新Graphics。
FromImage
从指定的Image创建新的Graphics。
GetHalftonePalette
获取当前Windows的半色调调色板的句柄。
GetHashCode
用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 (从 Object 继承。)
GetHdc
获取与此Graphics关联的设备上下文的句柄。
GetLifetimeService
检索控制此实例的生存期策略的当前生存期服务对象。 (从 MarshalByRefObject 继承。)
GetNearestColor
获取与指定的Color结构最接近的颜色。
GetType
获取当前实例的 Type。 (从 Object 继承。)
InitializeLifetimeService 获取控制此实例的生存期策略的生存期服务对象。 (从 MarshalByRefObject 继承。)
IntersectClip
将此Graphics的剪辑区域更新为当前剪辑区域与指定 Rectangle 结构的交集。可重载。
IsVisible
指示由一对坐标指定的点是否包含在此 Graphics 的可见剪辑区域内。可重载。
MeasureCharacterRanges
获取Region对象的数组,其中每个对象将字符位置的范围限定在指定字符串内。
MeasureString
测量用指定的 Font 绘制的指定字符串。可重载。
MultiplyTransform
将此 Graphics 的世界变换乘以指定的 Matrix。可重载。
ReferenceEquals
确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。)
ReleaseHdc
释放通过以前对此 Graphics 的 GetHdc 方法的调用获得的设备上下文句柄。可重载。
ReleaseHdcInternal
释放设备上下文的句柄。
ResetClip
将此 Graphics 的剪辑区域重置为无限区域。
ResetTransform
将此 Graphics 的世界变换矩阵重置为单位矩阵。
Restore
将此 Graphics 的状态还原到 GraphicsState 表示的状态。
RotateTransform
将指定旋转应用于此 Graphics 的变换矩阵。可重载。
Save
保存此 Graphics 的当前状态,并用 GraphicsState 标识保存的状态。
ScaleTransform
将指定的缩放 *** 作应用于此 Graphics 的变换矩阵,方法是将该对象的变换矩阵左乘该缩放矩阵。可重载。
SetClip
将此 Graphics 的剪辑区域设置为指定 Graphics 的 Clip 属性。可重载。
ToString
返回表示当前 Object 的 String。 (从 Object 继承。)
TransformPoints
使用此 Graphics 的当前世界变换和页变换,将点数组从一个坐标空间转换到另一个坐标空间。可重载。
TranslateClip
将此 Graphics 的剪辑区域沿水平方向和垂直方向平移指定的量。可重载。
TranslateTransform
通过使此Graphics的变换矩阵左乘指定的平移来更改坐标系统的原点。可重载。
在做好一个WPF的程序后,有时候想让它的部分功能以服务的形式安装到Windows系统中,然后以Windows服务的方式运行,而图形界面仅作该服务的配置用途。在此记录一下开发的步骤以备忘。
上面程序中,Main()里决定了,如果程序是带w、/w或者-w参数启动的,那么让它以服务的方式运行,否则调用UIMode()进入图形界面非服务模式。
26 在解决方案浏览器上点右键在d出菜单中点“属性Properties”,在d出的项目的属性里,将入口点改成Program类如下图:
至此,改装就完成了,只需要将服务妥妥地安装好就行了,注意启动命令要带参数w、/w或者-w。
达叔傻乐( darwinzuo@163com )
以上就是关于Wpf 中当加载一个Windows时,怎样去默认的选中Windows上的一个Button全部的内容,包括:Wpf 中当加载一个Windows时,怎样去默认的选中Windows上的一个Button、在MFC中使用WPF技术、自学C#WPF怎么获得编程的完整经验等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)