2007年3月15日
#
“閃爍”的原因是擦除背景(用背景色重新填充)與繪制前景圖像之間有時間差,而且背景和前景顏色有差異,導(dǎo)致眼睛看上去好像在閃爍。
“閃爍”并不主要是因為GDI或GDI+效率低造成的。
解決這個問題需從兩個方面入手:1.縮短(或消除)前后景繪圖時間差,2.減少繪制次數(shù)
1.縮短(或消除)前后景繪圖時間差
OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
實際上背景填充是必須,否則前景圖像與殘留的背景混在一起非常雜亂,
這里取消的步驟,其實移到繪圖過程了(見2.),合成一張完整圖像。
2.減少繪制次數(shù)
采用“雙緩沖”技術(shù),先在內(nèi)存緩沖區(qū)中完成繪圖,再貼到屏幕上
另外如果緩沖圖像內(nèi)容不是變化的,應(yīng)存為成員對象之類,不要每次去畫
一般在OnDraw(CDC* pDC)中完成
///////////////////////////--GDI --////////////////////////////////////
int nWidth=1000;
int nHeight=1000;
CDC MemDC; //首先定義一個顯示設(shè)備對象
CBitmap MemBitmap;//定義一個位圖對象
//隨后建立與屏幕顯示兼容的內(nèi)存顯示設(shè)備
MemDC.CreateCompatibleDC(pDC); //這時還不能繪圖,因為沒有地方畫 ^_^
//下面建立一個與屏幕顯示兼容的位圖,至于位圖的大小嘛,可以用窗口的大小
//,也可以自己定義(如:有滾動條時就要大于當前窗口的大小,在BitBlt時決定拷貝內(nèi)存的哪部分到屏幕上)
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//將位圖選入到內(nèi)存顯示設(shè)備中
//只有選入了位圖的內(nèi)存顯示設(shè)備才有地方繪圖,畫到指定的位圖上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色將位圖清除干凈,這里用原背景色作為背景
//你也可以用自己應(yīng)該用的顏色
MemDC.FillSolidRect(0,0,nWidth,nHeight,pDC->GetBkColor());
//繪圖
CBrush brush(RGB(0,255,0));
for(int i=0;i<50;i++)
{
for(int j=0;j<80;j++)
{
//MemDC.Rectangle(10*j,10*i,9,9);
CRect rc(10*j,10*i,10*j+8,10*i+8);
MemDC.FillRect(&rc,&brush);
}
}
//將內(nèi)存中的圖拷貝到屏幕上進行顯示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//繪圖完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
///////////////////////////--GDI+ --////////////////////////////////////
Bitmap* buf=new Bitmap(2000,2000) ;
Graphics gc(buf);//Graphics.FromImage(buf);
//反鋸齒
//gc.SetSmoothingMode(SmoothingModeAntiAlias);
SolidBrush bgbrush(Color(255,255,255,255));
gc.FillRectangle(&bgbrush,0,0,2000,2000);//背景填充
Pen pen(Color(255, 0, 0, 255));
SolidBrush sbrush(Color(255,0,255,255));
for(int i=0;i<60;i++)
{
for(int j=0;j<60;j++)
gc.FillRectangle(&sbrush,10*j,10*i,9,9);
}
Graphics G(pDC->GetSafeHdc());
G.DrawImage(buf ,0,0);
首先,這是一個MFC的Bug
http://connect.microsoft.com/VisualStudio/feedback/details/505466/mfc-visual-style-font-size-too-small-to-display-chinese-character-clearly-on-windows-xp
解決時間暫時還不確定,臨時的方案如下:
App在InitInstance中加入:
LOGFONT logfont = {0};
:: SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &logfont, 0);
afxGlobalData.SetMenuFont(&logfont,true);
注釋:
字體的設(shè)置保存在一個全局變量afxGlobalData中,此變量定義AfxGlobals.h中。
AFX_GLOBAL_DATA中有一個SetMenuFont可以設(shè)定字體屬性,影響Menu、Toolbar、Dock Pane等的caption字體。
但是這個設(shè)置對tooltip無影響,臨時解決:在上面代碼基礎(chǔ)上在加入
if(afxGlobalData.fontTooltip.GetSafeHandle() != NULL)
{
::DeleteObject(afxGlobalData.fontTooltip.Detach());
}
afxGlobalData.fontTooltip.CreateFontIndirect(&logfont);
根據(jù)調(diào)整管的工作狀態(tài),我們常把穩(wěn)壓電源分成兩類:線性穩(wěn)壓電源和開關(guān)穩(wěn)壓電源。
線性穩(wěn)壓電源,是指調(diào)整管工作在線性狀態(tài)下的穩(wěn)壓電源。而在開關(guān)電源中則不一樣,開關(guān)管(在開關(guān)電源中,我們一般把調(diào)整管叫做開關(guān)管)是工作在開、關(guān)兩種狀態(tài)下的:開——電阻很小;關(guān)——電阻很大。
開關(guān)電源是一種比較新型的電源。它具有效率高,重量輕,可升、降壓,輸出功率大等優(yōu)點。但是由于電路工作在開關(guān)狀態(tài),所以噪聲比較大。 通過下圖,我們來簡單的說說降壓型開關(guān)電源的工作原理。如圖所示,電路由開關(guān)K(實際電路中為三極管或者場效應(yīng)管),續(xù)流二極管D,儲能電感L,濾波電容C等構(gòu)成。當開關(guān)閉合時,電源通過開關(guān)K、電感L給負載供電,并將部分電能儲存在電感L以及電容C中。由于電感L的自感,在開關(guān)接通后,電流增大得比較緩慢,即輸出不能立刻達到電源電壓值。一定時間后,開關(guān)斷開,由于電感L的自感作用(可以比較形象的認為電感中的電流有慣性作用),將保持電路中的電流不變,即從左往右繼續(xù)流。這電流流過負載,從地線返回,流到續(xù)流二極管D的正極,經(jīng)過二極管D,返回電感L的左端,從而形成了一個回路。通過控制開關(guān)閉合跟斷開的時間(即PWM——脈沖寬度調(diào)制),就可以控制輸出電壓。如果通過檢測輸出電壓來控制開、關(guān)的時間,以保持輸出電壓不變,這就實現(xiàn)了穩(wěn)壓的目的。
500)this.width=500" border="0">
在開關(guān)閉合期間,電感存儲能量;在開關(guān)斷開期間,電感釋放能量,所以電感L叫做儲能電感。二極管D在開關(guān)斷開期間,負責給電感L提供電流通路,所以二極管D叫做續(xù)流二極管。
在實際的開關(guān)電源中,開關(guān)K由三極管或場效應(yīng)管代替。當開關(guān)斷開時,電流很小;當開關(guān)閉合時,電壓很小,所以發(fā)熱功率U×I就會很小。這就是開關(guān)電源效率高的原因。
看過完兩個關(guān)于電源的FAQ后,大家可能對電源的效率計算還不了解。在后面的FAQ中,我們將專門給大家介紹。
摘自網(wǎng)絡(luò).
http://imysql.cn/mysql_backup_and_recover
作/譯者:葉金榮,來源:http://imysql.cn,轉(zhuǎn)載請注明作/譯者和出處,并且不能用于商業(yè)用途,違者必究。
日期:2006/10/01
本文討論 MySQL 的備份和恢復(fù)機制,以及如何維護數(shù)據(jù)表,包括最主要的兩種表類型:MyISAM
和 Innodb
,文中設(shè)計的 MySQL 版本為 5.0.22。
目前 MySQL 支持的免費備份工具有:mysqldump、mysqlhotcopy
,還可以用 SQL 語法進行備份:BACKUP TABLE
或者 SELECT INTO OUTFILE
,又或者備份二進制日志(binlog)
,還可以是直接拷貝數(shù)據(jù)文件和相關(guān)的配置文件
。MyISAM 表是保存成文件的形式,因此相對比較容易備份,上面提到的幾種方法都可以使用。Innodb
所有的表都保存在同一個數(shù)據(jù)文件 ibdata1
中(也可能是多個文件,或者是獨立的表空間文件),相對來說比較不好備份,免費的方案可以是拷貝數(shù)據(jù)文件
、備份 binlog
,或者用 mysqldump
。
1、mysqldump
1.1 備份
mysqldump
是采用SQL級別的備份機制,它將數(shù)據(jù)表導(dǎo)成 SQL 腳本文件,在不同的 MySQL 版本之間升級時相對比較合適,這也是最常用的備份方法。
現(xiàn)在來講一下 mysqldump
的一些主要參數(shù):
- --compatible=name
它告訴 mysqldump,導(dǎo)出的數(shù)據(jù)將和哪種數(shù)據(jù)庫或哪個舊版本的 MySQL 服務(wù)器相兼容。值可以為 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options
等,要使用幾個值,用逗號將它們隔開。當然了,它并不保證能完全兼容,而是盡量兼容。
- --complete-insert,-c
導(dǎo)出的數(shù)據(jù)采用包含字段名的完整 INSERT
方式,也就是把所有的值都寫在一行。這么做能提高插入效率,但是可能會受到 max_allowed_packet
參數(shù)的影響而導(dǎo)致插入失敗。因此,需要謹慎使用該參數(shù),至少我不推薦。
- --default-character-set=charset
指定導(dǎo)出數(shù)據(jù)時采用何種字符集,如果數(shù)據(jù)表不是采用默認的 latin1
字符集的話,那么導(dǎo)出時必須指定該選項,否則再次導(dǎo)入數(shù)據(jù)后將產(chǎn)生亂碼問題。
- --disable-keys
告訴 mysqldump
在 INSERT
語句的開頭和結(jié)尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */;
和 /*!40000 ALTER TABLE table ENABLE KEYS */;
語句,這能大大提高插入語句的速度,因為它是在插入完所有數(shù)據(jù)后才重建索引的。該選項只適合 MyISAM
表。
- --extended-insert = true|false
默認情況下,mysqldump
開啟 --complete-insert
模式,因此不想用它的的話,就使用本選項,設(shè)定它的值為 false
即可。
- --hex-blob
使用十六進制格式導(dǎo)出二進制字符串字段。如果有二進制數(shù)據(jù)就必須使用本選項。影響到的字段類型有 BINARY、VARBINARY、BLOB
。
- --lock-all-tables,-x
在開始導(dǎo)出之前,提交請求鎖定所有數(shù)據(jù)庫中的所有表,以保證數(shù)據(jù)的一致性。這是一個全局讀鎖,并且自動關(guān)閉 --single-transaction
和 --lock-tables
選項。
- --lock-tables
它和 --lock-all-tables
類似,不過是鎖定當前導(dǎo)出的數(shù)據(jù)表,而不是一下子鎖定全部庫下的表。本選項只適用于 MyISAM
表,如果是 Innodb
表可以用 --single-transaction
選項。
- --no-create-info,-t
只導(dǎo)出數(shù)據(jù),而不添加 CREATE TABLE
語句。
- --no-data,-d
不導(dǎo)出任何數(shù)據(jù),只導(dǎo)出數(shù)據(jù)庫表結(jié)構(gòu)。
- --opt
這只是一個快捷選項,等同于同時添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset
選項。本選項能讓 mysqldump
很快的導(dǎo)出數(shù)據(jù),并且導(dǎo)出的數(shù)據(jù)能很快導(dǎo)回。該選項默認開啟,但可以用 --skip-opt
禁用。注意,如果運行 mysqldump
沒有指定 --quick
或 --opt
選項,則會將整個結(jié)果集放在內(nèi)存中。如果導(dǎo)出大數(shù)據(jù)庫的話可能會出現(xiàn)問題。
- --quick,-q
該選項在導(dǎo)出大表時很有用,它強制 mysqldump
從服務(wù)器查詢?nèi)〉糜涗浿苯虞敵龆皇侨〉盟杏涗浐髮⑺鼈兙彺娴絻?nèi)存中。
- --routines,-R
導(dǎo)出存儲過程以及自定義函數(shù)。
- --single-transaction
該選項在導(dǎo)出數(shù)據(jù)之前提交一個 BEGIN
SQL語句,BEGIN
不會阻塞任何應(yīng)用程序且能保證導(dǎo)出時數(shù)據(jù)庫的一致性狀態(tài)。它只適用于事務(wù)表,例如 InnoDB
和 BDB
。
本選項和 --lock-tables
選項是互斥的,因為 LOCK TABLES
會使任何掛起的事務(wù)隱含提交。
要想導(dǎo)出大表的話,應(yīng)結(jié)合使用 --quick
選項。
- --triggers
同時導(dǎo)出觸發(fā)器。該選項默認啟用,用 --skip-triggers
禁用它。
其他參數(shù)詳情請參考手冊,我通常使用以下 SQL 來備份 MyISAM
表:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr \
--default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob -x db_name > db_name.sql
使用以下 SQL 來備份 Innodb
表:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr \
--default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob --single-transaction db_name > db_name.sql
另外,如果想要實現(xiàn)在線備份,還可以使用 --master-data
參數(shù)來實現(xiàn),如下:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr \
--default-character-set=utf8 --opt --master-data=1 \
--single-transaction --flush-logs db_name > db_name.sql
它只是在一開始的瞬間請求鎖表,然后就刷新binlog了,而后在導(dǎo)出的文件中加入CHANGE MASTER
語句來指定當前備份的binlog位置,如果要把這個文件恢復(fù)到slave里去,就可以采用這種方法來做。
1.2 還原
用 mysqldump
備份出來的文件是一個可以直接倒入的 SQL 腳本,有兩種方法可以將數(shù)據(jù)導(dǎo)入。
- 直接用
mysql
客戶端
例如:
/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql
- 用 SOURCE 語法
其實這不是標準的 SQL 語法,而是 mysql
客戶端提供的功能,例如:
SOURCE /tmp/db_name.sql;
這里需要指定文件的絕對路徑,并且必須是 mysqld
運行用戶(例如 nobody)有權(quán)限讀取的文件。
2、 mysqlhotcopy
2.1 備份
mysqlhotcopy
是一個 PERL 程序,最初由Tim Bunce編寫。它使用 LOCK TABLES、FLUSH TABLES
和 cp
或 scp
來快速備份數(shù)據(jù)庫。它是備份數(shù)據(jù)庫或單個表的最快的途徑,但它只能運行在數(shù)據(jù)庫文件(包括數(shù)據(jù)表定義文件、數(shù)據(jù)文件、索引文件)所在的機器上。mysqlhotcopy
只能用于備份 MyISAM
,并且只能運行在 類Unix
和 NetWare
系統(tǒng)上。
mysqlhotcopy
支持一次性拷貝多個數(shù)據(jù)庫,同時還支持正則表達。以下是幾個例子:
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \
db_name /tmp (把數(shù)據(jù)庫目錄 db_name 拷貝到 /tmp 下)
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \
db_name_1 ... db_name_n /tmp
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \
db_name./regex/ /tmp
更詳細的使用方法請查看手冊,或者調(diào)用下面的命令來查看 mysqlhotcopy
的幫助:
perldoc /usr/local/mysql/bin/mysqlhotcopy
注意,想要使用 mysqlhotcopy
,必須要有 SELECT、RELOAD(要執(zhí)行 FLUSH TABLES)
權(quán)限,并且還必須要能夠有讀取 datadir/db_name 目錄的權(quán)限。
2.2 還原
mysqlhotcopy
備份出來的是整個數(shù)據(jù)庫目錄,使用時可以直接拷貝到 mysqld
指定的 datadir (在這里是 /usr/local/mysql/data/)目錄下即可,同時要注意權(quán)限的問題,如下例:
root#cp -rf db_name /usr/local/mysql/data/
root#chown -R nobody:nobody /usr/local/mysql/data/ (將 db_name 目錄的屬主改成 mysqld
運行用戶)
3、 SQL 語法備份
3.1 備份
BACKUP TABLE
語法其實和 mysqlhotcopy
的工作原理差不多,都是鎖表,然后拷貝數(shù)據(jù)文件。它能實現(xiàn)在線備份,但是效果不理想,因此不推薦使用。它只拷貝表結(jié)構(gòu)文件和數(shù)據(jù)文件,不同時拷貝索引文件,因此恢復(fù)時比較慢。
例子:
BACK TABLE tbl_name TO '/tmp/db_name/';
注意,必須要有 FILE
權(quán)限才能執(zhí)行本SQL,并且目錄 /tmp/db_name/ 必須能被 mysqld
用戶可寫,導(dǎo)出的文件不能覆蓋已經(jīng)存在的文件,以避免安全問題。
SELECT INTO OUTFILE
則是把數(shù)據(jù)導(dǎo)出來成為普通的文本文件,可以自定義字段間隔的方式,方便處理這些數(shù)據(jù)。
例子:
SELECT * INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;
注意,必須要有 FILE
權(quán)限才能執(zhí)行本SQL,并且文件 /tmp/db_name/tbl_name.txt 必須能被 mysqld
用戶可寫,導(dǎo)出的文件不能覆蓋已經(jīng)存在的文件,以避免安全問題。
3.2 恢復(fù)
用 BACKUP TABLE
方法備份出來的文件,可以運行 RESTORE TABLE
語句來恢復(fù)數(shù)據(jù)表。
例子:
RESTORE TABLE FROM '/tmp/db_name/';
權(quán)限要求類似上面所述。
用 SELECT INTO OUTFILE
方法備份出來的文件,可以運行 LOAD DATA INFILE
語句來恢復(fù)數(shù)據(jù)表。
例子:
LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;
權(quán)限要求類似上面所述。倒入數(shù)據(jù)之前,數(shù)據(jù)表要已經(jīng)存在才行。如果擔心數(shù)據(jù)會發(fā)生重復(fù),可以增加 REPLACE
關(guān)鍵字來替換已有記錄或者用 IGNORE
關(guān)鍵字來忽略他們。
4、 啟用二進制日志(binlog)
采用 binlog
的方法相對來說更靈活,省心省力,而且還可以支持增量備份。
啟用 binlog
時必須要重啟 mysqld
。首先,關(guān)閉 mysqld
,打開 my.cnf
,加入以下幾行:
server-id = 1
log-bin = binlog
log-bin-index = binlog.index
然后啟動 mysqld
就可以了。運行過程中會產(chǎn)生 binlog.000001
以及 binlog.index
,前面的文件是 mysqld
記錄所有對數(shù)據(jù)的更新操作,后面的文件則是所有 binlog
的索引,都不能輕易刪除。關(guān)于 binlog
的信息請查看手冊。
需要備份時,可以先執(zhí)行一下 SQL 語句,讓 mysqld
終止對當前 binlog
的寫入,就可以把文件直接備份,這樣的話就能達到增量備份的目的了:
FLUSH LOGS;
如果是備份復(fù)制系統(tǒng)中的從服務(wù)器,還應(yīng)該備份 master.info 和 relay-log.info 文件。
備份出來的 binlog
文件可以用 MySQL 提供的工具 mysqlbinlog
來查看,如:
/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001
該工具允許你顯示指定的數(shù)據(jù)庫下的所有 SQL 語句,并且還可以限定時間范圍,相當?shù)姆奖悖敿毜恼埐榭词謨浴?/p>
恢復(fù)時,可以采用類似以下語句來做到:
/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name
把 mysqlbinlog
輸出的 SQL 語句直接作為輸入來執(zhí)行它。
如果你有空閑的機器,不妨采用這種方式來備份。由于作為 slave
的機器性能要求相對不是那么高,因此成本低,用低成本就能實現(xiàn)增量備份而且還能分擔一部分數(shù)據(jù)查詢壓力,何樂而不為呢?
5、 直接備份數(shù)據(jù)文件
相較前幾種方法,備份數(shù)據(jù)文件最為直接、快速、方便,缺點是基本上不能實現(xiàn)增量備份。為了保證數(shù)據(jù)的一致性,需要在靠背文件前,執(zhí)行以下 SQL 語句:
FLUSH TABLES WITH READ LOCK;
也就是把內(nèi)存中的數(shù)據(jù)都刷新到磁盤中,同時鎖定數(shù)據(jù)表,以保證拷貝過程中不會有新的數(shù)據(jù)寫入。這種方法備份出來的數(shù)據(jù)恢復(fù)也很簡單,直接拷貝回原來的數(shù)據(jù)庫目錄下即可。
注意,對于 Innodb
類型表來說,還需要備份其日志文件,即 ib_logfile*
文件。因為當 Innodb
表損壞時,就可以依靠這些日志文件來恢復(fù)。
6、 備份策略
對于中等級別業(yè)務(wù)量的系統(tǒng)來說,備份策略可以這么定:第一次全量備份,每天一次增量備份,每周再做一次全量備份,如此一直重復(fù)。而對于重要的且繁忙的系統(tǒng)來說,則可能需要每天一次全量備份,每小時一次增量備份,甚至更頻繁。為了不影響線上業(yè)務(wù),實現(xiàn)在線備份,并且能增量備份,最好的辦法就是采用主從復(fù)制機制(replication
),在 slave
機器上做備份。
7、 數(shù)據(jù)維護和災(zāi)難恢復(fù)
作為一名DBA(我目前還不是,呵呵),最重要的工作內(nèi)容之一是保證數(shù)據(jù)表能安全、穩(wěn)定、高速使用。因此,需要定期維護你的數(shù)據(jù)表。以下 SQL 語句就很有用:
CHECK TABLE 或 REPAIR TABLE,檢查或維護 MyISAM 表
OPTIMIZE TABLE,優(yōu)化 MyISAM 表
ANALYZE TABLE,分析 MyISAM 表
當然了,上面這些命令起始都可以通過工具 myisamchk
來完成,在這里不作詳述。
Innodb
表則可以通過執(zhí)行以下語句來整理碎片,提高索引速度:
ALTER TABLE tbl_name ENGINE = Innodb;
這其實是一個 NULL
操作,表面上看什么也不做,實際上重新整理碎片了。
通常使用的 MyISAM
表可以用上面提到的恢復(fù)方法來完成。如果是索引壞了,可以用 myisamchk
工具來重建索引。而對于 Innodb
表來說,就沒這么直接了,因為它把所有的表都保存在一個表空間了。不過 Innodb
有一個檢查機制叫 模糊檢查點
,只要保存了日志文件,就能根據(jù)日志文件來修復(fù)錯誤。可以在 my.cnf 文件中,增加以下參數(shù),讓 mysqld
在啟動時自動檢查日志文件:
innodb_force_recovery = 4
關(guān)于該參數(shù)的信息請查看手冊。
8、 總結(jié)
做好數(shù)據(jù)備份,定只好合適的備份策略,這是一個DBA所做事情的一小部分,萬事開頭難,就從現(xiàn)在開始吧!
摘要: 1. CListCtrl 風格
2. 設(shè)置listctrl 風格及擴展風格
3. 插入數(shù)據(jù)
4. 一直選中item
5. 選中和取消選中一行
6. 得到listctrl中所有行的checkbox的狀態(tài)
7. 得到listctrl中所有選中行的序號
8. 得到item的信息
9. 得到listctrl的所有列的header字符串內(nèi)容
10. 使listctrl中一項可見,即滾動滾動條
11. 得到listctrl列數(shù)
12. 刪除所有列
13. 得到單擊的listctrl的行列號
14. 判斷是否點擊在listctrl的checkbox上
15. 右鍵點擊listctrl的item彈出菜單
16. item切換焦點時(包括用鍵盤和鼠標切換item時),狀態(tài)的一些變化順序
17. 得到另一個進程里的listctrl控件的item內(nèi)容
18. 選中l(wèi)istview中的item
19. 如何在CListView中使用CListCtrl的派生類
閱讀全文
轉(zhuǎn)自:http://book.csdn.net/bookfiles/402/10040214756.shtml
MIME郵件的編碼方式
由于每個ASCII碼字符只占用一個字節(jié)(8個bit位),且最高bit位總為0,即ASCII碼字符中的有真正意義的信息只是后面的7個低bit位,而傳統(tǒng)的SMTP協(xié)議又是基于ASCII碼字符設(shè)計的,因此,一些基于傳統(tǒng)SMTP協(xié)議設(shè)計的SMTP服務(wù)器在處理郵件內(nèi)容時只取出每個字節(jié)中的7個低bit位進行處理,而將最高bit位忽略不計。顯然,這樣的SMTP服務(wù)器在處理包含有非ASCII碼字符的郵件內(nèi)容時,會出現(xiàn)嚴重的問題,這就限制了郵件中只能出現(xiàn)英文的ASCII碼字符,而不能出現(xiàn)中文字符或二進制數(shù)據(jù)。
為了能夠在郵件內(nèi)容中包含中文、圖像或聲音等非ASCII字符的數(shù)據(jù),人們想到了采用某種編碼方式將非ASCII字符的數(shù)據(jù)轉(zhuǎn)換成可打印的ASCII字符后再發(fā)送,郵件閱讀程序則按照相應(yīng)的解碼方式從郵件中還原出原始數(shù)據(jù)即可,比較常用的兩種郵件編碼方式為BASE64和Quoted-printable。后來的擴展SMTP協(xié)議允許直接在郵件中傳遞二進制數(shù)據(jù),而不用對它們進行郵件編碼,人們將這種沒有進行郵件編碼的二進制數(shù)據(jù)的郵件內(nèi)容稱為8bit編碼,為了與此相區(qū)別,人們將沒有進行郵件編碼的純ASCII碼字符的郵件稱為7bit編碼。MIME消息體的郵件編碼方式通過MIME消息頭中的Content- Transfer- Encoding頭字段指定,每種郵件編碼方式的介紹如下:
— 7Bit
指消息體內(nèi)容全部是沒有經(jīng)過編碼的ASCII字符。
— 8Bit
指消息體內(nèi)容是沒有經(jīng)過編碼的原始數(shù)據(jù),且其中包含有非ASCII字符的數(shù)據(jù)。現(xiàn)在的郵件服務(wù)器基本上都支持8Bit編碼,使用支持8Bit編碼的郵件服務(wù)器可以簡化郵件的處理過程。
— BASE64
Base64是將二進制數(shù)據(jù)轉(zhuǎn)換成可打印的ASCII字符的一種最常見的編碼方式,它的基本原理是將一組連續(xù)的字節(jié)數(shù)據(jù)按6個bit位進行分組,然后對每組數(shù)據(jù)用一個ASCII字符來表示。6個bit位最多能表示26=64個數(shù)值,因此可以使用64個ASCII字符來對應(yīng)這64個數(shù)值,這64個ASCII字符為:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
其中每個字符表示的數(shù)值就是該字符在上面的排列中的索引號,索引號從0開始編號。假設(shè)在內(nèi)存中有如下三個連續(xù)的字節(jié)數(shù)據(jù):
[0110,0001] [0110,0010] [0110,0011]
將它們按6個bit位進行分組后的形式如下:
[0110,00] [01,0110,] [0010,01] [10,0011]
分組后得到了四組數(shù)據(jù),每組數(shù)據(jù)對應(yīng)的十進制數(shù)值分別為24、22、9、35,它們分別對應(yīng)Y、W、J、j這四個字符,所以,對[0110,0001] [0110,0010] [0110,0011]這三個字節(jié)的數(shù)據(jù)進行BASE64編碼后的結(jié)果是“YWJj”。
BASE64編碼要求把3個8位字節(jié)(即24個bit)的數(shù)據(jù)轉(zhuǎn)化為4個6位字節(jié)(也是24個bit)的數(shù)據(jù),如果原來的8位字節(jié)數(shù)據(jù)的字節(jié)個數(shù)不能被3整除,其余數(shù)只能是1或2,那么如何對余下的1個或2個8位字節(jié)數(shù)據(jù)進行處理呢?對于這種情況,仍然按6個bit位對剩余的字節(jié)進行分組,在最后不夠6個bit位的內(nèi)容后面添加幾個為0的bit位來湊成6個bit位,例如,如果最后剩下的一個8位字節(jié)的內(nèi)容如下:
[0110,0001]
對它進行分組后的結(jié)果如下:
[0110,00] [01,0000]
其中用黑斜體標識的0為填充的bit位,所以,最后剩下的這個字節(jié)的BASE64編碼結(jié)果為“YQ”。BASE64編碼還有規(guī)定,如果編碼后的整個結(jié)果文本的字符個數(shù)不是4的整數(shù)倍,那么需要在最后填充“=”字符來湊成4的倍數(shù),所以,在最后這個字節(jié)編碼的結(jié)果后面還要添加兩個“=”字符,即“YQ==”。顯然,如果最后剩下兩個8位字節(jié)的內(nèi)容,它可以被編碼成三個字符,最后還需要添加一個“=”字符。對一大段數(shù)據(jù)進行BASE64編碼時,可以在編碼結(jié)果中的適當位置加入回車換行,MIME規(guī)范建議BASE64編碼結(jié)果中的每行最多76個字符。
— Quoted-printable
Quoted-printable也是一種將二進制數(shù)據(jù)轉(zhuǎn)換成可打印的ASCII字符的編碼方式,它對ASCII字符不進行轉(zhuǎn)換,只對非ASCII字符的數(shù)據(jù)進行編碼轉(zhuǎn)化。每個非ASCII字符的字節(jié)數(shù)據(jù),都被轉(zhuǎn)換成一個"="號后跟這個字節(jié)的十六進制數(shù)據(jù),例如,“ab中國”的Quoted-printable編碼結(jié)果為“ab=d6=d0=b9= fa”。顯然,由于"="號在Quoted-printable編碼中具有的特殊意義,所以,原始數(shù)據(jù)中的"="號字符也需要進行編碼轉(zhuǎn)換,用“=3d”表示。
對一大段數(shù)據(jù)進行Quoted-printable編碼時,可以在編碼結(jié)果中的適當位置加入回車換行,在回車換行前需要額外再加入一個“=”字符,以表示后面的換行是因編碼而造成的軟回車,而非原始數(shù)據(jù)中原有的回車換行。例如,對于下面一段Quoted-printable編碼后的數(shù)據(jù):
=D5=E2=CA=C7=CD=A8=D0=C5=B5=C4=B3=CC=D0=
=F2, =C7=EB=D6=B8=BD=CC!
在第一行末尾的“=”字符和換行,都是由于編碼后生成的。
Q:在你的用人之道里,你比較看重的是什么?
A:誠信永遠是第一位的,然后是智慧、熱情和團隊精神。我認為人的素質(zhì)有先天和后天兩個方面。我把前者定義為IQ’,IQ’由原始智商加冒險精神組成。一個人有沒有冒險精神,敢不敢賭一把,敢不敢承擔風險,這些都是先天的成分,不容易改變。先天的素質(zhì)有點像操作系統(tǒng),預(yù)裝了就很難動了。而后天的素質(zhì)我定義為EQ’,這是可以改變的,相當于應(yīng)用軟件和用戶界面。
過去由于工作關(guān)系,我跟全球最頂尖的500個公司的CEO有不同程度接觸,發(fā)現(xiàn)他們很不一樣,有的人熱情、奔放,有的人內(nèi)斂,甚至有點害羞,有的人口才很好,有的人結(jié)巴。但這些領(lǐng)袖有一些共性,第一是簡化抽象問題的能力;第二是信心,這是后天培養(yǎng)的,如果你看這些人的眼睛,都透著自信,盡管他們可能說話很溫和,聲調(diào)不高,語言不一定優(yōu)美,但是他們總是有信念的;第三是判斷力,這完全可以通過后天學習培養(yǎng),好的領(lǐng)導(dǎo)者很重要的能力在于判斷,特別是沒有充分的數(shù)據(jù)情況下,可以及時作出決定的能力。其實在管理一個大公司時,缺的不是聰明的人,重要的是用什么樣的人;缺的不是想法,有的時候有太多的想法,重要的是選擇哪個想法,什么時候做判斷,做什么樣的判斷。另外一點是心態(tài)很重要,所有的優(yōu)秀領(lǐng)袖都很堅韌,他們每個人都不是一帆風順的,既有輝煌也有失落,但他們在失落時也可以保持平和的心態(tài),與外界表現(xiàn)出一種和諧。這在談判、研發(fā)時都很重要。
Q:你不能容忍的品質(zhì)是什么?
A:有三種人我不能容忍。一種是雙面人,其中包括兩面三刀的和老好人。后者為了不得罪人,見不同人會說不同話,其實這樣的人沒有壞的動機,但是會弱化大家的判斷力,而且大家對后者沒有防備。
第二種是負面人,對任何事情都不同意,其實這樣的人自己也不一定有觀點。人們可以有不同意的觀點,但一定要有建設(shè)性,以正面的方式提出來。這種人是具有傳染性的,一定要清除。
第三種是玩世不恭的人,他們對任何事情無所謂。
這三種人能給機會可以盡量給機會,否則一定要清除。領(lǐng)導(dǎo)最重要的是找到對的人,但同樣重要的是,能夠清除不合適的人。
張亞勤個人檔案
1966年出生于山西太原,12歲考入中國科技大學少年班,23歲獲得美國喬治·華盛頓大學電氣工程博士學位。
1999年回國參與創(chuàng)辦微軟亞洲研究院;2004年赴微軟總部負責移動通信及嵌入式系統(tǒng)設(shè)備部門的軟件研發(fā);2006年再次回國出任微軟中國研發(fā)集團總裁。
加盟微軟之前,先后在美國 Sarnoff 公司任多媒體實驗室總監(jiān),以及美國GTE 實驗室任高級研究員。