1. 在MFC中使用WPF技術
一 介紹
本文將以一個實例來說明如何將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 ; }
四 結論 lishixin/Article/program/net/201311/11996
2. 能用C語言寫程序嗎例如WPF或能在win7上運行的軟體
打開VS2010,新建一個工程,語言選擇C#,再選擇WPFApplication項目,確定之後就生成了一個最簡單的WPF應用軟體,
想要快點做出軟體,我建議你直接用C#,然後去借本WPF的書入門下,想通過C語言做這個很麻煩很麻煩的,就不要想了(C語言了解下語法和和計算機思維就可以了)。一般的人在大學里都會向樓上的人說的一樣,先用C語言做些什麼貪吃蛇,俄羅斯方塊之類的小游戲,但我強烈不推薦這樣,C#比C語言簡單得到,做軟體出來也快得多,用C語言或者C++的話就得學習MFC(這個是微軟很老很老的技術,不必再學了,WPF是微軟最新的一帶桌面編程框架),想做QQ就用WPF做一個QQ出來(相信我那不是很難),裡面也只涉及到一些通信技術而已,網上找些資料很容易的,千萬不要別大學里老師教C語言那些類似的笨方法消磨了人對計算機的興趣~
不懂可以問我,就別再用VisualC++,MFC這些古董了,了解C#的語法,熟悉下WPF這個框架,做些自己喜歡的小軟體來支持自己的興趣才是的
3. wpf中怎麼把用戶控制項中image的單擊事件用委託的方法在窗體中實現
在WPF中,你可以使用事件和委託來實現用戶控制項中Image的單擊事件。下面是一個簡單的示例,展示如何在窗體中實現用戶控制項中Image的單擊事件。
首先,在你的用戶控制項中,添加一個名為ImageClicked的事件。這個事件將用於在用戶點擊Image時觸發。
xaml復制代碼
<UserControl x:Class="YourNamespace.YourUserControl" ...>
<Image Source="your_image_source.png" Click="Image_Click"/>
</UserControl>
csharp復制代碼
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace YourNamespace
{
public partial class YourUserControl : UserControl
{
public YourUserControl()
{
InitializeComponent();
}
// 添加ImageClicked事件
public event RoutedEventHandler ImageClicked;
private void Image_Click(object sender, RoutedEventArgs e)
{
// 當Image被點擊時,觸發ImageClicked事件
ImageClicked?.Invoke(this, e);
}
}
}
接下來,在你的窗體代碼中,你可以訂閱ImageClicked事件,並在事件處理程序中執行你想要的操作。
xaml復制代碼
<Window x:Class="YourNamespace.YourWindow" ...>
<local:YourUserControl ImageClicked="YourUserControl_ImageClicked"/>
</Window>
csharp復制代碼
using System.Windows;
using System.Windows.Controls;
namespace YourNamespace
{
public partial class YourWindow : Window
{
public YourWindow()
{
InitializeComponent();
}
private void YourUserControl_ImageClicked(object sender, RoutedEventArgs e)
{
// 在這里處理Image的單擊事件
// 例如,顯示一個消息框
MessageBox.Show("Image被點擊了!");
}
}
}
這樣,當用戶點擊用戶控制項中的Image時,窗體中定義的YourUserControl_ImageClicked方法將被調用,你可以在其中執行你想要的操作。