科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件智能手机Smartphone开发从零起步

智能手机Smartphone开发从零起步

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文从零开始讲述了进行smartphone开发的整个过程。

作者:楚云风 来源:天极网 2007年11月22日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
一些基本概念

  因为在上面叙述中涉及了一些Smartphone的基本概念,作为入门的文章,下面,我对涉及到的一些概念进行解释。

  1) Platform Manage

  在安装Microsoft eMbedded C++ 4.0时候会提示你首先要安装Platform Manage,这是整个开发系统中非常核心的组件,它负责开发工具与实际的设备或者模拟的设备间所有的通讯。正是因为它屏蔽了信息交换的细节,才使得开发中模拟器可以作为一个真实的设备对待。

  2) ActiveSync Transport与TCP/IP Transport

  上面选择设备的Transport时候,有这样两种选择,ActiveSync Transport一般用于与真实smartphone设备的连接,而TCP/IP Transport既可以和真实设备也可以和模拟设备进行连接,因为TCP/IP Transport连接速度快且支持模拟设备,在开发调试的时候是首要选择。

  3) ActiveSync Startup Server与Emulator Startup Server

  所谓启动服务就是将编译好的程序download到所连接的设备上然后执行,ActiveSync Startup Server利用当前的ActiveSync连接来进行,设置可以通过ActiveSync程序进行;Emulator Startup Server必须使用TCP/IP Transport支持。开发调试的时候,一般选择Emulator Startup Server。

  4) Virtual Radio与Radio Required

  在配置Emulator Startup Server时候,有这两种Image选择,其中,Radio Required需要相应的无线发送设备支持而Virtual Radio则不需要,在最终测试时候,往往会需要Radio Required,开发和调试时候选择Virtual Radio。

  实践开发

  1、开发实例准备

  鉴于本篇的定位,本文的例子是一个很简单的程序,运行后,程序主窗口会显示一行欢迎信息;程序底部会有两个菜单,一个是"关于",一个是"选项","选项"是一个弹出式菜单,上面有两个菜单项"关于"和"退出"。

  执行"关于"菜单会显示一个标准的信息对话框;执行"退出"菜单,会首先显示一个消息提示窗口,提醒你是否确认要退出,你可以选择"确定"退出本程序,也可以选择"取消"返回到程序的主界面。

  下面是软件执行时的情况:


  2、第一步:建立通用框架

  因为Smartphone不支持MFC,因此,我们需要建立一个基于Windows CE API的编程框架,有过桌面开发或者Pocket PC开发经验的人会很清楚这个过程,包括注册窗口类、实例初始化、消息循环及窗口过程回调处理等,在Smartphone上也是一样的。

  1) 打开eMbedded C++ 4.0 ,File -> New ,建立一个Smartphone 2003 工程:


  注意,选择了WCE ARMV4 和WCE emulator 使我们可以编译在模拟器和真实设备运行的程序。

  点击OK按钮进入下一步。

  2) 选择建立一个空的工程。


  确认后此工程被建立。

  这里之所以不使用系统的标准框架是因为标准框架采用的是老式的消息处理方案,使用了很多的switch 语句来处理消息,不够灵活,也不方便程序的扩展,因此,这里从一个空的工程开始,仿照MFC消息映射的做法来构建一个结构良好,代码优美的框架,作为我们开发smartphone程序的基础。

  3、选择File->New新建一个C++源文件First.cpp和C++头文件First.h,并同时加入First工程。

  4、编写文件First.h和First.cpp如下,文件很短,关键的地方已经使用红色标注出来了,如果你有兴趣,可手工敲入下面的代码,以加深你对这个基本过程的了解。

//===============================================================
// first.h 文件

// 避免头文件的重复包含
#ifndef _CHUYUNFENG_FIRST_H_
#define _CHUYUNFENG_FIRST_H_

// 计算需要处理的消息数目
#define MSG_NUM(x) (sizeof(x) / sizeof(x[0]))

// 整个程序的消息映射结构
typedef struct tagMSG_MAP_MAIN
{
UINT nMsg;
LRESULT (*pMsgProcess)(HWND, UINT, WPARAM, LPARAM);

}MSG_MAP_MAIN_S;

// 命令消息(WM_COMMAND)的消息映射结构,因为两者处理函数
// 的参数不同,调用场合也不同,因此这里需要单独建立,类似的有
// WM_NOTOFY消息,本程序中不涉及
typedef struct tagMSG_MAP_CMD
{
UINT nMsg;
LRESULT (*pMsgProcess)(HWND, WORD, HWND, WORD);

}MSG_MAP_CMD_S;

// 声明程序中用到的全局变量
extern const TCHAR g_szAppName[];
extern HINSTANCE g_hInstance;
extern HWND g_hMainWnd;
extern const MSG_MAP_MAIN_S g_mainMsg[];
extern const MSG_MAP_CMD_S g_cmdMsg[];

// 窗口处理函数原型
LRESULT CALLBACK mainWndProc(HWND, UINT, WPARAM, LPARAM);

// 需要处理的主框架消息定义函数
LRESULT onCreate(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT onPaint(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT onCommand(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT onDestroy(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);

// 需要处理的菜单命令消息定义函数
LRESULT onAbout(HWND hWnd, WORD idItem, HWND hwndCtl,WORD wNotifyCode);
LRESULT onExit(HWND hWnd, WORD idItem, HWND hwndCtl,WORD wNotifyCode);

#endif //_CHUYUNFENG_FIRST_H_

//=================================================================
// First.cpp 文件

#include <windows.h>
#include <windowsx.h>
#include <aygshell.h>
#include "resource.h"

#include "First.h"

// 定义程序中用到的全局变量
const TCHAR g_szAppName[] = _T("First");
HINSTANCE g_hInstance;
HWND g_hMainWnd;

// 程序中需要处理的消息映射,如果要增加,在此处增加一
// 对{msgID,onMsgProcFun},然后写对应的消息处理函数即可。
const MSG_MAP_MAIN_S g_mainMsg[] =
{
{WM_PAINT, onPaint},
{WM_COMMAND, onCommand},
{WM_CREATE, onCreate},
{WM_DESTROY, onDestroy}
};

//此处放置需要处理的命令消息
const MSG_MAP_CMD_S g_cmdMsg[] =
{
{IDM_ABOUT, onAbout},
{IDM_EXIT,onExit}
};


//=================================================================
// WinMain,入口函数,由操作系统调用
//=================================================================
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPWSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
MSG msg;

// 注册窗口类
wc.style = 0; // 窗口样式
wc.lpfnWndProc = mainWndProc; // 回调函数
wc.cbClsExtra = 0; // 扩展的类数据
wc.cbWndExtra = 0; // 扩展的窗口数据
wc.hInstance = hInstance; //实例句柄
wc.hIcon = NULL, // 图标
wc.hCursor = NULL; // 鼠标
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL; //菜单
wc.lpszClassName = g_szAppName; //窗口类的名字

if ( 0 == RegisterClass (&wc))
return 0; //注册窗口类失败

// 建立并显示程序主窗口
g_hInstance = hInstance;
g_hMainWnd = CreateWindow (g_szAppName, // 窗口类
_T("第一个演示程序"), //窗口标题
WS_VISIBLE, //样式
CW_USEDEFAULT, // x坐标
CW_USEDEFAULT, // y 坐标
CW_USEDEFAULT, // 初始宽度
CW_USEDEFAULT, // 初始高度
NULL, // 父窗口
NULL, //菜单,必须为NULL,WINCE窗口不支持菜单。
hInstance, // 实例
NULL); //建立参数的指针,用于WM_CRATE消息期间。

if ( !IsWindow (g_hMainWnd)) //建立窗口失败
return 0;

ShowWindow (g_hMainWnd, nCmdShow);
UpdateWindow (g_hMainWnd);

// 消息循环
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}

// WinMain函数成功则返回退出消息的wParam
return msg.wParam;
}

//======================================================================
// MainWndProc,窗口过程,回调函数,由操作系统调用
//======================================================================
LRESULT CALLBACK mainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
// 处理我们需要处理的消息
int i;
for (i = 0; i < MSG_NUM(g_mainMsg); i++)
{
if (wMsg == g_mainMsg[i].nMsg)
return (*g_mainMsg[i].pMsgProcess)(hWnd, wMsg, wParam, lParam);
}

// 有编写对应的函数则调用默认的
return DefWindowProc (hWnd, wMsg, wParam, lParam);
}

//=================================================================
// onCreate,WM_CREATE 消息的处理函数
//=================================================================
LRESULT onCreate(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
SHMENUBARINFO mbi;

// 初始化menubar结构
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO); // 必须填充
mbi.hwndParent = hWnd;
mbi.nToolBarId = IDR_MAIN_MENUBAR;
mbi.hInstRes = g_hInstance;

// 建立menubar控制
if (!SHCreateMenuBar(&mbi))
{
MessageBox (hWnd, _T("建立menubar失败"),
g_szAppName, MB_OK);
DestroyWindow(hWnd);
}

//
return 0;
}

//=================================================================
// onPaint,WM_PAINT 消息的处理函数
//=================================================================
LRESULT onPaint(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;

RECT rtClient;
GetClientRect (hWnd, &rtClient);

// 开始绘图
hdc = BeginPaint (hWnd, &ps);

// 在屏幕中间写一句话
DrawText (hdc, _T("Smartphone第一个程序^_^"), -1,
&rtClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

// 结束绘图
EndPaint (hWnd, &ps);

return 0;
}

//=================================================================
// onCommand,WM_COMMAND 消息的处理函数
//=================================================================
LRESULT onCommand(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
//处理我们需要处理的命令消息
WORD wID, wNotifyCode;
HWND hwndCtl;
int i;

// 解析出参数
wID = (WORD) LOWORD (wParam);
wNotifyCode = (WORD) HIWORD (wParam);
hwndCtl = (HWND) lParam;

// 寻找消息映射结构,调用对应的消息处理函数
for (i = 0; i < MSG_NUM(g_cmdMsg); i++)
{
if (wID == g_cmdMsg[i].nMsg)
return (*g_cmdMsg[i].pMsgProcess)( hWnd, wID, hwndCtl,wNotifyCode);
}
return 0;
}

//=================================================================
// onDestroy,WM_DESTROY 消息的处理函数
//=================================================================
LRESULT onDestroy (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
DestroyWindow(hWnd);
return 0;
}

//=================================================================
// onAbout,菜单消息IDM_ABOUT处理函数
//=================================================================
LRESULT onAbout(HWND hWnd, WORD idItem, HWND hwndCtl,WORD wNotifyCode)
{
TCHAR szAboutMsg[] = _T("\n\n\n\t\tFirst\n\tfor smartphone 2003");
MessageBox(hWnd,szAboutMsg,_T("关于First"),MB_OK);
return 0;
}

//=================================================================
// onExit,菜单消息IDM_Exit处理函数
//=================================================================
LRESULT onExit(HWND hWnd, WORD idItem, HWND hwndCtl,WORD wNotifyCode)
{
if ( IDOK == MessageBox(hWnd, _T("真的要退出这个程序?"),
_T("退出确认"),MB_OKCANCEL | MB_ICONASTERISK) )
{
PostQuitMessage(0);
}

return 0;
}

  关键代码分析:

  代码中最关键的地方就是使用消息映射的办法来处理消息,这主要体现在定义消息映射结构和在窗口处理函数以及命令消息处理函数中进行消息分发上面,实现可以参看代码中的红色部分。

  5) 在框架上的开发。

  我们构建这个基本框架,是想使用这个框架进行后续开发的,上述代码中的绿色部分标示出了增加WM_PAINT消息处理的整个过程:

  1、 在.h文件中声明消息处理函数;

  2、 在.c文件的消息映射结构中增加一个消息映射对;

  3、 然后,在.c文件中实现此函数的功能即可。

  3、第二步:建立菜单

  现在,我们来建立左右软键对应的菜单。

  1) 确认使用中文资源

  因为要使用资源,因此,首先确认我们项目所使用的是中文资源:选择菜单项 Project ->Settings…,设置资源为中文:


  2) 增加resource script文件并修改Evc的一个bugs

  菜单File -> new ->增加一个resource script文件,名字为first.rc。


  当你在IDE中打开这个RC文件时,会发现一个错误,这是eMbedded C++处理smartphone上的一个bugs,微软对此的修正方案是,提供了一个newRes.h的文件,你将First.rc中的#include "afxres.h"修改为 #include "newRes.h"即可,newRes.h文件你可以自行在程序目录下建立,下面是newRes.h文件内容:

#ifndef __NEWRES_H__
#define __NEWRES_H__

#if !defined(UNDER_CE)
#define UNDER_CE _WIN32_WCE
#endif

#if defined(_WIN32_WCE)
#if !defined(WCEOLE_ENABLE_DIALOGEX)
#define DIALOGEX DIALOG DISCARDABLE
#endif
#include <commctrl.h>
#define SHMENUBAR RCDATA
#if defined(WIN32_PLATFORM_WFSP) && (_WIN32_WCE >= 300)
#include <aygshell.h>
#define AFXCE_IDR_SCRATCH_SHMENU 28700
#else
#define I_IMAGENONE (-2)
#define NOMENU 0xFFFF
#define IDS_SHNEW 1

#define IDM_SHAREDNEW 10
#define IDM_SHAREDNEWDEFAULT 11
#endif // _WIN32_WCE_PSPC
#define AFXCE_IDD_SAVEMODIFIEDDLG 28701
#endif // _WIN32_WCE

#ifdef RC_INVOKED
#ifndef _INC_WINDOWS
#define _INC_WINDOWS
#include "winuser.h" // extract from windows header
#include "winver.h"
#endif
#endif

#ifdef IDC_STATIC
#undef IDC_STATIC
#endif
#define IDC_STATIC (-1)

#endif //__NEWRES_H__

  3、 增加menubar资源:

类型 ID Caption
Menubar IDR_MAIN_MENUBAR  
Left menu IDM_ABOUT 关于
Right menu IDM_OPTION 选项
Right menu subitem 1 IDM_ABOUT 关于(和左建菜单是同一个ID)
Right menu subitem 2 IDM_EXIT 退出

  这是first.rc的内容,大家可以看到,与我们桌面windows下的资源脚本文件相差无几。

///////////////////////////////////////////////////////////////////////////
// first.rc , resource script for first.

#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "newres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END

3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END

#endif // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Menubar
//

IDR_MAIN_MENUBAR MENU DISCARDABLE
BEGIN
MENUITEM "关于", IDM_ABOUT
POPUP "选项"
BEGIN
MENUITEM "关于", IDM_ABOUT
MENUITEM SEPARATOR
MENUITEM "退出", IDM_EXIT
END
END


/////////////////////////////////////////////////////////////////////////////
//
// Data
//

IDR_MAIN_MENUBAR SHMENUBAR DISCARDABLE
BEGIN
IDR_MAIN_MENUBAR, 2,
I_IMAGENONE, IDM_ABOUT, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE,
IDS_MENUITEM40002, 0, NOMENU,
I_IMAGENONE, IDM_OPTION, TBSTATE_ENABLED,
TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_MENUITEM40007, 0, 1,
END


/////////////////////////////////////////////////////////////////////////////
//
// String Table
//

STRINGTABLE DISCARDABLE
BEGIN
IDS_MENUITEM40002 "关于"
IDS_MENUITEM40004 "x"
IDS_MENUITEM40007 "选项"
END

#endif // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

  4、 在onCreate函数中建立此菜单

//==================================================================
// onCreate,WM_CREATE 消息的处理函数
//==================================================================
LRESULT onCreate(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
SHMENUBARINFO mbi;

// 初始化menubar结构
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO); // 必须填充
mbi.hwndParent = hWnd;
mbi.nToolBarId = IDR_MAIN_MENUBAR;
mbi.hInstRes = g_hInstance;

// 建立menubar
if (!SHCreateMenuBar(&mbi))
{
 MessageBox (hWnd, _T("建立menubar失败"), g_szAppName, MB_OK);
 DestroyWindow(hWnd);
}

// 确定menubar的位置,这些语句是可选的
RECT rect, rectDesk;
int cx, cy;
GetWindowRect (mbi.hwndMB, &rect);
GetWindowRect (GetDesktopWindow (), &rectDesk);
cx = rectDesk.right-rectDesk.left;
cy = (rectDesk.bottom - rectDesk.top) - (rect.bottom - rect.top);
SetWindowPos (hWnd, NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER);

return 0;
}

  4、第三步:实现菜单功能

  1) 实现 "退出"菜单项的功能

  步骤如下:

  ·在first.h中增加函数原型定义:

LRESULT onExit(HWND hWnd, WORD idItem, HWND hwndCtl,WORD wNotifyCode);

  ·在first.cpp中实现此函数:

LRESULT onExit(HWND hWnd, WORD idItem, HWND hwndCtl,WORD wNotifyCode)
{
 if ( IDOK == MessageBox(hWnd, _T("真的要退出这个程序?"),_T("退出确认"),MB_OKCANCEL | MB_ICONASTERISK) )
 {
  PostQuitMessage(0);
 }
}

  ·在g_cmdMsg中增加相应的消息映射入口:

const CMD_MSG_MAP_S g_cmdMsg[] =
{
 {IDM_EXIT, onExit}
};

  2) 实现"关于"菜单项功能

  步骤如下:

  ·在first.h中增加函数原型定义:

LRESULT onAbout(HWND hWnd, WORD idItem, HWND hwndCtl,WORD wNotifyCode);

  ·在first.cpp中实现此函数:

LRESULT onAbout(HWND hWnd, WORD idItem, HWND hwndCtl,WORD wNotifyCode)
{
 TCHAR szAboutMsg[] = _T("\n\n\n\t\tFirst\n\tfor smartphone 2003");
 MessageBox(hWnd,szAboutMsg,_T("关于First"),MB_OK);

 return 0;
}

  ·在g_cmdMsg中增加相应的消息映射入口:

const CMD_MSG_MAP_S g_cmdMsg[] =
{
 {IDM_ABOUT, onAbout}
};

  5、编译运行

  首先要设置工程的编译选项,在开发过程中,我们将编译成模拟器的Debug版本来调试。


  6、模拟器的使用

  因为程序在模拟器上进行运行调试,因此,这里来谈一下对模拟器的操作:


  大家知道,smartphone手机可以使用外置的存储卡来进行扩充,一般采用SD卡或者Mini SD卡,因为手机本身的存储空间非常有限,因此,我们一般会把资源、程序等放在存储卡上。Folder Sharing的作用就是让你指定一个PC机上的目录,然后,模拟器会把这个目录内容解释成你的存储卡内容。


  其他的菜单选项很简单了,"Hard Reset…"相当于重新启动设备,"Soft Reset…"相当于重新启动Smartphone操作平台,"Shut Down"..是关闭模拟器,这些功能在你调试程序的时候会常常用到。

  程序安装

  现在例子程序已经完成了,我们已经可以在编译器上进行运行了,要做的事情还剩下最后一件,那就是做一个安装程序将我们的软件安装到我们的Smartphone设备上去。

  1、绿色安装

  我们构建的例子程序很小,只有一个文件,也不涉及到修改注册表等操作,因此,我们完全可以采用如下的方法进行绿色安装:

  ·将例子程序first.exe拷贝到smartphone设备的某个目录下。

  ·使用手机内置的文件管理器找到此文件,为它在smartphone的启动菜单中建立一个快捷方式,这样你就可以在开始菜单中找到这个程序。

  ·OK,现在你可以使用文件管理器或者启动菜单来执行这个程序了

  2、扩展安装

  采用上面的方法确实可以解决我们的问题,但在稍微复杂一点的场合下,比如,程序有多个分散的文件,程序需要写注册信息或者需要提供安全签名等,使用上面的方法就力不从心了。限于篇幅和本文定位,这部分内容将在我的另一篇文章中专门讲述。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簻椤掋垺銇勯幇顏嗙煓闁哄被鍔戦幃銏ゅ传閸曟垯鍨介弻锝夘敇閻曚焦鐤佸Δ鐘靛仦閻楁洝褰佸銈嗗坊閸嬫挸鈹戦檱閸嬫劗妲愰幒妤€绠涙い鎾楀嫮鏉归梻浣告惈閻鎹㈠┑鍡欐殾闁割偅娲栭悡娑樏归敐澶嬫暠闁活偄绻樺缁樻媴閸涘﹥鍎撳銈嗗灥閹虫﹢寮绘繝鍥ㄦ櫜濠㈣泛锕ㄩ幗鏇㈡⒑閸濆嫭绁紒杈ㄦ礋閹潡鍩€椤掑嫭鐓熼幖鎼灣缁夐潧霉濠婂懎浠︾紒鍌涘浮閹瑩顢楅崒婊呮婵犵數鍋涢悧鍡涙倶濠靛鍊堕柣妯肩帛閻撳繘鏌涢銈呮瀾闁稿﹥鍔楅埀顒侇問閸犳牠鈥﹀畡閭﹀殨闁圭虎鍠楅弲顒勬煕閺囥劌骞楁繝銏″灴濮婅櫣鎷犻幓鎺戞瘣缂傚倸绉村Λ娆戠矉瀹ュ鍐€妞ゆ挾鍋熼敍娑㈡⒑鐟欏嫬绀冩い鏇嗗洤绀冮柍褜鍓欓—鍐Χ閸℃ê钄奸梺鍛婃煥濞撮鍒掑▎鎺旂杸婵炴垶鐟㈤幏娲煟閻樺厖鑸柛鏂胯嫰閳诲秹骞囬悧鍫㈠幍闂佸憡鍨崐鏍偓姘炬嫹

    濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣濠垫劖缍楅梺閫炲苯澧柛濠傛贡缁骞掗弬鍝勪壕闁挎繂绨肩花浠嬫煕閺冩挾鐣辨い顏勫暣婵″爼宕卞Δ鈧ḿ鎴︽⒑缁嬫鍎愰柟鐟版喘瀵鈽夐姀鈥充簻闂備礁鐏濋鍛閹绢喗鈷戠紒顖涙礃閺夊綊鏌涚€n偅灏い顏勫暣婵″爼宕卞Δ鈧ḿ鎴︽⒑缁嬫鍎愰柟绋垮⒔濡叉劙骞橀幇浣告倯闂佸憡绮岄崯鎶藉触椤愨懡鏃堟偐闂堟稐绮堕梺鍝ュ櫏閸嬪鎮橀幒妤佺厽闁绘ê寮剁粚鍧楁倶韫囨梻鎳呯紒顕嗙秮閹瑩鎮滃Ο閿嬪闁荤喐绮庢晶妤冩暜閹烘挾顩插ù鐓庣摠閻撴洟鏌熼幆褜鍤熸繛鍙夋尦閺岀喖顢欓挊澶婂Б闁绘挶鍊栭妵鍕疀閹炬潙娅濋梺褰掓敱濡炶棄顫忔繝姘<婵ê宕·鈧梻浣告啞椤ㄥ棗煤閻旈鏆﹀┑鍌溓瑰敮闂侀潧锛忛崟顓炲及婵犵數濮烽弫鍛婃叏閹绢喗鏅濋柕鍫濇礌閸嬫挸顫濋悡搴$睄閻庤娲╃紞鈧紒鐘崇洴瀵噣宕掑⿰鍛潓婵犵數濮烽弫鍛婃叏閹绢喖纾圭紓浣股戝▍鐘崇箾閹存瑥鐏柣鎾存礋閹鏁愰崘銊ヮ瀳婵犵鈧尙鐭欓柡灞炬礋瀹曟儼顦叉い蹇e幘閳ь剚顔栭崰鏇犲垝濞嗘劒绻嗘慨婵嗙焾濡插綊姊洪柅鐐茶嫰婢ь垶鎮介銈囩瘈鐎殿喖顭烽幃銏ゅ礂閻撳海妾┑鐘灱濞夋盯鏁冮妷銉㈡灁濠电姵纰嶉埛鎴︽煕濠靛棗顏柣蹇涗憾閺屾盯鎮╁畷鍥р拰濡ょ姷鍋涢崯顐︺偑娴兼潙閱囨繝闈涚墕楠炴劙姊绘担鍛靛綊寮甸鍌滅煓闁规儳绠嶆禍褰掓倵閿濆骸鏋熼柣鎾跺枛楠炴牕菐椤掆偓閳ь兙鍊曞玻鍧楀箛椤撶姷顔曢梺鍛婄懃椤ャ垽顢旈崼鐔蜂患濠电娀娼ч悧蹇涙儗濞嗘挻鍋i柟顓熷笒婵¤姤绻涢崼銉х暫婵﹥妞藉畷婊堝箵閹哄秶鍑规繝鐢靛仜瀵爼鎮ч悩璇茬畺闁炽儲鏋煎Σ鍫ユ煏韫囥儳纾块柛姗€浜堕弻锝堢疀閺囩偘绮舵繝鈷€鍌滅煓闁诡垰鐬奸埀顒婄秵閸嬪棛绮绘ィ鍐╃厱妞ゆ劑鍊曢弸鎴︽煕婵犲啫濮堥柟渚垮妽缁绘繈宕熼鐐殿偧闂備胶鎳撻崲鏌ュ箠閹邦喖鍨濋柣銏㈩暯閸嬫捇鏁愭惔婵堝嚬闂佷紮绲奸崡鍐差潖缂佹ɑ濯撮悷娆忓娴犫晠姊洪崨濠冪叆妞ゆ垵顦悾鐑芥晸閻樿尙顦ㄩ梺鑲┾拡閸撴艾鈻撴ィ鍐┾拺闂傚牊绋撶粻鐐烘煕婵犲啯绀嬬€规洘锕㈤崺鈧い鎺嗗亾妞ゎ亜鍟存俊鍫曞幢濡も偓椤洭姊虹粙鍧楊€楃€规洦鍓熼幆鍐敆閸曨兘鎷婚梺绋挎湰閻熝囧礉瀹ュ鍊电紒妤佺☉閹虫劙鎯屽▎鎾寸厵閻庣數枪琚ラ梺绋款儐閹告悂锝炲┑瀣亗閹艰揪绱曢惈鍕煟鎼淬値娼愭繛鍙夊灴瀹曪繝宕橀懠顒佹闂佸憡顨堥崐锝夋偄閸忓皷鎷归梺褰掑亰閸犳艾鈻旈崸妤佲拻闁稿本鐟х粣鏃€绻涙担鍐叉处閸嬪鏌涢埄鍐槈缂佺姷濞€楠炴牕菐椤掆偓閻忣亪鏌涘▎蹇曠闁靛洤瀚伴獮鎺楀幢濡炴儳顥氶梻鍌欑閻ゅ洭锝炴径鎰瀭闁秆勵殔閺勩儵鏌曟径鍡樻珔妤犵偑鍨烘穱濠囨倷閹绘巻鎸冮梺鍛婂灱椤鎹㈠┑瀣仺闂傚牊鍒€閻愮儤鐓曢柕濠忛檮閵囨繈鏌℃担鍓插剶闁哄睙鍥ㄥ殥闁靛牆鎳嶅▽顏呯箾閿濆懏鎼愰柨鏇ㄤ簼娣囧﹪宕奸弴鐐茬獩濡炪倖鏌ㄩ崥瀣敂閿熺姵鈷掑ù锝呮嚈瑜版帩鏁勯柛娑欐綑绾惧綊鏌涢敂璇插箺鐎规洖寮剁换娑㈠箣濞嗗繒浠煎Δ鐘靛亼閸ㄧ儤绌辨繝鍥舵晬婵犲灚鍔曞▓顓犵磼閻愵剚绶茬紒澶婄秺瀵鏁愰崱妯哄妳闂侀潧楠忕徊浠嬎夊┑鍡╂富闁靛牆绻愰々顒勬煛娴g瓔鍤欐い鏇悼閹风姴顔忛鍏煎€梻浣稿閸嬫帡宕戦崨鎼晛闁搞儺鍓氶埛鎺懨归敐鍛暈闁哥喓鍋ら弻鐔煎箹娴h櫣鏆悗瑙勬礈婢ф骞嗛弮鍫氣偓锕傚箣閻愬瓨鐝ㄩ梻鍌欑劍鐎笛呮崲閸岀倛鍥ㄧ鐎n亝鐎梺绯曞墲閵囨粓鍩€椤掍礁绗掓い顐g箞椤㈡绻濋崒姘兼浆闂傚倷鐒﹀鍧楀储娴犲鈧啴宕卞▎鎰簥濠电偞鍨崹鍦不婵犳碍鐓涘璺侯儏閻忊晠鏌涢弬鎯у祮婵﹨娅g划娆忊枎閹冨闂備礁婀遍幊鎾趁洪鐑嗗殨濠电姵纰嶉弲鏌ユ煕濞戝彉绨兼い顐㈢Т閳规垿鎮欓崣澶樻!闂佸憡姊瑰ú婊勭珶閺囥垹绠柤鎭掑劗閹锋椽姊洪崨濠勭畵閻庢凹鍘奸敃銏ゅ箥椤斿墽锛滈柣搴秵閸嬪嫰鎮橀幘顔界厱闁冲搫鍟禒杈殽閻愬樊鍎旈柡浣稿暣閸┾偓妞ゆ巻鍋撴い鏂跨箰閳规垿宕堕妷銈囩泿闂備礁鎼ú銊╁磻閻愬搫闂繛宸簼閻撳啴鎮归崶顏嶅殝闁告梻鍠撶槐鎺撴綇閵婏箑纾抽悗瑙勬礃鐢帡鍩㈡惔銊ョ婵犻潧妫悗鏉戔攽閿涘嫬浜奸柛濠冨灴瀹曟繂鐣濋崟顐ょ枃濠殿喗銇涢崑鎾搭殽閻愬弶顥滈柣锝嗙箞瀹曠喖顢曢妶蹇曞簥闂傚倷鑳剁划顖炲礉濞嗗繄缂氱憸蹇曞垝婵犲洦鏅濋柛灞剧〒閸樼敻姊虹粙璺ㄧ闁稿鍔欏鍐差潨閳ь剟寮诲☉銏犳閻犳亽鍔庨崝顖炴⒑鐠団€虫灓闁稿鍊曢悾鐤亹閹烘繃鏅濋梺缁樓规禍顒勬儎鎼淬劍鈷掑ù锝呮啞鐠愶繝鏌涙惔娑樷偓婵嗙暦瑜版帗鍋ㄩ柛鎾冲级閺呮粓姊洪崘鍙夋儓闁瑰啿绻樺畷鎰板垂椤愶絽寮垮┑顔筋殔濡鏅剁紒妯圭箚闁圭粯甯炵粔娲煛鐏炵偓绀嬬€规洘鍎奸ˇ鍙夈亜韫囷絽骞橀柍褜鍓氶鏍窗閺囩姴鍨濇繛鍡樺姃缁诲棙鎱ㄥ┑鍡欑劸婵℃彃銈稿娲閳哄啰銈烽梺绋块绾绢厼危閹版澘绠婚悗娑櫭鎾剁磽娴e湱鈽夋い鎴濇噹閳绘捇顢橀悙鈺傛杸闂佸疇妫勫Λ妤佺濠靛牏纾奸悹鍥皺婢ф洘銇勯弴顏嗙ɑ缂佺粯绻傞~婵嬵敇閻愭壆鐩庣紓鍌欒兌閸嬫挻鍒婇懞銉d粓闁归棿绀侀悿楣冩煥濠靛棭妲归柛瀣у墲缁绘繃绻濋崒姘闁轰礁鐗撳铏规嫚閳ヨ櫕鐏嶉梺鎸庢磸閸ㄤ粙鐛繝鍥ㄥ亹婵炶尙绮弲銏ゆ⒑缁嬫寧婀扮紒顕嗙悼濡叉劙寮婚妷锔规嫼闂佸憡绻傜€氬嘲危閹间焦鐓熸俊銈傚亾閻庢碍婢橀悾宄扳攽閸ャ劌鍔呴梺鎸庣箓濞诧絿绮径鎰拺缂備焦锚婵鏌涙惔娑樷偓婵嬪箖閳ユ枼妲堥柕蹇娾偓鏂ュ亾閸洘鐓熼柟閭﹀灡绾墽鎮鑸碘拺闁告縿鍎辨牎闂佹寧娲忛崹钘夘嚕婵犳艾鐒洪柛鎰ㄦ櫅椤庢捇姊洪懡銈呮瀾婵犮垺锕㈤敐鐐哄箳濡や礁鈧敻鎮峰▎蹇擃仾缂佲偓閸儲鐓曢柣妯虹-婢х敻鏌曢崱鏇狀槮妞ゎ偅绮撻崺鈧い鎺戝缁犳牠鏌嶉崫鍕櫤闁诡垳鍋為妵鍕箛閳轰讲鍋撳┑瀣濠电姵纰嶉埛鎺楁煕鐏炴崘澹橀柍褜鍓欓崲鏌ユ箒闂佹悶鍎滈崨顔筋啎闂備礁澹婇悡鍫ュ磻閸涙潙鐭楅煫鍥ㄧ⊕閻撴瑩鏌熼娑欑凡鐞氭岸姊洪幎鑺ユ暠婵﹤顭烽崺鈧い鎺嗗亾缂佺姴绉瑰畷鏇㈡焼瀹撱儱娲、娑㈡倷閹绘帞鈧參姊虹粙璺ㄧ伇闁稿鍋ら幃锟犲閳ヨ尙绠氬銈嗙墬缁矂鎯冮幋鐘电<閺夊牄鍔岄崫娲煛鐏炶濡奸柍瑙勫灴瀹曢亶鍩¢崒鍌﹀缁辨挻鎷呴幓鎺嶅闂佽鍑界紞鍡涘磻娴e湱顩叉繝濠傜墛閻撴稓鈧箍鍎遍崯顐d繆閸ф鐓冮柦妯侯樈濡插湱绱掔紒妯兼创鐎规洖銈搁幃銏ゆ惞閸︻厼甯ㄥ┑鐘愁問閸犳牠鏁冮妸銉㈡瀺闁挎繂鎳夊Σ鍫ユ煟閵忊懚鐟邦啅濠靛洢浜滈柡鍌涘劤鐎氬酣鏌嶈閸撴岸宕濋弴鈶┾偓鏃堝礃椤斿槈褔骞栫划鍏夊亾閼碱剙鍤┑鐘垫暩閸嬬姷浜稿▎鎾崇獥闁哄诞鍛濠电偛妯婃禍婊堟倿閸偁浜滈柟鍝勭Ч濡惧嘲霉濠婂嫮鐭掗柡宀€鍠栧畷顐﹀礋椤掑顥e┑鐐茬摠缁挾绮婚弽褜娼栨繛宸簻缁犱即骞栧ǎ顒€鐏柍瑙勭⊕缁绘繄鍠婂Ο宄颁壕闁惧浚鍋呴幃娆撴煕濡ゅ懍鎲鹃柡宀€鍠栭幃褔宕奸悢鍝勫殥缂傚倷绶¢崑鍕矓瑜版帒钃熸繛鎴欏焺閺佸啴鏌ㄥ┑鍡樺窛闁伙絿鍘ч—鍐Χ閸℃ê闉嶅┑锛勫仩濡嫰锝炶箛娑欐優闁革富鍘鹃敍婊冣攽閳藉棗鐏犻柟纰卞亰閿濈偛鐣濋崟顒€鈧灚绻涢崼婵堜虎婵炲懏锕㈤弻娑㈠箻鐎靛憡鍣梺璇茬箰閸熸潙顫忓ú顏勫窛濠电姳鑳剁换渚€姊洪崫銉バg€光偓缁嬭法鏆﹂柕蹇嬪€曠粻鐟懊归敐鍛辅闁归攱妞藉娲川婵犲啫闉嶉悷婊勬緲閸燁垳绮嬪鍡欘浄閻庯綆鍋嗛崢閬嶆煟鎼搭垳绉靛ù婊勭矒椤㈡棃顢橀姀锛勫幍濡炪倖姊归弸濠氭嚀閸ф鐓涘ù锝嚽归弳锝団偓瑙勬礃鐢帡鍩ユ径濠庢僵妞ゆ巻鍋撶紒鐘靛仱濮婄粯鎷呯粵瀣闂佸憡鍨归弲顐ゆ閻愬搫骞㈡繛鎴炨缚閿涙盯姊虹化鏇炲⒉閽冭鲸绻涢崨顖毿i柕鍥у楠炴帡骞嬪┑鍐ㄤ壕闁煎鍊曢ˉ姘攽閸屾碍鍟為柣鎾存礋閹﹢鎮欓幓鎺嗘寖闂佸疇妫勯ˇ杈╂閹烘埈娓婚柨鏇楀亾婵炶绠撻幃鈥斥枎閹惧鍘介梺缁樻煥閹诧紕娆㈤崣澶堜簻闊浄绲藉顕€鏌″畝鈧崰鏍箖閳╁啯鍎熼柕蹇ョ悼椤㈠懘姊绘担鐑樺殌鐎殿喖鐖奸獮鎰板礃閼碱剚娈鹃梺缁樻煥閸氬藟閸喓绠鹃柟瀵稿仧閹冲嫰鏌e┑鎾剁瘈婵﹤顭峰畷鎺戭潩椤戣棄浜鹃柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑鐐烘偋閻樻眹鈧線寮撮姀鐘栄囨煕鐏炲墽鐓瑙勬礀閳规垿顢欓惌顐簻閻g兘顢楅崟顐㈠亶闁诲海鏁哥涵鍫曞磻閹捐埖鍠嗛柛鏇ㄥ墰椤︺儳绱撻崒姘毙㈤柨鏇ㄤ簻椤曪絾绻濆顒€鑰垮┑掳鍊曢敃銈夊箖閹达附鈷戦柛娑橈梗缁堕亶鏌涢妸褎娅曟俊鍙夊姍閺屽棗顓奸崱娆忓箺闂佺澹堥幓顏嗘閺囥垺鍋╂い鎾卞灪閻撴洟骞栧ǎ顒€濡洪柟鏌ョ畺閹稿﹤鈹戦崰銏犵秺瀹曟宕楅懖鈺冣枏缂備胶鍋撳畷妯衡枖閺囥垹鐒垫い鎺嗗亾缂佺姴绉瑰畷鏇㈡焼瀹撱儱娲︾€佃偐鈧稒锚娴滄姊洪崫鍕偍闁搞劍妞介幃鈥斥槈閵忥紕鍘遍梺闈涱檧缁蹭粙宕濆顑芥斀闁挎稑瀚敮鑸点亜椤撯€冲姷妞ぱ傜窔閺屾盯濡搁妶鍛ギ濠电姭鍋撳〒姘e亾婵﹨娅g槐鎺懳熼幘铏础缂侇喗妫冮、姘跺焵椤掑嫨鈧線寮崼婵嬪敹闂佺粯妫佸▍锝夊汲閵忋倖鈷掗柛灞捐壘閳ь剛鍏橀幃鐐烘晜闁款垰浜剧紒妤佺☉閹冲繐鐣烽弻銉︾厱閻忕偟铏庨崵銈嗙箾閹寸儐鐒搁柡鍐ㄧ墕瀹告繃銇勯幘璺盒㈡鐐村浮濮婄粯鎷呴崨濠冨創濠电偛鐪伴崹钘夌暦閻熸噴娲敂閸涱厺绨甸梻浣告啞閸旓附绂嶅┑瀣獥闁归偊鍘剧弧鈧繝鐢靛Т閸婄粯鏅堕弴鐘电<闁逞屽墴瀹曞ジ鎮㈢粙鍨紟婵犵妲呴崹杈┾偓绗涘懏鍏滃Δ锝呭暞閻撱垽鏌涢幇鍏哥盎闁哄鐩弻锛勪沪閻愵剛顦ㄧ紓浣虹帛缁嬫牠藝閺屻儲鍊垫慨妯哄船閸樺鈧娲橀崹鎸庝繆閹间礁鐓涢柛灞绢殕鐎氳偐绱撻崒姘偓鐑芥倿閿曞倹鏅┑鐘愁問閸犳牕煤閿曞倸桅闁告洦鍨伴崡鎶芥煏婵炲灝鍔氱紒顐㈢Ч濮婅櫣鍖栭弴鐔告緭闂佹悶鍔忓Λ鍕敋閿濆绠绘い鏃傗拡濞煎﹪姊洪悙钘夊姕闁哄銈稿畷鎴﹀箻缂佹ê浠洪梺鍛婄☉閿曪箓宕i崱妞绘斀闁绘ḿ绮☉褎淇婇锝庢疁闁糕斁鍋撳銈嗗笒閸婂綊宕甸埀顒勬⒑鐎圭媭鍤欑紒澶屾嚀閻g兘宕奸弴鐐嶁晠鏌ㄥ┑鍡楊伀闁烩晛閰e缁樼節鎼粹€茬盎濠电偠顕滄俊鍥╁垝濞嗘挸绠涢柡澶庢硶閻ゅ懏淇婇妶蹇曞埌闁哥噥鍨堕幃鈥斥槈閵忊€斥偓鍫曟煟閹扮増娑уù婊冨⒔缁辨帡鍩€椤掑倵鍋撻敐搴″幋闁稿鎸鹃幉鎾礋椤掑偆妲瑰┑鐐茬摠缁矂鎮ユ總绋课ュù锝呭濞笺劑鏌嶈閸撶喖鐛崘顔碱潊闁挎稑瀚板顔界節閵忥絾纭炬い锕侀哺瀵板嫰鏁撻敓锟�

    重磅专题
    往期文章
    最新文章