【例程】C++/CLI使用WPF
acmilan2016/02/01软件综合 IP:天津
WPF程序通常使用C#或VB配合XAML编写,微软没有给C++/CLI提供WPF和XAML支持(后续版本C++/CX加上了XAML支持,但是C++/CX只能用于应用商店),但是实际上C++/CLI仍然可通过完全的代码方式使用WPF。本程序用纯C++/CLI代码实现了一个简易的WPF程序,证明使用C++/CLI访问WPF是可行的。

另外,编写C++/CLI程序最好使用VS2005/2008或VS2012以上版本,VS2010的IntelliSense不支持C++/CLI。

代码如下:
<code class="lang-cpp">// wpfcli2.cpp: 主项目文件。

#include "stdafx.h"

// 编译为GUI程序而不是控制台程序,同时使用main为入口点
#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:main")

using namespace System;
// 需要添加这两个命名空间
using namespace System::Windows;
using namespace System::Windows::Controls;
     
// 除此之外,还需要添加以下程序集的引用
// PresentationCore
// PresentationFramework
// WindowBase

ref class MyMainWindow : public Window
{
    TextBlock ^txt1;
    TextBlock ^txt2;
    TextBlock ^txt3;
    TextBox ^tb1;
    TextBox ^tb2;
    TextBox ^tb3;
    Button ^btnOK;
    Button ^btnCancel;

public:
    MyMainWindow()
    {
        // 设定窗口属性
        this->Title = L"用户信息";
        this->Width = 400; this->Height = 250;

        // 根表格
        Grid ^rootgrid = gcnew Grid(); // 建立对象
        rootgrid->Margin = Thickness(20); // 设置边界宽度
        this->Content = rootgrid; // 附加到窗口

        // 设定表格行高
        RowDefinition ^row;
        row = gcnew RowDefinition(); row->Height = GridLength(25); rootgrid->RowDefinitions->Add(row);
        row = gcnew RowDefinition(); row->Height = GridLength(10); rootgrid->RowDefinitions->Add(row);
        row = gcnew RowDefinition(); row->Height = GridLength(25); rootgrid->RowDefinitions->Add(row);
        row = gcnew RowDefinition(); row->Height = GridLength(10); rootgrid->RowDefinitions->Add(row);
        row = gcnew RowDefinition(); row->Height = GridLength(25); rootgrid->RowDefinitions->Add(row);
        row = gcnew RowDefinition(); row->Height = GridLength(10); rootgrid->RowDefinitions->Add(row);
        row = gcnew RowDefinition(); row->Height = GridLength(1, GridUnitType::Star); rootgrid->RowDefinitions->Add(row);
        row = gcnew RowDefinition(); row->Height = GridLength(25); rootgrid->RowDefinitions->Add(row);
        
        // 设定表格列宽
        ColumnDefinition ^col;
        col = gcnew ColumnDefinition(); col->Width = GridLength(80); rootgrid->ColumnDefinitions->Add(col);
        col = gcnew ColumnDefinition(); col->Width = GridLength(10); rootgrid->ColumnDefinitions->Add(col);
        col = gcnew ColumnDefinition(); col->Width = GridLength(1, GridUnitType::Star); rootgrid->ColumnDefinitions->Add(col);
        
        // 标签:姓名
        txt1 = gcnew TextBlock(); // 建立对象
        Grid::SetRow(txt1, 0); Grid::SetColumn(txt1, 0); // 设定行和列
        txt1->Text = L"姓名"; // 设定Text属性
        // 直接写VerticalAlignment::Center会被解析为this->VerticalAlignment::Center报错
        txt1->VerticalAlignment = System::Windows::VerticalAlignment::Center; // 设定VerticalAlignment属性
        rootgrid->Children->Add(txt1); // 附加到根表格rootgrid

        // 标签:性别
        txt2 = gcnew TextBlock();
        Grid::SetRow(txt2, 2); Grid::SetColumn(txt2, 0);
        txt2->Text = L"性别";
        txt2->VerticalAlignment = System::Windows::VerticalAlignment::Center;
        rootgrid->Children->Add(txt2);

        // 标签:联系方式
        txt3 = gcnew TextBlock();
        Grid::SetRow(txt3, 4); Grid::SetColumn(txt3, 0);
        txt3->Text = L"联系方式";
        txt3->VerticalAlignment = System::Windows::VerticalAlignment::Center;
        rootgrid->Children->Add(txt3);

        // 文本框:姓名
        tb1 = gcnew TextBox();
        Grid::SetRow(tb1, 0); Grid::SetColumn(tb1, 2);
        rootgrid->Children->Add(tb1);

        // 文本框:性别
        tb2 = gcnew TextBox();
        Grid::SetRow(tb2, 2); Grid::SetColumn(tb2, 2);
        rootgrid->Children->Add(tb2);

        // 文本框:联系方式
        tb3 = gcnew TextBox();
        Grid::SetRow(tb3, 4); Grid::SetColumn(tb3, 2);
        rootgrid->Children->Add(tb3);

        // 用于布局按钮的子表格grid2
        Grid ^grid2 = gcnew Grid();
        Grid::SetRow(grid2, 7); Grid::SetColumn(grid2, 2);
        rootgrid->Children->Add(grid2);

        // 设置子表格grid2列宽
        //ColumnDefinition ^col;
        col = gcnew ColumnDefinition(); col->Width = GridLength(80); grid2->ColumnDefinitions->Add(col);
        col = gcnew ColumnDefinition(); col->Width = GridLength(10); grid2->ColumnDefinitions->Add(col);
        col = gcnew ColumnDefinition(); col->Width = GridLength(80); grid2->ColumnDefinitions->Add(col);
        
        // 确定按钮
        btnOK = gcnew Button();
        Grid::SetColumn(btnOK, 0);
        btnOK->Content = L"确定"; // 设定Content属性
        btnOK->Click += gcnew RoutedEventHandler(this, &MyMainWindow::btnOK_Click); // 添加事件处理程序
        grid2->Children->Add(btnOK); // 附加到子表格grid2
        
        // 取消按钮
        btnCancel = gcnew Button();
        Grid::SetColumn(btnCancel, 2);
        btnCancel->Content = L"取消";
        btnCancel->Click += gcnew RoutedEventHandler(this, &MyMainWindow::btnCancel_Click);
        grid2->Children->Add(btnCancel);
    }

    void btnOK_Click(Object ^sender, RoutedEventArgs ^args)
    {
        MessageBox::Show(L"姓名:" + tb1->Text +
                        L"\n性别:" + tb2->Text +
                        L"\n联系方式:" + tb3->Text,
                        L"你单击了确定", MessageBoxButton::OK, MessageBoxImage::Information);
    }

    void btnCancel_Click(Object ^sender, RoutedEventArgs ^args)
    {
        MessageBox::Show(L"程序即将退出", L"你单击了取消", MessageBoxButton::OK, MessageBoxImage::Information);
        this->Close();
    }
};

[STAThreadAttribute] // 必须加上这句,这句话表示此线程使用消息循环进行同步
int main(array<system::string ^> ^args)
{
    Application ^app = gcnew Application(); // Application对象用于分发消息
    app->MainWindow = gcnew MyMainWindow(); // 建立主窗口对象
    app->MainWindow->Show(); // 显示主窗口
    app->Run(); // 进入消息循环
    
    return 0;
}</system::string></code>

效果图:

wpfcli1.png

wpfcli2.png

wpfcli3.png
attachment icon wpfcli2.zip 1.04MB ZIP 44次下载

[修改于 8年11个月前 - 2016/02/01 22:34:06]

来自:计算机科学 / 软件综合
0
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年10个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}