??xml version="1.0" encoding="utf-8" standalone="yes"?>日产精品99久久久久久,久久综合九色综合久99,久久亚洲电影http://www.shnenglu.com/kyelin/攉,记录,整理,回收zh-cnWed, 07 May 2025 21:04:25 GMTWed, 07 May 2025 21:04:25 GMT60sqlite备忘http://www.shnenglu.com/kyelin/archive/2011/06/10/148434.html我风我风Fri, 10 Jun 2011 08:08:00 GMThttp://www.shnenglu.com/kyelin/archive/2011/06/10/148434.htmlhttp://www.shnenglu.com/kyelin/comments/148434.htmlhttp://www.shnenglu.com/kyelin/archive/2011/06/10/148434.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/148434.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/148434.htmlint sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
功能:打开数据?如果不存在则自动创徏.
PARAM1(IN): 数据库文件名,UTF-8格式
PARAM2(OUT):  q回的数据库句柄
q回?q回SQLITE_OK成功,反之p|(数据库句柄ppDb为空),p|D具体SQLITE_*定义.
=====================================================================================

int sqlite3_close(sqlite3 *);
功能:关闭数据?br />PARAM1(IN):打开的数据库句柄
q回?q回SQLITE_OK成功,反之p|.
=====================================================================================

int sqlite3_exec(
  sqlite3*,                     /* An open database */
  const char *sql,              /* SQL to be executed */
  sqlite3_callback,             /* Callback function */
  void *,                       /* 1st argument to callback function */
  char **errmsg                 /* Error msg written here */
);
功能:执行SQL
PARAM1(IN):数据库句?br />PARAM2(IN):sql语句,以\0l尾.
PARAM3(IN):回调函数
PARAM4(IN):回调参数
PARAM5(OUT):输出错误信息
q回?SQLITE_OK成功,反之p|,p|后错误信息见PARAM5;
说明Q如果有多条SQL语句,中间用分?;)隔开.回调函数和回调参数通常在查询语句会(x)用到,
Ҏ(gu)条查询结果结果都?x)调用回调函C?
回调函数格式:
typedef int(*sqlite3_callback)(void *,int ,char **,char **);
参数1:sqlite3_exec中传入的参数
参数2:d?
参数3:列数?char*)
参数4:列名U?char*)

=====================================================================================
int sqlite3_get_table(
  sqlite3*,               /* An open database */
  const char *sql,       /* SQL to be executed */
  char ***resultp,       /* Result written to a char *[]  that this points to */
  int *nrow,             /* Number of result rows written here */
  int *ncolumn,          /* Number of result columns written here */
  char **errmsg          /* Error msg written here */
);
功能:查询?br />PARAM1(IN):数据库句?br />PARAM2(IN):sql语句,以\0l尾.
PARAM3(OUT):查询l果
PARAM4(OUT):q回行数(多少条数?
PARAM5(OUT):q回列数(多少字段)
PARAM6(OUT):q回错误信息
q回?SQLITE_OK成功,房子p|见错误信?/p>

=====================================================================================
void sqlite3_free_table(char **result);
功能:释放通过sqlite3_get_table查询保存的结果数?br />PARAM1(IN):要释攄数据指针


=====================================================================================
int sqlite3_prepare(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nBytes,             /* Length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
);
功能:构造查?br />PARAM1(IN):数据库句?br />PARAM2(IN):sql语句
PARAM3(IN):sql语句长度,讄?1则自动按字符串计sql语句长度
PARAM4(OUT):保存的查询结构体,
PARAM5(OUT):NULL卛_
q回?SQLITE_OK成功.


=====================================================================================
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
功能:为查询结构体l定数据
PARAM1(IN):查询l构?br />PARAM2(IN):l定W几个数?sql语句中的W几个问??))
PARAM3(IN):二进制数据指?br />PARAM4(IN):二进制数据长?br />PARAM5(IN):析构回调函数,通常讄NULL,l束后自己释?br />q回?S_OK成功.
说明:l定函数必须要在sqlite3_step?sqlite3_prepare或者sqlite3_reset之后调用.
未绑定的参数~省为NULL,cM的绑定函数还有以?br />int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite_int64);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);

 

=====================================================================================
int sqlite3_reset(sqlite3_stmt *pStmt);
功能:重置所有绑定的?回到刚刚调用sqlite3_prepare后的状?/p>


=====================================================================================
int sqlite3_step(sqlite3_stmt*);
功能:执行查询
PARAM1:查询l构?br />q回?
SQLITE_BUSY:数据库被?可以{待释放后重新调用该函数
SQLITE_DONE:成功
SQLITE_ROW:成功q且有数据返?Ҏ(gu)查询C条数据都?x)返回该?
   可以调用sqlite3_column_*函数获取数据后重新调用处理下一条数?br />SQLITE_ERROR:p|
SQLITE_MISUSE:错误的调?比如已经q回?jin)SQLITE_DONE或者SQLITE_ERROR后还l箋(hu)调用该函?/p>


=====================================================================================
int sqlite3_finalize(sqlite3_stmt *pStmt);
功能:释放查询l构?/p>

=====================================================================================
int sqlite3_key(
  sqlite3 *db,                   /* Database to be rekeyed */
  const void *pKey, int nKey     /* The key */
);
功能:为加密的数据库指定密?改函数在sqlite3_open之后调用

=====================================================================================
int sqlite3_rekey(
  sqlite3 *db,                   /* Database to be rekeyed */
  const void *pKey, int nKey     /* The new key */
);
功能:重设数据库密?如果pKey = 0 或?nKey = 0,q数据库不加?/p>


=====================================================================================

 


const char *sqlite3_libversion(void);
int sqlite3_libversion_number(void);
功能:获取版本?/p>

sqlite_int64 sqlite3_last_insert_rowid(sqlite3*);
功能:获取最后插入的行标C?

int sqlite3_changes(sqlite3*);
功能:获取最q执行的sqlite3_exec影响的行?

int sqlite3_total_changes(sqlite3*);
功能:获取自从数据库打开后有改动的函?/p>

void sqlite3_interrupt(sqlite3*);
功能:打断或停止数据库当前操作.

int sqlite3_complete(const char *sql);
功能:判断语句是否以分?;)l尾

int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
功能:讄查询忙碌时的回调处理
说明:~省的回调函Cؓ(f)I?如果回调函数为空,表锁定后sqlite3_exec()执行?x)直接返回SQLITE_BUSY

int sqlite3_busy_timeout(sqlite3*, int ms);
功能:讄查询时旉(毫秒)

 

char *sqlite3_mprintf(const char*,...);
char *sqlite3_vmprintf(const char*, va_list);
char *sqlite3_snprintf(int,char*,const char*, ...);
功能:格式化字W?需要用%q来代?s.(主要是不用对分号'q行转义)


void *sqlite3_malloc(int);
void *sqlite3_realloc(void*, int);
void sqlite3_free(void*);
功能:内存函数

int sqlite3_set_authorizer(
  sqlite3*,
  int (*xAuth)(void*,int,const char*,const char*,const char*,const char*),
  void *pUserData
);
功能:讄数据库授?/p>

void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
void *sqlite3_profile(sqlite3*,
   void(*xProfile)(void*,const char*,sqlite_uint64), void*);

void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
功能:讄执行回调函数,sqlite3_exec(),sqlite3_step() ,sqlite3_get_table()时会(x)调用

void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
功能:讄事务回调函数

int sqlite3_errcode(sqlite3 *db);
const char *sqlite3_errmsg(sqlite3*);
功能:获取错误码和错误消息

int sqlite3_bind_parameter_count(sqlite3_stmt*);
功能:q回需要绑定的参数数目(sql语句中问?数量)

const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);
功能:获取l定参数名字,?参数q回NULL

int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
功能:获取l定参数索引

int sqlite3_clear_bindings(sqlite3_stmt*);
功能:清除l定的参?/p>


int sqlite3_column_count(sqlite3_stmt *pStmt);
功能:获取列数
const char *sqlite3_column_name(sqlite3_stmt*,int);
功能:获取列名


const char *sqlite3_column_database_name(sqlite3_stmt*,int);
const void *sqlite3_column_database_name16(sqlite3_stmt*,int);
const char *sqlite3_column_table_name(sqlite3_stmt*,int);
const void *sqlite3_column_table_name16(sqlite3_stmt*,int);
const char *sqlite3_column_origin_name(sqlite3_stmt*,int);
const void *sqlite3_column_origin_name16(sqlite3_stmt*,int);
功能:q回列信?

const char *sqlite3_column_decltype(sqlite3_stmt *, int i);
功能:q回列数据类?/p>

int sqlite3_data_count(sqlite3_stmt *pStmt);
功能:q回数据数量(行数)

 

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
sqlite_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
int sqlite3_column_type(sqlite3_stmt*, int iCol);
int sqlite3_column_numeric_type(sqlite3_stmt*, int iCol);
sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
功能:获取列数?/p>


int sqlite3_create_function(
  sqlite3 *,
  const char *zFunctionName,
  int nArg,
  int eTextRep,
  void*,
  void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
  void (*xStep)(sqlite3_context*,int,sqlite3_value**),
  void (*xFinal)(sqlite3_context*)
);
功能:

const void *sqlite3_value_blob(sqlite3_value*);
int sqlite3_value_bytes(sqlite3_value*);
int sqlite3_value_bytes16(sqlite3_value*);
double sqlite3_value_double(sqlite3_value*);
int sqlite3_value_int(sqlite3_value*);
sqlite_int64 sqlite3_value_int64(sqlite3_value*);
const unsigned char *sqlite3_value_text(sqlite3_value*);
const void *sqlite3_value_text16(sqlite3_value*);
const void *sqlite3_value_text16le(sqlite3_value*);
const void *sqlite3_value_text16be(sqlite3_value*);
int sqlite3_value_type(sqlite3_value*);
int sqlite3_value_numeric_type(sqlite3_value*);
功能:cMsqlite3_column_*函数

 

 

 

 



我风 2011-06-10 16:08 发表评论
]]>
chtmlview的疑?/title><link>http://www.shnenglu.com/kyelin/archive/2011/04/20/144694.html</link><dc:creator>我风</dc:creator><author>我风</author><pubDate>Wed, 20 Apr 2011 12:08:00 GMT</pubDate><guid>http://www.shnenglu.com/kyelin/archive/2011/04/20/144694.html</guid><wfw:comment>http://www.shnenglu.com/kyelin/comments/144694.html</wfw:comment><comments>http://www.shnenglu.com/kyelin/archive/2011/04/20/144694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kyelin/comments/commentRss/144694.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kyelin/services/trackbacks/144694.html</trackback:ping><description><![CDATA[一个对话框目中需要显C网?遂创建chtmlview对象后加载网?本机win7试ok,然而到攑ֈxp裸机上测?直接报错.创徏chtmlviewH口p|.而后试发现如果cchtmlview是在d话框H口上的则又没问?只有在子对话框上创徏chtmlview则裸Z报错.原因??? <img src ="http://www.shnenglu.com/kyelin/aggbug/144694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kyelin/" target="_blank">我风</a> 2011-04-20 20:08 <a href="http://www.shnenglu.com/kyelin/archive/2011/04/20/144694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ l典开源代??http://www.shnenglu.com/kyelin/archive/2011/03/24/142660.html我风我风Thu, 24 Mar 2011 09:22:00 GMThttp://www.shnenglu.com/kyelin/archive/2011/03/24/142660.htmlhttp://www.shnenglu.com/kyelin/comments/142660.htmlhttp://www.shnenglu.com/kyelin/archive/2011/03/24/142660.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/142660.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/142660.html

我风 2011-03-24 17:22 发表评论
]]>
winnt.h(236) : error C2146http://www.shnenglu.com/kyelin/archive/2011/01/27/139397.html我风我风Thu, 27 Jan 2011 01:44:00 GMThttp://www.shnenglu.com/kyelin/archive/2011/01/27/139397.htmlhttp://www.shnenglu.com/kyelin/comments/139397.htmlhttp://www.shnenglu.com/kyelin/archive/2011/01/27/139397.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/139397.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/139397.html (tng)1>Stdafx.cpp 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(236) : error C2146: 语法错误 : ~少??在标识符“PVOID64”的前面)
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(236) : error C4430: ~少cd说明W?- 假定?int。注? C++ 不支持默?int
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(7818) : error C2146: 语法错误 : ~少??在标识符“Buffer”的前面)
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(7818) : error C4430: ~少cd说明W?- 假定?int。注? C++ 不支持默?int
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(7818) : error C4430: ~少cd说明W?- 假定?int。注? C++ 不支持默?int

查找后发现问题出在vc包含目录序问题.
调整DXSDK/Inclue到最后面,问题解决.
参?http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/51043152-3ab6-4a9e-b3c1-2dba8300d9bb/

我风 2011-01-27 09:44 发表评论
]]>
ShockwaveFlash控g详解(转蝲)http://www.shnenglu.com/kyelin/archive/2010/12/24/137390.html我风我风Fri, 24 Dec 2010 09:27:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/12/24/137390.htmlhttp://www.shnenglu.com/kyelin/comments/137390.htmlhttp://www.shnenglu.com/kyelin/archive/2010/12/24/137390.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/137390.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/137390.htmlShockwaveFlash控g详解

本文?a >应有有-应有有|ؓ(f)(zhn)整理提?/p>

?span class="t_tag" href="tag.php?name=%CA%F4%D0%D4">属?/span>斚w

AlignMode Q读写)(j)
语法QAlignMode As Long
说明Q对齐方式,?SAlign 属性联动。当控g?长宽比例与媄(jing)片不一致且 WMode 不ؓ(f) ExactFit Ӟq Q没有被攑֤的)(j)在控件中昄的位|可用该属性调整?该属性值由标志位组成。如图,该属性|二进Ӟ(j)中相 应的位标Cؓ(f) 1 ?span class="t_tag" href="tag.php?name=%C9%E8%D6%C3">讄?jin)相应的寚w方向?属性g相应的对齐方式。后面括号里是二q制数?br />
1Q左寚w(0001)
2Q右寚w(0010)
4Q顶寚w(0100)
8Q底寚w(1000)

也可以组合各U对齐方式,同时两个或以上的位标记?1Q也是这四个基本值组合相加。比如同时左寚w 和顶寚wQ属性值则设ؓ(f) 5Q?101Q?
例子 Q?讄q为右寚wQ?
movie.AlignMode = 2

--------------------------------------------------------

SAlign Q读写)(j)
语法QSAlign As String
说明Q对齐模式(?AlignMode 联动Q。当 AlignMode
代表各对齐模式的位被|?”时QSAlign g相应被设?
“L”(LeftQ、“T”(TopQ、“R”(RightQ、“B”(BottomQ各 字符的组合。‘L’、‘T’、‘R’、‘B’的先后序不变?br />例子Q设|媄(jing)片ؓ(f)左对齐和对齐:(x)
movie.SAlign = "LT"

======================================== 黄金分割U?0.618 ========================================

BackgroundColorQ读写)(j)
语法QBackgroundColor As Long
说明Q媄(jing)片的背景Ԍ?BGColor 联动Q。以Q红 × 65536 Q绿× 256 Q蓝Q计?span class="t_tag" href="tag.php?name=%D1%D5%C9%AB">颜色倹{红l蓝颜色?D_(d)0-255Q。默认的q背景色ؓ(f) -1 。如果媄(jing)?讄?jin)底色或有图片当作背景,那么看不出来该属性值的 改变?sh)(x)有什么媄(jing)响?
例子Q将q背景色设?Q?
movie.BackgroundColor = 255

--------------------------------------------------------

BGColor Q读写)(j)
语法QBGColor As String
说明Q媄(jing)片的背景Ԍ?BackgroundColor 联动Q。与 BackgroundColor 不同的是QBGColor 是一个六位的十六q制敎ͼ每两位分别代表红l蓝颜色倹{如QFFEEAA 表示 U色gؓ(f) FF、绿色gؓ(f) EE 、蓝色gؓ(f) AA ?
例子Q将q背景色设为红Ԍ(x)
movie.BGColor = "FF0000"

======================================== 黄金分割U?0.618 ========================================

Base Q读写)(j)
语法QBase As String
说明Q指定用?span class="t_tag" href="tag.php?name=%BD%E2%BE%F6">解决q中所有相?span class="t_tag" href="tag.php?name=%C2%B7%BE%B6">路径的声明的?span class="t_tag" href="tag.php?name=%B5%D8%D6%B7">地址。当q与其需要的其他文g不在同一目录中的时候该 属性特别有用。如不特别指定,Base 的值默认ؓ(f) "."Q也?是当前媄(jing)片所在的路径?
例子 Q?
movie.Base = "Http://www.domain.com/pathname1/pathname2"

======================================== 黄金分割U?0.618 ========================================

Movie Q读写)(j)
语法QMovie As String
说明Q要播放的媄(jing)片\径(URLQ。设|该属性ؓ(f) 一?SWF 文g?URL 蝲入文件ƈ播放它。若q是在本地盘?sh),要写成从盘符开始的l对路径Q若q是在某网站上Q也要写?URL 地址?
例子 Q?
movie.Movie = "http://www.domain.com/path1/path2/filename.swf"
?
movie.Movie = "c:\temp\test.swf"

======================================== 黄金分割U?0.618 ========================================

DeviceFont Q读写)(j)
语法QDeviceFont As Boolean
说明 Q?军_是否使用q内嵌的字体, 默认gؓ(f) False。将该属性D?True 则强制播攑֙不用媄(jing)片中的内嵌的字体而用本?span class="t_tag" href="tag.php?name=%CF%B5%CD%B3">pȝ字体?
例子Q?br />movie.DeviceFont = True

======================================== 黄金分割U?0.618 ========================================

EmbedMovie Q读写)(j)
语法QEmbedMovie As Boolean
说明Q媄(jing)片是否被存贮到控件所在的容器中。当你已载入一个媄(jing)片后该属性设?TrueQ播攑֪(jing)片时׃必再去读 SWF 文g?jin)。这使得?PowerPoint 报或 VB E序 里?Flash q更容易。但该属性设?True 后,控g?Movie 属性就不再接受新的g(jin)。要x(chng)攑֏一个媄(jing)片(l?Movie 属性赋新|(j)Q必d?EmbedMovie ?性设?False ?
例子 Q?
movie.EmbedMovie = True

======================================== 黄金分割U?0.618 ========================================

FrameNum Q读写)(j)
语法QFrameNum As Long
说明Q媄(jing)片当前的编?Q从 0 开始计敎ͼ(j)。设|?该属性值将使媄(jing)片停在由 FrameNum 指定的处?
例子 Q?昄当前帧数Q?br />MsgBox " 当前昄的是W?" & movie.FrameNum & " 帧?

使媄(jing)片显C第 10 帧:(x)
Bomovie.FrameNum = 9

======================================== 黄金分割U?0.618 ========================================

TotalFramesQ只读)(j)
语法QTotalFrames As Long
说明Q返回媄(jing)片中d数。该参数要到q载入完成才有效(ReadyState=4Q?
例子 Q?
If movie.ReadyState = 4 Then MsgBox " 本媄(jing)片共?" & movie.TotalFrames & " 帧?


======================================== 黄金分割U?0.618 ========================================

Loop Q读写)(j)
语法QLoop As Boolean
说明Q是否@环播放。设?True 是@环播放,设ؓ(f) False 则只播放一ơ?
例子 Q?
movie.Loop = True

======================================== 黄金分割U?0.618 ========================================

Menu Q读写)(j)
语法QMenu As Boolean
说明Q是否显C?span class="t_tag" href="tag.php?name=%B2%CB%B5%A5">菜单。设?True 昄所有菜单,设ؓ(f) False 菜单被屏蔽,但仍有一“About Macromedia Flash Player...”。如果你实在不喜Ƣ这个菜单,应该在程序中通过拦截鼠标消息的方法来辑ֈ目的。与在独立的 Flash 播放器中不同的是Q在控g的右键菜单里点?tng)?br />“About...”的话,׃(x)打开览器到 Macromedia 的网站上??About ?img alt="" src="http://www.vbgood.com/images/smilies/default/run.gif" border="0" smilieid="52" />
例子 Q?
movie.Menu = False


======================================== 黄金分割U?0.618 ========================================

Playing Q只读)(j)
语法QPlaying As Boolean
说明Q当前播攄态。如果媄(jing)片正在播放,该属?gؓ(f) True Q否则ؓ(f) False ?
例子 Q?
If movie.Playing = False Then MsgBox " q已停止播放!"

======================================== 黄金分割U?0.618 ========================================

Quality Q读写)(j)
语法QQuality As Long
说明Q画面质量(?Quality2 联动Q。Quality 可以?
0 ——相当于 Quality2 ?"Low"
1 ——相当于 Quality2 ?"High"
2 ——相当于 Quality2 ?"AutoLow"
3 ——相当于 Quality2 ?"AutoHigh"

例子 Q?
movie.Quality = 1

--------------------------------------------------------

Quality2Q读写)(j)
语法QQuality As String
说明Q画面质??Quality 联动)。Quality2 可以取:(x)
LowQ?/font>偏重于播N度而不显C?span class="t_tag" href="tag.php?name=%D0%A7%B9%FB">效果Q而且不启?
消锯?span class="t_tag" href="tag.php?name=%B9%A6%C4%DC">功能 ?
HighQ?/font>偏重于画面而不播N度Qƈ且L启用 消锯齿功能。如果媄(jing)片中不包含动dqx(chng)处理位图Q如 果有动画Q那么位囑ְ不被qx(chng)处理。(q里的动d?是把一张图片做q移或旋转)(j)
AutoLowQ?/font>先着重于播放速度Q但只要有可能就?善显C效果。一开始播放时先禁用消锯功能。如果播?器检到处理器能承受得了(jin) Q就启用消锯齿功??
AutoHighQ?/font>一开始是播放速度和显C效果ƈ重,?如有必要q牲画质确保速度。开始播放时启用消锯 功能。但如果实际的速率比设计时指定的速率慢了(jin)Q就 用消锯齿功能来提高播放速度?
例子 Q?
movie.Quality2 = "High"

======================================== 黄金分割U?0.618 ========================================

ReadyStateQ只读)(j)
语法QReadyState As Long
说明Q媄(jing)片的当前状态。ReadyState 可以取:(x)
0 ——正在蝲?
1 ——未初始?
2 ——已载入
3 ——正在交?
4 ——完?例子 Q?
If movie.ReadyState = 4 Then MsgBox " q载入完成Q?


======================================== 黄金分割U?0.618 ========================================

Scale Q读写)(j)
语法Qscale As String
说明Q羃放模式(?ScaleMode 联动Q。Scale 可以 ?
ShowAll ——在控g内显C全部媄(jing)片区域,保持q 长宽比例不变Q媄(jing)片的大小军_于控仉或宽中较?yu)的一 ??
NoBorder ——在控g内显C部分媄(jing)片区域,保持q 长宽比例不变Q媄(jing)片的大小军_于控仉或宽中较大的一 ??
ExactFit ——在控g内显C全部媄(jing)片区域,媄(jing)片的?宽比例强制等于控件的长宽比例?
例子 Q?
MsgBox " 当前的羃放模式是Q? & movie.Scale

--------------------------------------------------------

17.ScaleModeQ读写)(j)
语法QScaleMode As Long
说明Q羃放模??Scale 联动)。ScaleMode 可以取:(x)
0 ——相当于 Scale ?"ShowAll"
1 ——相当于 Scale ?"NoBorder"
2 ——相当于 Scale ?"ExactFit"
例子Qq的羃放模式改成“ExactFit ”:(x)
movie.ScaleMode = 2

======================================== 黄金分割U?0.618 ========================================

Stacking Q读写)(j)
语法QStacking As String
说明Q用?HTMLQ将 Flash Player 当成 HTML ?的一U“行为”用时Q该属性决?Flash q相对于与?参照?HTML 内容如何昄。(有关“行为”请参阅样式?的资料)(j)。Stacking 可以取:(x)
none ——“行为”不昄?
replaceall ——“行为”的昄取代全部其他元素的内容,包括背景 ?
content ——“行为”的昄只取代其他元素的?宏V?
background ——“行为”的昄只取代其他元素的背景 ?
below ——“行为”在所有其他元素内容的下面昄?
belowflow ——“行为”以反向 Z 序昄在其他元?的子对象之上Q但在该元素主要内容之上?
aboveflow ——“行为”以正向 Z 序昄在其他元?的子对象之下Q但在该元素主要内容之上?
above ——“行为”显C在所有其他元素的内容之上?
top ——“行为”的昄|于整个面内容之上?br />
例子 Q?
movie.Stacking = "below"



======================================== 黄金分割U?0.618 ========================================

20.WMode Q读写)(j)
语法QWMode As String
说明Q控件的H口模式。WMode 可以取:(x) Window —?WMode 属性的默认|?Flash 播放?
典型的方式工作,卛_控g的矩形窗口中播放qQ这样一 般都能提供最快的动画效果?
Opaque ——q不透明?Transparent ——创Z个透明的媄(jing)片。如果媄(jing)片中?
透明的片D,攑ֈq里Ӟ可以看到控件下面的背景。但 使用此属性|动画的播N度可能?x)慢一些?
例子 Q?
movie.WMode = "Transparent"


写到q里 累残(hu)我了(jin)======

======================================== 白金分割U?0.618 ========================================


二、控件方?/font>


下面中的Ҏ(gu)不返回|(x)

Back
语法QBack() (tng) (tng)
说明 Q?q后退一?Q?q且停止播放 ?例子 Q?
movie.Back

======================================== 黄金分割U?0.618 ========================================

Forward
语法QForward()
说明 Q?q前进一帧, q且停止播放?br />例子 Q?
movie.Forward

======================================== 黄金分割U?0.618 ========================================

GotoFrame
语法QGotoFrame(FrameNum As Long)
说明Q将q跌{到由 FrameNum 指定的Qƈ且停止播放。如果所指定的q未载入Q播攑֙前进到最后的可用帧ƈ停下Q在调用q程中会(x)产生无法预料的后果。最好?PercentLoaded Ҏ(gu)来确定是否已载入_的媄(jing)片来执行本方法。参?FrameNum 是从 0 开始的Q这?Flash 中的 Goto 动作不一P它是?1 开始的?
例子Q蟩转到q的第 20 帧:(x)
movie.GotoFrame 20

======================================== 黄金分割U?0.618 ========================================

LoadMovie
语法QLoadMovie(layer As Long, url As String)
说明Q将?url 指定的媄(jing)片蝲入到?layer 指定的层上?
例子Q将 movie.swf 载入?0 层:(x)
movie.LoadMovie 0, "movie.swf"

======================================== 黄金分割U?0.618 ========================================

Pan
语法QPan(x As Long, y As Long, mode As Long)
说明Q将一个放大过的媄(jing)片^Uȝ x ?y 指定的距R?x ?y 均ؓ(f)相对倹{即控g相对于媄(jing)片来说^Uȝ距离Q你 可以惌控g是一个窗Pq是我们从H户里看到的?在外面的布景, 我们看到H户相对于布景^UM(jin)一些距, 那是外面的布景在动,而窗h不动的)(j)。用 mode 参数 来指?x ?y 的值是像素q是H口的百分比Q当 mode=0 ?坐标pM像素为单位;mode=1 时坐标系׃H口的百?比来计算?q移q不能超出媄(jing)片的Ҏ(gu)Q也是_(d)往 一个方向^UL多到辑֪(jing)片的边缘?sh)控件对齐的E度?
例子Q控件相对于q向左向上各^U?5 个像素(?然控件不?x)?Q是q向右向下q移?Q:(x)
movie.Pan 5,5,0

======================================== 黄金分割U?0.618 ========================================

Play
语法QPlay()
说明Q开始播攑֪(jing)片?br />例子Q?br />movie.Play

======================================== 黄金分割U?0.618 ========================================

Rewind
语法QRewind()
说明Q倒带。返回到q的第一帧?br />例子Q?br />movie.Rewind

======================================== 黄金分割U?0.618 ========================================

SetVariable
语法QSetVariable(name As String, value As String)
说明Q将?name 指定?Flash 变量D?value?br />例子Q?br />movie.SetVariable "/Form:UserName", "John Smith"

======================================== 白金分割U?0.618 ========================================

三、事件方?/font>

FSCommand
语法QShockwaveFlash1_FSCommand(ByVal command As String, ByVal args As String)
说明Q在flash中调用fscommand()触发的事?br />参数Q?br />command Q代?span class="t_tag" href="tag.php?name=%C3%FC%C1%EE">命o(h)标识
args Q代表参?br />
例子Q?br />
Select Case command 'q里可以?if
 (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng) (tng) '但command多了(jin)之后׃?if 用了(jin)
 (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng) (tng) '我是做个C
 (tng) (tng)  (tng) (tng) (tng) Case "command1"
 (tng) (tng)  (tng) (tng)  (tng) (tng)
 (tng) (tng)  (tng) (tng)  (tng) (tng) If args = "123" Then
 (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)
 (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng) ...
 (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)
 (tng) (tng)  (tng) (tng)  (tng) (tng) Else
 (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)
 (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng) ...
 (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)
 (tng) (tng)  (tng) (tng)  (tng) (tng) End If
 (tng) (tng)  (tng) (tng)  (tng) (tng)
 (tng) (tng)  (tng) (tng) (tng) Case ...
 (tng) (tng)  (tng) (tng) (tng)
End Select


======================================== 黄金分割U?0.618 ========================================


FlashCall
语法QShockwaveFlash1_FlashCall(ByVal request As String)
说明Q可能很h知道q个事g的用处,其实q个?FSCommand 事g是差不多的。与 FSCommand 不同的是Q这个事件可以有q回|下面?x)谈刎ͼ?j)

参数是一个XML格式的字W串Q格式是
"<invoke name='%s' returntype='xml'><arguments><string>%s</string></arguments></invoke>"Q去查查帮助q道了(jin)?br />
处理requestQ标准VB没有处理XML的库Q你可以自己找支持XML的插件来用。下面就是按照个人需要处理request?jin)?br />
q回|(x)
事g处理函数是没有返回值的Q但是flash player提供?jin)一个方法:(x)ShockwaveFlash1.SetReturnValue() 专门传递返回|格式?lt;string>%s</string>Q也可以是别的ASl构Q具体看帮助Q?br />
例子Q我在这l出tinyxml的例子:(x)

Private Sub ShockwaveFlash1_FlashCall(ByVal request As String)

Dim request_xml As New TiXmlDocument
Dim request_name As String

request_xml.Parse request
request_name = request_xml.RootElement().Attribute("name")

...自己d理吧

End Sub



======================================== 黄金分割U?0.618 ========================================

OnProgress
语法QShockwaveFlash1_OnProgress(ByVal percentDone As Long)
说明Q估计是flash?span class="t_tag" href="tag.php?name=%BC%D3%D4%D8">加蝲q程中进度改变触发的吧?
percentDone 则应该是个百分数~
反正我还没逮住q个事g一?.= =!


======================================== 黄金分割U?0.618 ========================================

OnReadyStateChange
语法QShockwaveFlash1_OnReadyStateChange(newState As Long)
说明Q顾名思义Q就?ReadyState 改变时触发的事gQ具体请看上面关?ReadyState 属性的说明Q我在这׃废话?...

======================================== 黄金分割U?0.618 ========================================

至于其他事gQ比?br />GotFocus啦、LostFocus啦,我也不想废话?..
from:http://y9j9.com/html/jisuanjiyingyong/201003/28-336.html

我风 2010-12-24 17:27 发表评论
]]>
MFC常用调试函数(?http://www.shnenglu.com/kyelin/archive/2010/11/25/134628.html我风我风Thu, 25 Nov 2010 07:06:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/11/25/134628.htmlhttp://www.shnenglu.com/kyelin/comments/134628.htmlhttp://www.shnenglu.com/kyelin/archive/2010/11/25/134628.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/134628.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/134628.html AfxCheckMemory (tng) (tng)

BOOL AfxCheckMemory( ); (tng) (tng) (tng) // (g)查当前分配的所有内存的完整?br />
q回|(x)如果没有内存错误Q则为非零|否则??br />
说明Q?br />q个函数使自由内存池有效q在需要时输出错误信息。如果这个函数没有检到内存冲突Q它什么也不输出?br />当前在堆中分配的所有内存块都会(x)被检查,包括那些?new分配的内存,但是不包括那些用直接调用内存分配函数分配的内存,例如malloc函数或者Windows的GlobalAlloc函数。如果发现有内存块存在错误,׃(x)在调试器上输出错误信息?br />如果你在E序模块中包含了(jin)下面的程序行Q?br />#define new DEBUG_NEW
后面对AfxCheckMemory的调用都?x)显C发生内存分配的文g名和行号?br />注意Q?br />如果你的模块中包含了(jin)一个或多个串行化类的实玎ͼ那么你必d最后一个IMPLEMENT_SERIAL宏之后包?defineE序行。这个函C在MFC的调试版本中起作用?br />
CZQ?br />// AfxCheckMemory的例?br />CAge* pcage = new CAge( 21 ); // CAge 是从 CObject.l承而来?br />Age* page = new Age( 22 ); // Age 不是?CObject.l承?br />*(((char*) pcage) - 1) = 99; // 破坏前面的保护字?br />*(((char*) page) - 1) = 99; // 破坏前面的保护字?br />AfxCheckMemory();

E序的结果如下:(x)
memory check error at $0067495F = $63, should be $FD
DAMAGE: before Non-Object block at $00674960
Non-Object allocated at file test02.cxx(48)
Non-Object located at $00674960 is 2 bytes long
memory check error at $00674905 = $63, should be $FD
DAMAGE: before Object block at $00674906
Object allocated at file test02.cxx(47)
Object located at $00674906 is 6 bytes long

AfxDump

void AfxDump(const CObject* pOb); (tng) (tng) (tng) // 如果在调试器内调用,则{存对象的状?br />
参数Q?pOb 指向由CObjectl承的类的对象的指针?

说明Q?br />在调试器中调用这个函C在调试时转储对象的状态。AfxDump调用一个对象的Dump函数q且信息发送到afxDump变量指定的位|。AfxDump仅能在MFC的调试版本中使用?br />你的E序代码不应该调用AfxDumpQ而是应该调用适当对象的Dump成员函数?/p>

AfxDumpStack

void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT); // 生成当前栈的一个映像,该函数通常被静(rn)态链?br />
参数Q?dwTarget 指出转储输出的目标。其取值可以用位或操作W(|Q组合v来,可能值如下:(x) · AFX_STACK_DUMP_TARGET_TRACE 通过TRACE宏输出。TRACE仅仅在调试版本中产生输出Q在发行版本中不产生输出。同ӞTRACE可以被重定向到调试器以外的目标?

· AFX_STACK_DUMP_TARGET_DEFAULT {储输出发送到~省目标。对于调试版本,输出发送给TRACE宏。在发行版本中,输出发送到剪脓(chung)ѝ?

· AFX_STACK_DUMP_TARGET_CLIPBOARD 输出仅发送到剪脓(chung)ѝ数据将按CF_TEXT格式以普通文本的形式攑֜剪脓(chung)板上?

· AFX_STACK_DUMP_TARGET_BOTH 同时输出发送到剪脓(chung)板和TRACE宏?

· AFX_STACK_DUMP_TARGET_ODS 通过Win32函数OutputDebugString()直接输出发送的调试器。如果连接了(jin)调试器,它在调试版本和发行版本中都会(x)产生调试器输出。AFX_STACK_DUMP_TARGET_ODS 通常到达调试器(如果q接?jin)调试器Q,q且不能被重定向?

说明Q?br />
q个全局函数可以被用来生成当前栈的一个映象。下面的例子反映?jin)MFC对话框应用程序中按钮处理函数调用AfxDumpStack所产生的单行调试输出:(x)

=== begin AfxDumpStack output ===
...

BFF928E0: WINDOWS\SYSTEM\KERNERL32.DLL! UTUnRegister + 2492 bytes

=== end AfxDumpStack() output ===

BFF928E0Q?最q一ơ函数调用的q回地址

WINDOWS\SYSTEM\KERNEL32.DLL! 包含函数调用的模块的完整路径?

UTUnRegister 调用的函数原?

+ 2492 bytes 以字节ؓ(f)单位的从函数原型地址Q这个例子中为UTUnregisterQ到q回地址Q这个例子中为BEF928E0Q的偏移

AfxDumpStack在MFC库的调试版本和非调试版本中都可以使用。但是,q个函数通常是静(rn)态连接的Q即使你的可执行文g以共享DLL的方式用MFC?br />
在共享库的实CQ可以在MFCS42.LIB库(以及(qing)它的变化形式Q中扑ֈq个函数?br />
Z(jin)成功C用这个函敎ͼ(x)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) · 在你的\径中必须包含I(xin)MAGEHLP.DLL文g。如果你没有q个DLL文gQ这个函C(x)昄一条错误信息。IMAGEHLP.DLL是随Win32 SDK和W(xu)indows一起发售的可散发的DLL。在C:\[Windows]\system[32]下查扑֮。有关IMAGEHLP提供的函数集的介l可以参考“可UL的可执行文g的操作”一文?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) · h栈框架的模块必须包含调试信息。如果它不包含调试信息,q个函数仍然?x)生成对栈的跟踪Q但是这U跟t是很简略的?/p>

AfxEnableMemoryTracking

BOOL AfxEnableMemoryTracking(BOOL bTrack); // 打开或关闭内存跟t?br />
q回|(x)以前的跟t允许状态设|?br />
参数Q?bTrack 这个D为TRUE时就打开?jin)内存跟t特性。如果是FALSE则将其关闭?

说明Q?br />诊断内存跟踪通常在MFC的调试版本中有效。利用这个函数对你的代码中正分配内存的部分止跟踪?br />有关AfxEnableMemoryTracking的更多信息请参见《Visual C++E序员指南》中的“MFC调试支持”?br />注意Q这个函C在MFC的调试版本中起作用?/p>

AfxIsMemoryBlock

BOOL AfxIsMemoryBlock( const void* p, UINT nBytes, LONG* plRequestNumber = NULL ); // (g)验一个内存块是否被正的分配

q回|(x)
如果内存块是现在分配的,q且光度也是正的Q则q回非零倹{否则ؓ(f)0?br />
参数Q?p 指向被试的内存块?
nBytes 包含?jin)以字节为单位的内存块长度?
plRequestNumber 指向一个长整数Q它?yu)被设?f)内存块的分配pdL(fng)。由plRequestNumber指向的这个变量只有当AfxIsMemoryBlockq回非零值时才会(x)被填充?

说明Q?br />(g)一个内存地址Q确保它代表?jin)一个由new的诊断版本分配的zd的内存块。它同时也检验指定的大小是否与最初分配的大小相符。如果这个函数返回非零|分配的系列号码将在plRequestNumber中返回。这个号码代表了(jin)q个内存块相对于其它所有内存分配的序?br />
CZQ?br />// AfxIsMemoryBlock的例?br />CAge* pcage = new CAge( 21 ); // CAge is derived from CObject.
ASSERT( AfxIsMemoryBlock( pcage, sizeof( CAge ) ) )

AfxIsValidString

BOOL AfxIsValidString( LPCSTR lpsz, int nLength = -1 ); // (g)验一个字W串指针是否有效


如果l定的指针指向一个给定大的字符串则q回非零|否则q回0?br />
参数Q?lpsz 要测试的指针?
nLength 指定要测试的字符串的长度Q以字节为单位。如果gؓ(f)Q?Q表C字W串是以nulll尾的?

说明Q?br />使用q个函数来确定指向字W串的指针是否有效?/p>

AfxSetAllocHook

AFX_ALLOC_HOOK AfxSetAllocHook( AFX_ALLOC_HOOK pfnAllocHook ); // 允许在每ơ进行内存分配事调用一个函?br />
如果你希望允许分配,则返回非零倹{否则返??br />
参数Q?pfnAllocHook 指定要调用的函数名。参考关于分配函数的原型的说明?

说明Q?br />q个函数讄一个钩子,使每ơ分配内存(sh)前都?x)调用一个指定的函数。微软基cd中的调试内存分配函数能够调用一个用户定义的钩子函数Q用户能够监控内存分配q控制是否允许分配内存。内存分配的钩子函数的原型如下:(x)
BOOL AFXAPI AllocHook( size_t nSize, BOOL bObject, LONG lRequestNumber );

nSize 计划分配的内存大?
bObject 如果是要Z个CObjectzcd象分配内存则为TRUEQ否则ؓ(f)FALSE?
lRequestNumber 内存分配的系列号?br />注意QAFXAPI调用U定意味着调用者必M栈中清除参数?/p>

AfxDoForAllClasses

void AFXAPI AfxDoForAllClasses(
void (* pfn)(const CRuntimeClass* pClass, void* pContext),
void* pContext
); //Ҏ(gu)有从CObjectl承的支持运行时(g)查的cL行一个特定的功能

参数Q?pfn 指向每个c都?x)调用的重复函数。这个参数是一个指向CRuntimeClass对象的指针以?qing)指向调用者提供给函数的附加数据的void指针?
pContext 指向调用者提供给重复函数的可选数据的指针。这个指针可以是NULL?

说明Q?br />在应用程序的内存I间中,为所有从CObjectl承的可串行化的c调用指定的重复函数。从CObjectl承的可串行化的cL以DECLARE_SERIAL宏(h)承的。每ơ调用指定的重复函数Ӟ都会(x)在pContext中传递给AfxDoForAllClasses的指针传递给重复函数?br />注意Q这个函C在MFC的调试版本中起作用?/p>

AfxDoForAllObjects

void AfxDoForAllObjects(
void (* pfn)(CObject* pObject, void* pContext),
void* pContext
); // Ҏ(gu)有从CObjectl承的用new分配内存对象执行一个指定的功能

参数Qpfn 指向每个对象都执行的重复函数。函数的参数是一个指向CObject的指针以?qing)指向调用者提供给函数的附加数据的void指针?
pContext 指向调用者提供给函数的附加数据的指针。这个指针可以ؓ(f)NULL?

说明Q?br />Ҏ(gu)个用new分配的从CObjectl承的对象执行指定的重复函数。栈、全局变量或嵌入对象不包括在内。每ơ调用指定的重复函数Ӟ都会(x)在pContext中传递给AfxDoForAllObjects的指针传递给重复函数?br />注意Q这个函C在MFC的调试版本中起作用?br />
from:http://hi.baidu.com/ice_water/blog/item/7cef04f73475c42a720eec98.html



我风 2010-11-25 15:06 发表评论
]]>
CRichEditCtrl使用大全http://www.shnenglu.com/kyelin/archive/2010/11/03/132300.html我风我风Wed, 03 Nov 2010 07:51:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/11/03/132300.htmlhttp://www.shnenglu.com/kyelin/comments/132300.htmlhttp://www.shnenglu.com/kyelin/archive/2010/11/03/132300.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/132300.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/132300.htmlrichedit 常见使用问题
一.常见问题
a.可以~译,不能执行?/p>


在需要在相应的对话框中加上InitInstanceQvoidQ函Cd

AfxInitRichEdit();

b.升默认的Riched版本(默认的有一些bug)Q如
可在InitInstance中添?br />LoadLibrary("RICHED20.DLL")
最后注?FreeLibrary

如果是CRichEditView基类的可?br />BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)
{
//装入rich edit version 2.0
if (LoadLibraryA("RICHED20.DLL") == NULL)
{
AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);
PostMessage(WM_QUIT,0,0);
return FALSE;
}

m_strClass = RICHEDIT_CLASSA;//for 2.0 class

return CRichEditView::PreCreateWindow(cs);
}

c.最后追加行
richeditctrl.SetSel(-1, -1);
richeditctrl.ReplaceSel( (LPCTSTR)str );

d.字数限制
CRichEditCtrl::LimitText(long nChars)

e.换行切换
CRichEditView的OnInitialUpdate()函数中加入下面两句:(x)
m_nWordWrap = WrapNone;
WrapChanged();
WrapChanged实际上也是调?br />ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone
ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
q有不常用的 m_nWordWrap == WrapToTargetDevice
ctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());
如果是在Dialog中,可用SetTargetDeviceQ注意在属性里面加上want return

f.有时候不希望带格式的数据_脓(chung)Q可通过PasteSpecial选择性粘?br />pmyRichEditCtrl->PasteSpecial(CF_TEXT);

g.随着输入随着自动滚动条滚动到最后一?br />int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();
if (nFirstVisible > 0)
{
 (tng) (tng) (tng) pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);
}
?br />m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);


h.讄UNDO的次?只能用在RICHED20以上Q即默认不支持,必须升)
SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
TM_MULTILEVELUNDO 支持多取?默认?.可通过EM_SETUNDOLIMIT讄最大次?
SendMessage(EM_SETUNDOLIMIT,100,0);

i.响应OnChange
EM_SETEVENTMASK 讄 ENM_CHANGE
long lMask = GetEventMask();
lMask |= ENM_CHANGE;
lMask &= ~ENM_PROTECTED;
SetEventMask(lMask);

j.讄只读
CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );
通过讄PROTECTED实现选中的文本只读,参见
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/


?函数应用
a.讄字体Q主要是通过SetSelectionCharFormatQ?br />CHARFORMAT cf;
rich.GetSelectionCharFormat(cf);
cf.dwMask|=CFM_BOLD;
cf.dwEffects|=CFE_BOLD;//讄_体Q取消用cf.dwEffects&=~CFE_BOLD;
cf.dwMask|=CFM_ITALIC;
cf.dwEffects|=CFE_ITALIC;//讄斜体Q取消用cf.dwEffects&=~CFE_ITALIC;
cf.dwMask|=CFM_UNDERLINE;
cf.dwEffects|=CFE_UNDERLINE;//讄斜体Q取消用cf.dwEffects&=~CFE_UNDERLINE;
cf.dwMask|=CFM_COLOR;
cf.crTextColor = RGB(255,0,0);//讄颜色
cf.dwMask|=CFM_SIZE;
cf.yHeight =200;//讄高度
cf.dwMask|=CFM_FACE;
strcpy(cf.szFaceName ,_T("隶书"));//讄字体
rich.SetSelectionCharFormat(cf);

b.讄字体的行间距
要用richedit2.0以上
试试
PARAFORMAT2 pf;
pf.cbSize = sizeof(PARAFORMAT2);
pf.dwMask = PFM_NUMBERING | PFM_OFFSET;
pf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING
pf.dxOffset = 10;
VERIFY(SetParaFormat(pf));
常用的dwMask?br />PFM_NUMBERING 成员 wNumbering 才v作用Q项目符P默认用PFN_BULLET
2 使用阿拉伯数?(1, 2, 3, ...). (tng)
3 使用写字母 (a, b, c, ...). (tng)
4 使用大写字母 (A, B, C, ...). (tng)
5 使用写|马数字 (i, ii, iii, ...). (tng)
6 使用大写|马数字 (I, II, III, ...). (tng)
7 自定义,字符见成?wNumberingStart. (tng)
PFM_OFFSET 成员 dxOffset 才v作用Q羃q,单位twips
PFM_STARTINDENT 成员 dxStartIndent 才v作用Q首行羃q?br />PFM_SPACEAFTER 成员 dySpaceAfter 才v作用Q段间距
PFM_LINESPACING 成员 dyLineSpacing 才v作用Q行间距

c.讄CRichEditCtrl(2.0)背景透明
long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
style &= WS_EX_TRANSPARENT;
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);
?CreateExQ然后把WS_EX_TRANSPARENT样式加上

e.得到内容有三U?br />1)GetWindowText
2)使用EM_GETTEXTEX
GETTEXTEX gt;
gt.cb = 200;
gt.flags = GT_DEFAULT;
gt.codepage = CP_ACP ;
gt.lpDefaultChar = NULL;
gt.lpUsedDefChar = NULL;
SendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);
3)StreamOut(主要用于RTF{格式输?
static DWORD CALLBACK
MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
 (tng) (tng) (tng) CFile* pFile = (CFile*) dwCookie;

 (tng) (tng) (tng) pFile->Write(pbBuff, cb);
 (tng) (tng) (tng) *pcb = cb;

 (tng) (tng) (tng) return 0;
}


 (tng) (tng) (tng) CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);
 (tng) (tng) (tng) EDITSTREAM es;
 (tng) (tng) (tng) es.dwCookie = (DWORD) &cFile;//讄用例参数,以便回调函数调用
 (tng) (tng) (tng) es.pfnCallback = MyStreamOutCallback;
 (tng) (tng) (tng) pmyRichEditCtrl->StreamOut(SF_RTF, es);
d可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn

f.查找字符?br />FINDTEXTEX ft;
ft.chrg.cpMin = 0;
ft.chrg.cpMax = -1;
ft.lpstrText = "|";
long lPos = FindText(0, &ft);

如果要(h)l查找,修改cpMin,?br />int nCount = 0;
do
{
long lPos = GetRichEditCtrl().FindText(0, &ft);
if( -1 == lPos) break;
ft.chrg.cpMin = lPos + strlen(ft.lpstrText);
++nCount;
}while(TRUE);

g.以Html格式保存
目前做法可先转ؓ(f)RTF格式Q再通过RTF-to-HTML Converter

http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/

h.重蝲OnProtected函数得到对应的消息,如粘贴等
void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
{
ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;

switch (pEP->msg) {
case WM_KEYDOWN://按键Q判断pEP->wParam
case WM_PASTE://_脓(chung)
case WM_CUT://剪切
case EM_SETCHARFORMAT:
default:
 (tng) (tng) break;
};

*pResult = FALSE;
}

?聊天常用 (tng)
a.LINK 链接功能
1. (tng) (tng) LoadLibrary(_T("Riched20.dll"));
2. 创徏RichEdit2.0控g
CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP
|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) rect.left, rect.top, cx, cy,
 (tng) (tng) pParentWnd->m_hWnd, (HMENU)nID, NULL);
3. 讑֮选中的文字ؓ(f)链接昄
CHARFORMAT2 cf2;
ZeroMemory(&cf2, sizeof(CHARFORMAT2));//
cf2.cbSize = sizeof(CHARFORMAT2);
cf2.dwMask = CFM_LINK;
cf2.dwEffects |= CFE_LINK;
m_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
4.支持链接的点d?br />m_cRichEdit.SetEventMask(ENM_LINK);
5.响应链接的点击EN_LINK

BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
ON_NOTIFY_REFLECT(EN_LINK,OnURL)
END_MESSAGE_MAP()
......

void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
{
TCHAR LinkChar[512];
ENLINK *pLink = (ENLINK *)pNmhdr;
if (pLink->msg == WM_LBUTTONUP)
{
SetSel(penLink->chrg);//q是链接的文字范?br />long Res = GetSelText((char *)LinkChar);//q是链接文字
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //后面是你的处理过E?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ......
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
}

b.插入位图
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/

自定义在RichEdit中插入对象的图标
http://www.blogcn.com/user3/jiangsheng/blog/1319738.html
Ҏ(gu)基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作ؓ(f)参数QHGLOBAL里面的数据是一个METAFILEPICTl构Q包含自己提供的囄

使用CRichEditView::InsertFileAsObject可以插入图像。VC++带有一个例子WordPad?br />另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control?http://www.codeguru.com/richedit/richeditrc.html)?/p>

c.昄GIF动画
常用的是通过qq的imageole.dll(也有用Gif89.dll?
http://www.xiaozhou.net/cooldog/blogview.asp?logID=82
http://www.codeproject.com/richedit/AnimatedEmoticon.asp

在richedit控g中插入动态GIF (Native C++?
http://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx

d.IRichEditOleCallback的?br />http://61.186.252.131/Expert/topic/905/905844.xml?temp=.8379022

cM MSN 信息发送框的制??
http://www.vckbase.com/document/viewdoc/?id=1087
内容包含Q实现右键菜单,囄插入Q读?写入RTF格式字符?/p>

自定?CRichEditCtrl 控g
http://www.vckbase.com/document/viewdoc/?id=328
内容包含Q鼠标右键消息,消息映射Q字体变?/p>

PS.richedit控g升?.0后,先把字体设ؓ(f)楷体Q输入汉字没有问题,但输入字母时Q字母自动蟩转ؓ(f)Arial字体Q?.0却没有这个文题,仍然是用楷体昄字母
是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778

不能昄囄{其他OLE对象

MFC提供的CRichEditCtrl没有提供直接昄囄{OLE对象的属性或Ҏ(gu)讄Q但是提供了(jin)一个接口SetOLECallback( IRichEditOleCallback* pCallback );
要让CRichEditCtrl昄囄Q就得在IRichEditOleCallback上下功夫?br />IRichEditOleCallback是windows中的接口Q它的定义如下:(x)
ContextSensitiveHelp:
 (tng) (tng) (tng) 通过该方法通知应用E序它将以上下文兌方式调度帮助?br />DeleteObject:
 (tng) (tng) (tng) 通过该方法发出通知Q一个对象即从RichEdit控g中删?br />GetClipboardData:
 (tng) (tng) (tng) 通过该方法允许RichEdit的客L(fng)Q调用程序)(j)提供自己的粘贴对?br />GetContextMenu:
 (tng) (tng) (tng) 通过该方法向应用E序提出通过鼠标右键事g来获取上下文菜单的请?br />GetDragDropEffect:
 (tng) (tng) (tng) 通过该方法允许RichEdit的客L(fng)Q调用程序)(j)讄拖动操作的效?br />GetInPlaceContext:
 (tng) (tng) 通过该方法提供了(jin)应用E序U和文档U接口,以及(qing)必要的支持In-placeȀzȝ信息
GetNewStrorage:
 (tng) (tng) (tng) 通过该方法存储从_脓(chung)板或文本流(RTF)中读取的新对?br />QueryAcceptData:
 (tng) (tng) (tng) 通过该方法决定在_脓(chung)操作或拖放操作中引入的数据是否可以被接受?br />QueryInsertObject:
 (tng) (tng) (tng) 通过该方法向应用E序询问某个对象是否可以被插?br />ShowContainerUI:
 (tng) (tng) (tng) 通过该方法告知应用程序是否显Cq操作界面

大致?jin)解了(jin)IRichEditOleCallback接口后,应该清楚,要显C图片等ole对象Q至应该实现GetNewStorageҎ(gu)Q因Ҏ(gu)是存储ole对象的接口方法?/p>

以下是接口声明的代码Q?br /> (tng) (tng) (tng) interface IExRichEditOleCallback; (tng) (tng) // forward declaration (see below in this header file)

 (tng) (tng) IExRichEditOleCallback* m_pIRichEditOleCallback;
 (tng) (tng) BOOL m_bCallbackSet;
 (tng) (tng)
 (tng) (tng)
 (tng) (tng) interface IExRichEditOleCallback : public IRichEditOleCallback
 (tng) (tng) {
 (tng) (tng) public:
 (tng) (tng) (tng) (tng) (tng) (tng) IExRichEditOleCallback();
 (tng) (tng) (tng) (tng) (tng) (tng) virtual ~IExRichEditOleCallback();
 (tng) (tng) (tng) (tng) (tng) (tng) int m_iNumStorages;
 (tng) (tng) (tng) (tng) (tng) (tng) IStorage* pStorage;
 (tng) (tng) (tng) (tng) (tng) (tng) DWORD m_dwRef;

 (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE GetNewStorage(LPSTORAGE* lplpstg);
 (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject);
 (tng) (tng) (tng) (tng) (tng) (tng) virtual ULONG STDMETHODCALLTYPE AddRef();
 (tng) (tng) (tng) (tng) (tng) (tng) virtual ULONG STDMETHODCALLTYPE Release();
 (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE GetInPlaceContext(LPOLEINPLACEFRAME FAR *lplpFrame,
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) LPOLEINPLACEUIWINDOW FAR *lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE ShowContainerUI(BOOL fShow);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE DeleteObject(LPOLEOBJECT lpoleobj);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR *lpcfFormat,
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE GetClipboardData(CHARRANGE FAR *lpchrg, DWORD reco, LPDATAOBJECT FAR *lplpdataobj);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) virtual HRESULT STDMETHODCALLTYPE GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR *lpchrg,
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) HMENU FAR *lphmenu);
 (tng) (tng) };

-----------------------------------------------------------------------

注:(x)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_edit1代表ID为IDC_EDIT1的CEdit控g的controlcd的变?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_richedit1代表ID为IDC_RICHEDIT1的CRichEditCtrl控g的controlcd的变?/p>


--------------------------------------------------------------------------------
1.讄edit只读属?/p>

 (tng) (tng) (tng) Ҏ(gu)一Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_edit1.SetReadOnly(TRUE);
 (tng) (tng) (tng) Ҏ(gu)二:(x)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);


--------------------------------------------------------------------------------
2.判断edit中光标状态ƈ得到选中内容(richedit同样适用)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) int nStart, nEnd;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) CString strTemp;

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_edit1.GetSel(nStart, nEnd);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(nStart == nEnd)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) strTemp.Format(_T("光标?d"), nStart);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) AfxMessageBox(strTemp);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) else
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //得到edit选中的内容?tng) (tng)?
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_edit1.GetWindowText(strTemp);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) AfxMessageBox(strTemp);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) 注:(x)GetSel后,如果nStart和nEndQ表明光标处于某个位|(直观来看是光标在闪动)(j)Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 如果nStart和nEnd不相{,表明用户在edit中选中?jin)一D内宏V?/p>


--------------------------------------------------------------------------------
3.在edit最后添加字W串

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) CString str;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_edit1.SetSel(-1, -1);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_edit1.ReplaceSel(str);


--------------------------------------------------------------------------------
4.随输入自动滚动到最后一?richedit同样适用)

 (tng) (tng) (tng) Ҏ(gu)一Q(摘自msdnQ?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) // The pointer to my edit.
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) extern CEdit* pmyEdit;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) int nFirstVisible = pmyEdit->GetFirstVisibleLine();

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) // Scroll the edit control so that the first visible line
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) // is the first line of text.
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (nFirstVisible > 0)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) pmyEdit->LineScroll(-nFirstVisible, 0);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) Ҏ(gu)二:(x)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_richedit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);


--------------------------------------------------------------------------------
5.如何限制edit输入指定字符

 (tng) (tng) 可以从CEditz一个类Q添加WM_CHAR消息映射。下面一个例子实C(jin)限定输入16q制字符的功能?/p>

 (tng) (tng) void CMyHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
 (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) if ( (nChar >= '0' && nChar <= '9') ||
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (nChar >= 'a' && nChar <= 'f') ||
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (nChar >= 'A' && nChar <= 'F') ||
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) nChar == VK_BACK ||
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) nChar == VK_DELETE) (tng) (tng) (tng) //msdn的virtual key
 (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CEdit::OnChar(nChar, nRepCnt, nFlags);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) } (tng) (tng) (tng) (tng)
 (tng) (tng) }


--------------------------------------------------------------------------------
6.如何使用richedit

 (tng) (tng) (tng) dAfxInitRichEdit();
 (tng) (tng) (tng) (tng) (tng) (tng) CxxxApp::InitInstance()
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) AfxInitRichEdit();
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) .............
 (tng) (tng) (tng) (tng) (tng) (tng) }

 (tng) (tng) AfxInitRichEdit()功能Q装?RichEdit 1.0 Control (RICHED32.DLL).


--------------------------------------------------------------------------------
7.如何使用richedit2.0 or richedit3.0

 (tng) (tng) (tng) 使用原因Q由于RichEdit2.0A自动为宽字符QWideCharQ,所以它可以解决中文q以及(qing)一些汉字问?/p>

 (tng) (tng) (tng) Ҏ(gu)一Q(msdn上的做法Q适用于用VC.NET?qing)以后版本创建的工程Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) To update rich edit controls in existing Visual C++ applications to version 2.0,
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) open the .RC file as text, change the class name of each rich edit control from (tng) (tng) "RICHEDIT" to (tng) "RichEdit20a".
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) Then replace the call to AfxInitRichEdit with AfxInitRichEdit2.
 (tng) (tng) (tng) Ҏ(gu)二:(x)以对话框ZQ?br /> (tng) (tng) (tng) (tng) (tng) (tng) (1) (tng) (tng) (tng) 增加一全局变量 HMODULE hMod;
 (tng) (tng) (tng) (tng) (tng) (tng) (2) (tng) (tng) (tng) 在CxxxApp::InitInstance()中添加一句hMod = LoadLibrary(_T("riched20.dll"));
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 在CxxxApp::ExitInstance()中添加一句FreeLibrary(hMod);
 (tng) (tng) (tng) (tng) (tng) (tng) (3) (tng) (tng) (tng) (tng) (tng) 在对话框上放一个richeditQ文本方式打开.rc文g修改该richedit控g的类?RICHEDIT" to (tng) "RichEdit20a".
 (tng) (tng) (tng) (tng) (tng) (tng) (4) (tng) (tng) (tng) (tng) (tng) 在对话框头文件添?CRichEditCtrl m_richedit;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 在OnInitDialog中添?m_richedit.SubclassDlgItem(IDC_RICHEDIT1, this);


--------------------------------------------------------------------------------
8.改变richedit指定区域的颜色及(qing)字体

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) CHARFORMAT cf;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) ZeroMemory(&cf, sizeof(CHARFORMAT));
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) cf.cbSize = sizeof(CHARFORMAT);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) cf.dwEffects = 0;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) cf.yHeight = 12*12;//文字高度
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) cf.crTextColor = RGB(200, 100, 255); //文字颜色
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) strcpy(cf.szFaceName ,_T("隶书"));//讄字体
 (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_richedit1.SetSel(1, 5); //讄处理区域
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_richedit1.SetSelectionCharFormat(cf);


--------------------------------------------------------------------------------
9.讄行间距(只适用于richedit2.0Q?/p>

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) PARAFORMAT2 pf;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) pf2.cbSize = sizeof(PARAFORMAT2);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) pf2.dwMask = PFM_LINESPACING | PFM_SPACEAFTER;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) pf2.dyLineSpacing = 200;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) pf2.bLineSpacingRule (tng) = 4;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_richedit.SetParaFormat(pf2);


--------------------------------------------------------------------------------
10.richedit插入位图

Q220844QHow to insert a bitmap into an RTF document using the RichEdit control in Visual C++ 6.0
http://support.microsoft.com/default.aspx?scid=kb;en-us;220844
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/


--------------------------------------------------------------------------------
11.richedit插入gif动画

http://www.codeproject.com/richedit/AnimatedEmoticon.asp


--------------------------------------------------------------------------------
12.richedit嵌入ole对象

http://support.microsoft.com/kb/141549/en-us


--------------------------------------------------------------------------------
13.使richedit选中内容只读

http://www.codeguru.com/cpp/controls/richedit/article.php/c2401/


--------------------------------------------------------------------------------
14.打印richedit

http://www.protext.com/MFC/RichEdit3.htm


--------------------------------------------------------------------------------
15.richeidt用于聊天消息H口

http://www.vckbase.com/document/viewdoc/?id=1087
http://www.codeproject.com/richedit/chatrichedit.asp
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2395/


--------------------------------------------------------------------------------
16.解决richedit的EN_SETFOCUS和EN_KILLFOCUS无响应的问题

http://support.microsoft.com/kb/181664/en-us


--------------------------------------------------------------------------------
17.richedit拼写(g)?/p>

http://www.codeproject.com/com/AutoSpellCheck.asp


--------------------------------------------------------------------------------
18.改变edit背景?/p>

Q117778QHow to change the background color of an MFC edit control
http://support.microsoft.com/kb/117778/en-us


--------------------------------------------------------------------------------
19.当edit控g的父H口属性是带标题栏WS_CAPTION和子H口WS_CHILDӞ不能讄焦点SetFocus

Q230587QPRB: Can't Set Focus to an Edit Control When its Parent Is an Inactive Captioned Child Window

http://support.microsoft.com/kb/230587/en-us

--------------------------------------------------------------------------------
20. 在Edit中回车时Q会(x)退出对话框

选中Edit的风格Want Return?/p>

MSDN的解释如下:(x)
ES_WANTRETURN (tng) (tng) Specifies that a carriage return be inserted when the user presses the ENTER key while entering text into a multiple-line edit control in a dialog box. Without this style, pressing the ENTER key has the same effect as pressing the dialog box's default pushbutton. This style has no effect on a single-line edit control.


--------------------------------------------------------------------------------
21. 动态创建的edit没有Ҏ(gu)的问?/p>

 (tng) (tng) (tng) m_edit.Create(....);
 (tng) (tng) (tng) m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);

--------------------------------------------------------------------------------
22. 一个能昄RTFQoleQ包括gifQ?wmvQexcel QpptQ的例子

http://www.codeproject.com/richedit/COleRichEditCtrl.asp


本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/qsycn/archive/2009/11/10/4793461.aspx

 (tng)

本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/abcpanpeng/archive/2010/04/21/5509680.aspx



我风 2010-11-03 15:51 发表评论
]]>
一个xppȝdll说明|站http://www.shnenglu.com/kyelin/archive/2010/10/29/131756.html我风我风Fri, 29 Oct 2010 07:33:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/10/29/131756.htmlhttp://www.shnenglu.com/kyelin/comments/131756.htmlhttp://www.shnenglu.com/kyelin/archive/2010/10/29/131756.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/131756.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/131756.html
http://xpdll.nirsoft.net/

我风 2010-10-29 15:33 发表评论
]]>
Dump文g生成(?http://www.shnenglu.com/kyelin/archive/2010/10/13/129758.html我风我风Wed, 13 Oct 2010 08:35:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/10/13/129758.htmlhttp://www.shnenglu.com/kyelin/comments/129758.htmlhttp://www.shnenglu.com/kyelin/archive/2010/10/13/129758.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/129758.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/129758.html生成minidump目的是保存程序异常时的调用栈信息Q便于寻N题原因?/p>

1, d下面得函敎ͼ

#include <dbghelp.h>
#include <shellapi.h>
#include <shlobj.h>

LONG WINAPI GenerateDump(struct _EXCEPTION_POINTERS *pExceptionPointers)
{
LONG ret = EXCEPTION_EXECUTE_HANDLER;
BOOL bMiniDumpSuccessful;
TCHAR szPath[MAX_PATH];
TCHAR szFileName[MAX_PATH];
TCHAR* szAppName = TEXT(“AppName?;
TCHAR* szVersion = TEXT(“v1.0?;
DWORD dwBufferSize = MAX_PATH;
HANDLE hDumpFile;
SYSTEMTIME stLocalTime;
MINIDUMP_EXCEPTION_INFORMATION ExpParam;

GetLocalTime( &stLocalTime );
GetTempPath( dwBufferSize, szPath );

_stprintf( szFileName, TEXT(?s%s?, szPath, szAppName );
CreateDirectory( szFileName, NULL );

_stprintf( szFileName, TEXT(“c:\\aaaa.dmp?);
hDumpFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);

ExpParam.ThreadId = GetCurrentThreadId();
ExpParam.ExceptionPointers = pExceptionPointers;
ExpParam.ClientPointers = TRUE;

bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);

int i = GetLastError();
HRESULT hr = HRESULT_FROM_WIN32(i);

return ret;
}

2Q在project setting中加入dbghelp.lib作ؓ(f)library的inputQ这是MiniDumpWriteDump需要的?strong>在Debug Information Format讄Program Database (/Zi)。设|?strong>Generate Debug Info?strong>Yes (/DEBUG)。在OptimizationReferences?Eliminate Unreferenced Data (/OPT:REF)。设|?Enable COMDAT Folding?Remove Redundant COMDATs (/OPT:ICF)。后面两设|可以大大羃?yu)exe文g大小?/p>

3Q用如下:(x)

void SomeFunction()
{
int *pBadPtr = NULL;
*pBadPtr = 0;
}
void Ctest2Dlg::OnBnClickedButton1()
{
__try
{
SomeFunction();
}
__except(GenerateDump(GetExceptionInformation()))
{
}
}

4Q用windbg打开dmp文gQ就可以看到出错时的call stack?jin)?/p>

几点要注意的Q?Q网上有文章介绍使用 SetUnhandledExceptionFilter讄异常qo(h)Q保证出现异常时能调用minidump函数Q但是这有些问题Q这个函C(x)Ddebugger失效Q而且好像跟drwatson有些冲突Q感觉用h比较危险。在E序的关键部分加入__try ?__exceptionQ这L(fng)?yu)捕捉范_(d)应该p够用?jin)?Q必L用__try ?__exceptionq样的Ş式,才能保证GetExceptionInformation()能正怋用?QMiniDumpWithDataSegsq个参数我试着换成另外几个Q好像都不好用。返回值都?Q经q解析lasterror都是E_INVALIDARGQ奇怪?/p>

update: 关于使用windbg

windbg下蝲地址在这?a >http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx

下蝲安装最新版本即可,我没有搞清楚的一Ҏ(gu)必须要设|windows的symbol目录Q否则光有pdb是没法看到调用栈信息的?/p>

使用windbgq程如下Q安装。然后打开菜单file-> symbol file pathQ添加如?/p>

srv*c:\symbol_local*http://msdl.microsoft.com/download/symbols;c:\debug

其中srv*c:\symbol_local*http://msdl.microsoft.com/download/symbols;指明从网上下载操作系l用的symbol存放到c盘symbol_local目录Q另外程序的symbolQpdb文gQ可以放在c盘debug目录下?/p>

windbg?x)显CZD|间busy或者retrieving..Q然后就可以看到详细的dump信息?/p>

我风 2010-10-13 16:35 发表评论
]]>
VC++ SMTP协议?sh)子邮g传送剖??http://www.shnenglu.com/kyelin/archive/2010/10/11/129427.html我风我风Mon, 11 Oct 2010 06:05:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/10/11/129427.htmlhttp://www.shnenglu.com/kyelin/comments/129427.htmlhttp://www.shnenglu.com/kyelin/archive/2010/10/11/129427.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/129427.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/129427.html
  前言

  ?sh)子邮g服务作ؓ(f)Internet上应用最多和最q的服务目得到?jin)非常广泛的应用Q在|络应用中也起到非常重要的作用。如同其他的|络服务Q电(sh)子邮件系l也有其使用的传输协议,包括SMTPQSimple Mail Transfer ProtocolQ简单邮件传输协议)(j)、POPQPost Office ProtocolQ邮局协议Q和IMAPQInternet Message Access ProtocalQ消息访问协议)(j){,q些协议应用于电(sh)子邮件的发送和接收。一些邮件处理Y件如OutLook Express和FoxMail{就是按照SMTP和POP3 协议l合Windows Sockets套接字进行设计来收发邮g的。本文以SMTP协议为研I对象,在Visual C++ 6.0~程环境下按照SMTP协议通过套接字发送SMTP命o(h)Q接收ƈ处理邮g服务器的反馈信息Q从而实现对?sh)子邮g的发送?br />
  SMTP协议的通讯模型和会(x)话流E?/font>

  SMTP协议通讯模型

  SMTP协议是TCP/IP协议族中的一员,主要对如何将?sh)子邮g从发送方地址传送到接收方地址Q也x(chng)对传输的规则做了(jin)规定。SMTP协议的通信模型q不复杂Q主要工作集中在发送SMTP和接收SMTP上:(x)首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链\Q这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最l的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命o(h)Q而接收SMTP则负责接收ƈ反馈应答。可大致用下面的通讯模型C意图来表示Q?br />

  SMTP协议的命令和应答

  从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会(x)话是靠发送SMTP?SMTP命o(h)和接收SMTP反馈的应{来完成的。在通讯链\建立后,发送SMTP发送MAIL命o(h)指o(h)邮g发送者,若接收SMTP此时可以接收邮g则作出OK的应{,然后发送SMTPl箋(hu)发出RCPT命o(h)以确认邮件是否收刎ͼ如果接收到就作出OK的应{,否则发出拒l接收应{,但这q不?x)对整个邮g操作造成影响。双方如此反复多ơ,直至邮g处理完毕。SMTP协议共包?0个SMTP命o(h)Q列表如下:(x)

SMTP命o(h)命o(h)说明
HELLO QdomainQ?QCRLFQ?/td>识别发送方到接收SMTP的一个HELLO命o(h)
MAIL FROM:Qreverse-pathQ<CRLFQ?Qreverse-pathQؓ(f)发送者地址。此命o(h)告诉接收方一个新邮g发送的开始,q对所有的状态和~冲行初始化。此命o(h)开始一个邮件传输处理,最l完成将邮g数据传送到一个或多个邮箱中?/td>
RCPT TO:Qforward-pathQ<CRLFQ?Qforward-pathQ标识各个邮件接收者的地址
DATA QCRLFQ?
接收SMTP把其后的行为看作邮件数据去处理Q以QCRLFQ?QCRLFQ标识数据的l尾?/td>
REST QCRLFQ?/td>退?复位当前的邮件传?/td>
NOOP QCRLFQ?/td>要求接收SMTP仅做OK应答。(用于试Q?/td>
QUIT QCRLFQ?/td>要求接收SMTPq回一个OK应答q关闭传输?/td>
VRFY QstringQ?QCRLFQ?验证指定的邮是否存在,׃安全因素Q服务器多禁止此命o(h)?/td>
EXPN QstringQ?QCRLFQ?验证l定的邮列表是否存在,扩充邮箱列表Q也常禁止用?/td>
HELP QCRLFQ?/td>查询服务器支持什么命?/td>

注:(x)QCRLFQؓ(f)回R、换行,ASCII码分别ؓ(f)13?0Q十q制Q?br />
  SMTP协议的每一个命令都?x)返回一个应{码Q应{码的每一个数字都是有特定含义的,如第一位数字ؓ(f)2时表C命令成功;?表失败;3表没有完成。一些较复杂的邮件程序利用该特点Q首先检查应{码的首数字QƈҎ(gu)其值来军_下一步的动作。下面将SMTP的应{码列表如下Q?br />
应答?/td>说明
501 参数格式错误
502 命o(h)不可实现
503 错误的命令序?/td>
504 命o(h)参数不可实现
211 pȝ状态或pȝ帮助响应
214 帮助信息
220QdomainQ服务就l?/td>
221 QdomainQ服务关?/td>
421 QdomainQ服务未qAQ关闭传输信?/td>
250要求的邮件操作完?/td>
251 用户非本圎ͼ{发向Qforward-pathQ?/td>
450 要求的邮件操作未完成Q邮׃可用
550 要求的邮件操作未完成Q邮׃可用
451 攑ּ要求的操作;处理q程中出?/td>
551 用户非本圎ͼ请尝试<forward-pathQ?
452 pȝ存储不Q要求的操作未执?/td>
552 q量的存储分配,要求的操作未执行
553 邮箱名不可用Q要求的操作未执?/td>
354 开始邮件输入,?."l束
554 操作p|
  在应用程序中使用SMTP协议

  SMTP协议的会(x)话流E?/b>

  在进行程序设计之前有必要弄清SMTP协议的会(x)话流E,其实前面介绍的内容已l可以大致勾勒出用SMTP发送邮件的框架?jin),对于一ơ普通的邮g发送,其过E大致ؓ(f)Q先建立TCPq接Q随后客L(fng)发出HELLO命o(h)以标识发件h自己的n份,q(h)l由客户端发送MAIL命o(h)Q如服务器应{ؓ(f)"OK"Q可l箋(hu)发送RCPT命o(h)来标识电(sh)子邮件的收g人,在这里可以有多个RCPT行,而服务器端则表示是否愿意为收件h接受该邮件。在双方协商l束后,用命令DATA邮件发送出去,其中对表C结束的"."也一q发送出厅R随后结束本ơ发送过E,以QUIT命o(h)退出。下面通过一个实例,从langrui@sohu.com发送邮件到renping@sina.com来更详细直观地描q此?x)话程Q?br />
R:220 sina.com Simple Mail Transfer Service Ready
S:HELLO sohu.com
R:250 sina.com
S:MAIL FROM:Qlangrui@sohu.comQ?br />R:250 OK
S:RCPT TO:Qrenping@sina.comQ?br />R:250 OK
S:DATA
R:354 Start mail input;end with "QCRLFQ?QCRLFQ?
S:…?br />R:250 OK
S:QUIT
R:221 sina.com Service closing transmission channel

  邮g的格式化

  ׃?sh)子邮gl构上的Ҏ(gu)性,在传输时是不能当作简单的文本来直接处理的Q而必L照一定的格式寚w件头和邮件体q行格式化处理之后才可以被发送。需要进行格式化的部分主要有Q发件h地址、收件h地址、主题和发送日期等。在RFC文档的RFC 822里对邮g的格式化有详的说明Q有兌情请参阅该文档。下面通过VC++6.0按照RFC 822文档规定格式化邮g的部分编写如下(部分代码Q:(x)

//邮g头准?br />strTemp = _T( "From: " ) + m_strFrom; file://发g人地址
add_header_line( (LPCTSTR)strTemp );
strTemp = _T( "To: " ) + m_strTo; file://收g人地址
add_header_line( (LPCTSTR)strTemp );
m_tDateTime = m_tDateTime.GetCurrentTime();//发送时?br />strTemp = _T( "Data: " );
strTemp += m_tDateTime.Format( "%a, %d %b %y %H:%M:%S %Z" );
add_header_line( (LPCTSTR)strTemp );
strTemp = _T( "Subject: " ) + m_strSubject; file://主题
add_header_line( (LPCTSTR)strTemp );
file://邮g头结?br />m_strHeader += _T( "\r\n" );
file://邮g体准?br />if( m_strBody.Right( 2 ) != _T( "\r\n" ) ) file://认最后以回R换行l束
m_strBody += _T( "\r\n" );

  其中add_header_line(LPCTSTR szHeaderLine)函数用于把szHeaderLine指向的字串追加到m_strHeader后面。其中,格式化后的邮件头保存在m_strHeader里,格式化后的邮件体保存在m_strBody中?br />
  由Socket套接字ؓ(f)SMTP提供|络通讯基础

  许多|络E序都是采用Socket套接字实现的Q对于一些标准的|络协议如HTTP、FTP和SMTP{协议的~程也是Z套接字程序的Q只是端口号不再是随意设定而要由协议来指定Q比如HTTP端口?0、FTP?1Q而SMTP则是25。Socket只是提供在指定的端口上同指定的服务器从事|络上的通讯能力Q至于客户和服务器之间是如何通讯的则ql协议来规定Q这对于套接字是完全透明的。因此可以用Socket套接字ؓ(f)E序提供|络通讯的能力,而对于网l通讯q\建立好之后采取什么样的通讯应答则要按SMTP协议的规定去执行?jin)。Socket套接字网l编E方面的文章资料非常丰富Q限于本文篇q,在此不再赘述Q有兌情请参阅相关文档。ؓ(f)便v见,没有采用~写较复杂的Windows Sockets APIq行~程Q而是使用l过较好装的MFC 的CSocketcR在正式使用套接字之前,也要先用AfxSocketInit()函数对套接字q行初始化,然后用Create()创徏套接字对象,q由该套接字通过ConnectQ)(j)建立同邮件服务器的连接。如果一切正常,再后l的工作中就是遵循SMTP协议的约定来使用SendQ)(j)、Receive()函数来发送SMTP命o(h)和接攉件服务器发来的应{码以完成对邮g的传送?br />
  SMTP?x)话应答的实?/b>

  在同邮g服务器徏立好链\q接后就可以按前面介l过的会(x)话流E进行程序设计了(jin)Q对于SMTP命o(h)的发送,可按命o(h)格式其l完毕后用CSocketcȝSend()函数其发送到服务器,q过CSocketcȝReceive()函数接收从邮件服务器发来的应{码QƈҎ(gu)SMTP协议的应{码表对其做出响应的处理。下面是用于接收应答码的函数get_response()的部分实C码:(x)

BOOL CSMTP::get_response( UINT response_expected )//输入参数为希望的应答?br />{
…?br />// m_wsSMTPServer为CSocket的类对象Q调用Receive()应{码接收到缓?br />// response_buf?br />m_wsSMTPServer.Receive( response_buf, RESPONSE_BUFFER_SIZE )
sResponse = response_buf;
sscanf( (LPCTSTR)sResponse.Left( 3 ), _T( "%d" ), &response );
pResp = &response_table[ response_expected ];
file://(g)验收到的应答码是否是所希望得到?br />if( response != pResp-QnResponse )
{
…?/不相{的话进行错误处?br />return FALSE;
}
return TRUE;
}

  ?x)话的各个部分比较类|都是命o(h)--应答方式Q而且均成对出玎ͼ下面是本文的重点也是实现的关键部?-在程序控制下完成对SMTP命o(h)的格式化以及(qing)对命令的发送和寚w件服务器应答码的(g)验处理:(x)

//格式化ƈ发送HELLO命o(h)Qƈ接收、验证服务器应答?br />gethostname( local_host, 80 );
sHello.Format( _T( "HELO %s\r\n" ), local_host );
m_wsSMTPServer.Send( (LPCTSTR)sHello, sHello.GetLength() );
if( !get_response( GENERIC_SUCCESS ) ) file://(g)验应{码是否?50
{
…?br />return FALSE;
}
file://格式化ƈ发送MAIL命o(h)Qƈ接收、验证服务器应答?br />sFrom.Format( _T( "MAIL From: Q?sQ\r\n" ), (LPCTSTR)msg-Qm_strFrom );
m_wsSMTPServer.Send( (LPCTSTR)sFrom, sFrom.GetLength() );
if( !get_response( GENERIC_SUCCESS ) ) file://(g)验应{码是否?50
return FALSE;
file://格式化ƈ发送RCPT命o(h)Qƈ接收、验证服务器应答?br />sEmail=(LPCTSTR)msg-Qm_strTo;
sTo.Format( _T( "RCPT TO: Q?sQ\r\n" ), (LPCTSTR)sEmail );
m_wsSMTPServer.Send( (LPCTSTR)sTo, sTo.GetLength() );
if(!get_response( GENERIC_SUCCESS )) file://(g)验应{码是否?50
return FALSE;
file://格式化ƈ发送DATA命o(h)Qƈ接收、验证服务器应答?br />sTemp = _T( "DATA\r\n" );
m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );
if( !get_response( DATA_SUCCESS ) ) file://(g)验应{码是否?54
return FALSE;
file://发送根据RFC 822文档规定格式化过的邮件头
m_wsSMTPServer.Send( (LPCTSTR)msg-Qm_strHeader, msg-Qm_strHeader.GetLength() );
…?br />file://发送根据RFC 822文档规定格式化过的邮件体
sTemp = msg-Qm_strBody;
if( sTemp.Left( 3 ) == _T( ".\r\n" ) )
sTemp = _T( "." ) + sTemp;
while( (nPos = sTemp.Find( szBad )) Q?-1 )
{
sCooked = sTemp.Mid( nStart, nPos );
sCooked += szGood;
sTemp = sCooked + sTemp.Right( sTemp.GetLength() - (nPos + nBadLength) );
}
m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );
file://发送内Ҏ(gu)据结束标?QCRLFQ?QCRLFQ?Qƈ(g)验返回应{码
sTemp = _T( "\r\n.\r\n" );
m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );
if( !get_response( GENERIC_SUCCESS ) )// (g)验应{码是否?50
return FALSE;

  到此为止Q已基本在程序中体现Z(jin)SMTP协议的会(x)话流E,能在Socket套接字所提供的网l通讯能力基础之上实现以SMTP命o(h)和SMTP应答码ؓ(f)基本?x)话内容的通讯交互q程Q从而最l实现SMTP协议对电(sh)子邮件的发送?br />
  l论

  ?sh)子邮gcY件作为Internet上的应用软gQ其设计开发必ȝ合Internet上成熟的技术规范(如RFC文档pd规范Q和相关协议Q如POP、SMTP、IMAP以及(qing)LDAP{)(j)。只有在遵@?jin)上q规范和协议的基上进行编E才能真正实现邮件类软g产品和服务的开放性和标准化。本文着重对SMTP协议?qing)其在VC++~程中的应用做了(jin)介绍Qƈ按照SMTP协议对电(sh)子邮件的发送进行了(jin)开放性和标准性较好的E序设计。本文所q程序在Windows 98下,由Microsoft Visual C++ 6.0~译通过?/span>,

我风 2010-10-11 14:05 发表评论
]]>
һþۺ³³| þþƷһ| ޹Ʒþþž| ձþþþĻ| Ʒþþþþ| Ĺ˾Ʒþò| þ99Ʒ99þ6| þþƷ}Ů| ޹Ƶþ| ھƷŷþþƷ| 91þþƷһ| 츾þþ| þ뾫Ʒһ| Ů㽶þ**ëƬƷ| պ뾫Ʒþһ| һAëƬѹۿþþƷ| ëƬþþþþùëƬ| ҹѸþӰԺ| AŮAVۺϾþþ| 99þùһ| Ʒһþò| þˬˬƬAV鷳| ŷһþþƷ޾Ʒþþþ | 뾫Ʒþһ | ޾ƷƬþ| þݺҹҹav˳ | þþþavëƬ| þ99һ| vaĻþò | þþƷAvӰƬ | þۺϺݺۺϾþۺ88| ޾ƷŮþ777777| þۺϾɫۺϾ99| þþƷһ| þ91Ʒ91þ鶹| Ʒþ߹ۿ| ƷþòҰ| ݺɫþþۺϲ | ҹƷþþþþӰ777| ձþþҹƷ| ձƷþþþþþþ|