DRAMA LIST

karada 发表于 2010-04-26 15:37:04

ALL AROUND TYPE MOON ~アーネンエルべの一日~(川澄)(070817)[192]
Are you Alice?2-Check mate  mo
Ayashi No Ceres 'The Heavenly Voice‘梦幻妖子[320]

B.O.D.Y[BK付](川上とも子 諏訪部順一 保志総一朗 高山みなみ 長沢美樹 浅野るり)163
B型H系(浅野真澄 茅原実里 保志総一朗)(070914)[160]
Calling~あなたの言葉で抱きしめて~『涙をぬぐって』[BK付](石田 雪乃)[192]
CLANNAD(ドラマCD)-光見守る坂道で-第2巻[bk](桑島法子 能登麻美子 田村ゆかり 雪野五月 緑川光 朴璐美)[320]
D.N.Angel(天使怪盗系列)[128]
every day every night(小关)mo
Fate /Tiger Colosseum シークレットエピード 「虎の威を借るケモノたち」[BK](070913)[320]163
Gundam Seed Destiny-THE_BRIDGE  mo
GUN×SWORD EPISODE+[BK付](星野貴紀、桑島法子、樱井孝宏、保志总一朗)[320]
GUN×SWORD いつだって波乱ヴァン丈[BK付](星野貴紀、桑島法子、樱井孝宏、保志总一朗)[320]
HANON ハノン(鈴村健一.小西克幸.折笠爱.保志総一朗)163
Lost Universe Drama   163
Maze☆爆熱時空 幻光流1 PlayBack これかMaazeた!!(関智一 三石琴乃)(960323)[320]
momo san 桃缶 1-2(小关三木緑川)
MとNの肖像(皆口裕子、高山みなみ、石田彰)[020222][128]
NIGHT HEAD GENESIS~時の迷子~2 <ブックレット付>(森川石田) [256k]
PERSONA3 DRAMA CD Vol.1 -Daylight-[BK付](石田彰/坂本真綾/鳥海浩輔/他)(070321)[192]
PERSONA3 ORIGINAL DRAMA(石头田中緑川小鸟)(070425)[320]
SA(浅野00包子)[256]
SAMURAI DEEPER KYO 独眼《ワン·アイド·ドラゴン》竜、吼える[小西克幸 堀江由衣 緒方恵美 石田彰 保志総一朗 子安武人 関俊彦 緑川光 関智一](030226)[128]
SAMURAI DEEPER KYO 番外編 ~侍学園3 燃えろ純情! 修学旅行編 !!~[小西克幸 堀江由衣 緒方恵美 石田彰 保志総一朗 子安武人 三石琴乃 関俊彦](0502)[160]

Shining Tears DramaCD Vol.1 Side -Memories and departure-

shining windシャイニング·ウィンド 心にふれるファンディスク(游戏)[2007.05.17]
SNAKE DEAD(铃村健一 保志総一朗 樱井孝宏 子安武人)
SNOW1[保志総一朗、川澄綾子][128]
SNOW2(保志総一朗、川澄綾子) mo
SNOW3[保志総一朗、川澄綾子、田村ゆかり][128]
Tactics-第1巻(宮田櫻井川上保志)(030926)[128]
Tactics-第2巻(宮田櫻井川上保志)(040825)[128]
Tactics-第八卷初回限定版特別付録(櫻井川上保志)[320]

Tactics-第七卷初回限定版特別付録~秘境杉野村神隠しの謎~(櫻井川上保志)[192]
Tales of Eternia - Last Summer ドラマ&BGM集(010718)(保志石田)[128]
Tales of Eternia Flying Single
Tales of Eternia Labyrinth ~forget-me-not~ First Volume
Tales of Eternia(永恒传说) Final Level

The MANZAI3(石田中井)[192]
TOKYO GUARDIAN & LEVEL-C(石田子安関智一三木)[128]
VERSUS -conte-(子安小关)[128]
VERSUS2 -conte again-(子安小关)[128]
Weiβ kreuz BEST ALBUM Die Bleibende Erinnerung[MUSIC][320]
Weiβ Kreuz Vocal Album Tagesanbruch[MUSIC][320]
X CHARACTER FILES


アストラル Astral DRAMA CD [BK付](石田彰 折笠富美子)[256]
アニメーション プリンセス·プリンセス ドラマCD(公主公主系列)(福山保志)
あほもシリーズ-もっそれ(関智一.宮田幸季.小西克幸)[192]
あらしのよるに(翡翠森林)[BK](石田山口中井)(061222)
ヴァンパイア騎士 LaLa全サ[BK付](堀江由衣 福山潤 諏訪部順一 千葉進歩 保志総一朗 子安武人)163
お迎えです。~極楽湯けむり旅情編~ (石田彰 置鮎龍太郎 雪乃五月 他)(010622)[128]
カテゴリ:フリークス[BK](石头田村小鸟桑岛)(07.4.25)[192]
キッシーズ (三石琴乃 関智一 石田彰 三木眞一郎 保志総一朗)(9507)[128]
グローランサーⅤ オリジナル・キャラクターソング・アルバム(三木眞一郎 鈴村健一 保志総一朗 檜山修之)[320]
クリセニアン夢語り~エル_デオの眠れる王に~[BK](神谷浩史 宮田 関智一 関俊彦 桑島 石田 平川)(071026)[320]
クロム・ブレイカー[BK](保志総一朗 井上奈々子 小野大輔 石田彰)(071024)[192]
コードギアス 反逆のルルーシュ Sound Episode 1[BK][192]

コードギアス 反逆のルルーシュ sound Episode 2[070523][320]
コードギアス 反逆のルルーシュ Sound Episode 3[070627][320]
コードギアス 反逆のルルーシュ Sound Episode 4(070725)[320]
コードギアス 反逆のルルーシュ Sound Episode 5 [BK](070822)[320]
コードギアス 反逆のルルーシュ Sound Episode 6[BK][320]
コードギアス 反逆のルルーシュ ドラマCD  NEWTYPE (0707)[192]
サルーテ!~フロワ王女と海賊ルッシュ1-3话[かかずゆみ,包子,小西,福山,斋贺]
シューピアリア[BK](070321)(桑岛子安保志)[256]
ストレンジ・プラス1-2(関智一.福山潤.置鮎龍太郎.雪野五月.森川智之)
ストレンジ プラス The Drama CD Serial Addict(関智一 福山潤 置鮎龍太郎 雪野五月 ゆかな 森川智之 他)(0708)163
テイルズ オブ デスティニー (宿命传说四部)(関智一)
テイルズ オブ デスティニー PROST FORGOTEEN CHRONICLE 2枚組 (绿川光 関智一)[128]
ときめきメモリアル Girls Side 1st Love~(緑川石田三木山口子安保志)
ドラゴン騎士団 イメージヴォーカル集[BK](関 智一 小野坂昌也 緒方恵美)(940831)[320]
とらぶるふぉうちゅんCOMPANY★はぴCURE[BK](070531)(杉田鈴村保志)[112]
ドラマシアター 7SEEDS Ⅲ ~春の章~163
ながされて藍蘭島(ドラマCD)  VOL1 [BK](保志)[192]
ながされて藍蘭島(ドラマCD)  VOL2 [BK][192]
ながされて藍蘭島「これが私の御主人様」カップリングCDドラマ(非売品)[128]
ネオロマンス+トリリオン+Splash+Summer[BK](070704)[192]
バレスタ·サード 第1巻(包子)mo
バレスタ·サード第2巻[BK](070427)(福山保志子安櫻井鈴村)[192]
バレスタ·セカンド vol.1[BK](060325)((福山潤 保志総一朗 斎賀みつき 鳥海浩輔 櫻井孝宏))[192]
バレスタ·セカンド vol.2(福山潤 保志総一朗 斎賀みつき 鳥海浩輔 櫻井孝宏)[320]
バレスタ·セカンド vol.3[BK](福山保志斎賀鳥海子安櫻井)[320]
バレスタ·セカンド vol.4[BK](福山保志鸟海子安樱井)[192]
バレスタ·セカンド vol.5[BK][10月新作][192]
ひぐらしのなく頃に   猿回し編 第2巻(中原麻衣 雪野五月)(070824)[192]
ひぐらしのなく頃に ~語咄し編~(保志中原雪野)(070425)[192]
ひぐらしのなく頃に キャラクターCD Vol.1 竜宮レナ×前原圭一と大石蔵人[BK](中原麻衣保志总一朗)[320]
ひぐらしのなく頃に コミケCD 2006冬 ~鬼のいぬ間に~ (保志総一朗、中原麻衣、関俊彦、他)163
ひぐらしのなく頃に祭 ドラマCD 羞晒し編[BK](保志総一郎 中原麻衣 雪野五月)(070827)[320]
ひぐらしのなく頃に解 目明し編[BK](雪野保志中原大関)(070627)[192]
ファイブ ~『スペシャルバージョン』 全サ ドラマCD(豊口石田樱井保志子安)[128]
ファイブ -ドラマCD act.4-[BK](豊口 諏訪部 宮田 高橋 石田 櫻井 甲斐田 保志 他)(070829)[320]
ふしぎ工房症候群4 一緒に死んでくれますか?(石田彰)163
ふしぎ工房症候群 DRAMA「一緒に死んでくれますか?」(保志石田)163
ブラザーコンプレックス(关智一×森川)[128]
プリンセスハーツ ~麗しの仮面夫婦の巻~(能登包子石头)CD附带版
プリンセスハーツ ~麗しの仮面夫婦の巻~[BK](070824)[320]
プリンセスプリンセスDJCD2[BK](福山潤、柿原徹也、朴ろ美、保志総一朗)[256]
ボーイズラブ  (ドラマCD)  江戸の剣風 (鈴村健一·関智一)(WAV)[128]
マグナカルタ ~激情編 復讐に燃えた花~(保志堀江森川豊口三石桑島)(050824)[128]
まほデミー 週番日誌 魔法学園7 迷宮ロマンス[BK](緑川櫻井千葉森川子安大関鈴村保志)(050525)[WMA]
もう一度ONLY YOU(森川x包子)[128]
やってらんねェぜ!(関智一·保志総一朗)(960625)[128]
ヤングガン カルナバル[BK](保志総一朗 柚木涼香 小山力也 杉山纪彰 松来未祐 )(071024)[192]
ルルル文庫 沙漠の国の物語 ~楽園の種子~[BK](皆川浪川保志)(070524)[192]
わたしたちの田村くん(ドラマCD) [BK](保志総一朗)(070510)[192]


愛を歌うより俺に溺れろ 2~ 愛と欲望の文化祭~[BK][192] 

俺のもの--森川智之×保志総一朗(石田彰 成田剣)mo
百日の薔薇[BK付](千葉進歩×井上和彦)[070629][629]163
丑小鸭王子 (保志) mo
低俗霊 DAYDREAM(石田彰、飛田展男、川澄綾子、浅野真澄 )(011112)[128]
东京天使保镖Tokyo Crazy Paradise(川上三木緑川石田)[160]
東の海神 西の滄海(石田彰 山口勝平  松本保典 折笠愛 子安武人 関智一 三木眞一郎 )[128]
風花[BK](平川大辅.岸尾大辅.小野大辅)(061229)[128]
花とゆめ2005 トキメキ☆Cd Select Ver[櫻井孝宏 関智一 関俊彦 保志総一郎 石田彰 諏訪部順一 他](05)(320K)
幻想魔伝最遊記  笑ってSO-ICHIROⅠ[320]
幻想魔伝最遊記  笑ってSO-ICHIROⅡ[320]
幻想魔伝最遊記  笑ってSO-ICHIRO Ⅲ[320]
幻想魔伝最遊記  笑ってSO-ICHIROU_番外篇_集合
機動戦士ガンダムSEED  MINI DRAMA
機動戦士ガンダムSEED - 石保編Voice Message

君が主で執事が俺で(关智一)(070824)[320]
藍より青し[藍青放送局](川澄綾子 保志総一朗 雪乃五月 平松晶子 その他)[320]
裏切りは僕の名前を知っている[BK](保志総一朗、櫻井孝宏、子安武人、福山潤)[192]
恋するジュエリーデザイナー(保志森川)[128]

魔术使いシド&リドシリーズ『ロマネスク バリエ』(三木保志)(030725)[128]
目隠しの国[BK](小关 石头)(010725)[320]
僕の初恋をキミに捧ぐ[BK] (石田彰 折笠富美子 山口茜 森永理科 関智一 小野大輔他)[256]
僕らの声で(石田彰,保志総一朗)(070426)[128]
閃光華るびくら(三石琴乃 保志總一朗)(050415)[192]
少年ギャグ王コミックCDコレクション①幻想大陸 -秘宝の行方(緒方恵美、関智一)(960719)[256]
声優虎の穴 其の一(森川智之 檜山修之 保志総一朗)[128]
水果篮子  フルーツバスケット HCD
水果篮子 草摩家の長い一日
天然!絶滅ヒーロー!![BK](大関小関 子安)(050922)[192]
天然!絶滅ヒーロー!!少々バラエティなCD~2巻と呼びたきゃ呼ぶがいい!(大关小关)(070525)[256]
修羅のギャグ道·筧十兵衛武者修行163
遙かなる時空の中で3 雪待月[BK][192]
遙かなる時空の中で 舞一夜 ~常緑~[BK][192]
遙かなる時空の中で1&2&3 花祭(070926)[192]
遙かなる時空の中で劇場版  舞一夜 ヴォーカル.コレクション(040221)[320]
一寸枕草紙(森川智之×保志総一郎)[128]
櫻蘭高校男公關部第1彈 mo
雨月物語~菊花の約~ 石田彰[BK](051102)[192]
月と闇の戦記[BK](関智一 置鮎龍太郎 川澄綾子 堀江由衣 久川綾 鈴村健一)(021221)[320K]
月光仮面[BK](石田子安大関保志)(070621)[320]
月華佳人 1 [千葉進步.保志總一郎][192]
月華佳人 2 [千葉進步.保志總一郎][128]
月刊AsukaオールスタードラマCD(福山绿川保志)(070608)[224]
戦国BASARA ~宿命! 川中島の合戦~ ドラマCD
戦国BASARA2~百花繚乱!小田原の役~ mo
戦国BASARA2~蒼穹!姉川の戦い~  mo
戦国BASARA2~紅蓮!三方ヶ原の戦い~
戦国BASARA2~火花、散って業火となれ~
戦国BASARA 2~百花繚乱!小田原の役~ドラマCD
転生學園月光録  ドラマ CD[BK付](00、13、包子、鳥海等)(070525)[320]
子供の領分温泉に行こう![BK](大关小关)(0704)[192]
最遊記 Party [ブクレ・初回特典付 ](関俊彦 保志総一朗 平田広明 石田彰)[256]
最遊記RELOAD ”EVEN A WORM” VOL.04 (ゼロサム誌上販売)[256]
最遊記RELOAD GUNLOCK VOCAL ALBUM VOLUME TWO[BK](070622)[320]
最遊記RELOAD OVA-burial- EDテーママキシ「shiny moon」[BK](070523)[320]
最遊記RELOADミニドラマCD『WISHES』[BK](128WMA)








 

系列:
彩雲国物語~秋の夜長に…(全員サービスCD)~(2005)
ラジオCD彩雲国物語~はじまりの風は紅く~(BK付)(2005.04.22)
彩雲国物語~黄金の約束~(2005.12.22)
オリジナルサウンドトラック 1(OST 1)(2006.08.04)
彩雲国物語 第一巻 愛情手料理奮闘記!(BK付)(2006.08.25)
彩雲国物語 ドラマCD1 番外編 ~「楸瑛と絳攸」「親睦温泉旅行」~(BK付)(2006.09.08)
彩雲国物語 ドラマCD 2 番外編 ~「静蘭と劉輝」「親睦花火大会」~(BK付)(2006.11.10)
オリジナルサウンドトラック 2(OST 2)(BK付)(2007.01.12)
彩雲国物語第二巻~物思う君に愛の手を~(BK付)(2007.02.23)
彩雲国物語 ドラマCD 3 番外編 ~「親睦熊退治」「秀麗と劉輝」~(BK付)(2007.03.09)
ラジオCD 彩雲国物語~双剣の舞~ 第一巻(BK付)
彩雲国物語 スペシャルDJCD1(070907)[320]
彩雲国物語セカンドシリーズドラマCD1~番外編「海より深き愛」・「影月と香鈴」~(BK付)(070907)

花宵ロマネスク 薫り降る濡れた空
花宵ロマネスク 君の金色僕の紺碧
花宵ロマネスク 落ちる吐息に染まるバラ
花宵ロマネスク 罪の果実と僕と羽(緑川鈴村保志)(070323)[192]
花宵ロマネスク キャラクターCD 宝生菫「モノクローム lost in you」 
花宵ロマネスク キャラクターCD 城崎ともゑ「チョコホリック I*N*G」
花宵ロマネスク キャラクターCD 宝生綾芽 「Heavenly Lovers~君の手の中に」
花宵ロマネスク キャラクターCD 宝生桔梗(CV諏訪部順一) 「bloom ~午後のため息」
花宵ロマネスク キャラクターCD 宝生葵(CV遊佐浩二) 「love slave
花宵ロマネスク「みんなのぷちロマ劇場第一巻」
花宵ロマネスク キャラクターCD  菫&ともゑ Grace Again~グレ—ス アゲイン(070217)[320]

花宵ロマネスク vol.5 かなしいミルクティー(070825)[256]

2000.12/冬のAVまつりドラマCD「アニメ店長 ドラマ編 新世纪アニメイト」[128]
2001.4/アニメ店長オリジナルドラマCD1「最白―トレブラン―」(小关保志)[128]
2001.5/アニメ店長オリジナルドラマCD2「ラミカード娘。」(关智一川澄綾子)[128]
2001.7/夏のAVまつりドラマCD「アニメ店長うきうきドラマCD 道玄坂登也編」
2001.7/夏のAVまつりドラマCD「アニメ店長どきどきドラマCD 殿鬼ガイ編」
2001.7/夏のAVまつりドラマCD「アニメ店長わくわくドラマCD 兄沢命斗編」
2001.9/アニメ店長オリジナルドラマCD3「最白2―トレブラン ドゥ―」(小关保志)[128]
2001.11/ラジオドラマCD「アニメ店長FIRE WAVE!!
2001.12/アニメ店長SONG ALBUM「有頂天~High-Standard~」(小关保志川澄)[128]
2002.3/ラジオドラマCD アニメ店長 FIRE WAVE!!2「シェアルーム&ディアフレンズ」
2002.7/ラジオドラマCD アニメ店長「FIRE WAVE3!!~ゆきゆきて、温泉~」
2004.7/アニメ店長 アニメイトEXPOテーマソング「パラダイス

天は赤い河のほとり」 サウンドシアター1
「天は赤い河のほとり」 サウンドシアター2
「天は赤い河のほとり」 サウンドシアター3
「天は赤い河のほとり」 サウンドシアター4
「天は赤い河のほとり」 サウンドシアター5
「天は赤い河のほとり」 サウンドシアター6
「天は赤い河のほとり」 サウンドシアター7
「天は赤い河のほとり」 サウンドシアター8
  [天是红河岸]Complete.Collection(非売品)
  奇克力的一天.天是红河岸番外篇[関智一.井上和彦.高山みなみ]


Gravitation 1 Audio Comics (Inoue Kazuhiko x Yabe Masashi)
Gravitation 2 Audio Comics (Inoue Kazuhiko x Yabe Masashi)
Gravitation Drama CD Vol 1 (Inoue Kazuhiko x Seki Tomokazu)[BK]
Gravitation Drama CD Vol 2 (Inoue Kazuhiko x Seki Tomokazu)
Gravitation Drama CD Vol 3 (Inoue Kazuhiko x Seki Tomokazu)
Gravitation SOUND STORY I (Inoue Kazuhiko x Seki Tomokazu)
Gravitation SOUND STORY II (Inoue Kazuhiko x Seki Tomokazu)
Gravitation SOUND STORY III

吟遊黙示録マイネリーベ wieder 1.青嵐の刻(BK付)
吟遊黙示録マイネリーベ wieder 2.鴇色の旅(BK付)
吟遊黙示録マイネリーベ wieder キャラクターCD01~オレフェレウス(CV:櫻井孝宏)320
吟遊黙示録マイネリーベ wieder キャラクターCD02 エドヴァルド(CV:関智一)320
吟遊黙示録マイネリーベ wieder キャラクターCD03 カミユ(CV:保志総一朗)128
吟遊黙示録マイネリーベ wieder キャラクターCD04 ルードヴィッヒ(CV:関俊彥)320 BK
吟遊黙示録マイネリーベ wieder キャラクターCD5 ナオジ(石田彰)
吟遊黙示録マイネリーベ wieder キャラクターCD6 アイザック(子安武人)
吟遊黙示録マイネリーベ wieder 第1楽章 初回限定特典CD
吟遊黙示録マイネリーベ wieder 第2楽章 初回限定特典CD
吟遊黙示録マイネリーベ wieder 第3楽章 初回限定特典CD

吟遊黙示録 マイネリーベ wieder DVD 第4楽章 初回限定特典CD[192]
吟遊黙示録マイネリーベ wieder 第5楽章 初回限定特典CD
吟遊黙示録マイネリーベ シュトラール候補生の休暇(BK付)
吟遊黙示録マイネリーベ ドラマCD 1「心の迷宮」(BK付)

吟遊黙示録マイネリーベ ドラマCD 2「疑惑の夢
吟遊黙示録マイネリーベ ドラマCD 3「策略の彼方」(BK付)

富士見二丁目交響楽団 JUNE版·01 寒冷前線コンダクター-寒冷前線指揮者
富士見二丁目交響楽団 JUNE版·02 D線上のアリア-D線上的詠嘆調
富士見二丁目交響楽団 JUNE版·03 さまよえるバイオリニスト-徬徨的小提琴手
富士見二丁目交響楽団 JUNE版·04 コンサートはお好き?-您喜歡音樂會嗎?
富士見二丁目交響楽団 JUNE版·05 赤い靴ワルツ-紅鞋圓舞曲
富士見二丁目交響楽団 JUNE版·06 マンハッタン·ソナタ曼哈頓奏鳴曲
富士見二丁目交響楽団 JUNE版·07 リサイタル狂騒曲
富士見二丁目交響楽団 JUNE版·08 [外伝]野生のアマデウス
富士見二丁目交響楽団 JUNE版·09 同人 富士见ハイランド へみんなで行こう!大家去高原
富士見二丁目交響楽団 JUNE版·10 外伝・証言編 - 真面目コン マスはコンダクターの夢を見るか-認真的首席看見了指揮的夢嗎?
富士見二丁目交響楽団 JUNE版·11 桐ノ院圭はかく语りき(第二部前編)
富士見二丁目交響楽団 JUNE版·12 悠季のためのパヴァーヌ(第二部後編)
富士見二丁目交響楽団 JUNE版·13 外伝・八月十二日(晴れ)
富士見二丁目交響楽団 JUNE版·14 ファンキー_モンキー_ギャングS
富士見二丁目交響楽団 JUNE版 Voice Collection系列之 桐之院圭
富士見二丁目交響楽団 JUNE版 Voice Collection系列之 五十嵐くんの人に言えない銀の夜
富士見二丁目交響楽団 SONY版·01 寒冷前線コンダクター
富士見二丁目交響楽団 SONY版·02 コンサートはお好き?
富士見二丁目交響楽団 SONY版·03 きわめて私的な夜想曲
富士見二丁目交響楽団 SONY版·04 秋月こおプレゼンツ マ ンハッタン·ソナタ 曼哈頓奏鳴曲
富士見二丁目交響楽団 SONY版·05 J戦場狂騒曲
富士見二丁目交響楽団 SONY版·06 春の嵐
富士見二丁目交響楽団 SONY版·07 怪談さまよえる バイオリニスト(初回限定盤)と(通常盤)2枚組
富士見二丁目交響楽団 SONY版·08 守村悠季ヴァイオリン·ピースYuhki Morimura Violin Pieces
富士見二丁目交響楽団 SONY版·09 巷のアマデウス(初回限定盤)と(通常盤)2枚組
富士見二丁目交響楽団 SONY版·10 Anniversaryアニバーサリー(初回限定盤)と(通常盤)2枚組
富士見二丁目交響楽団 SONY版·11 メリー?ハッピーソング-Marry Happy Song
富士見二丁目交響楽団 SONY版·12 ホーム スイートホーム-Home Sweet Home
富士見二丁目交響楽団 ボイスコレクションシリーズ 第一弾 「桐ノ院圭=増谷康紀
富士見二丁目交響楽団 日本コロンビア版(哥倫比亞版)·01 long ago
富士見二丁目交響楽団 日本コロンビア版(哥倫比亞版)·02 雨の歌をきみに
富士見二丁目交響楽団 同人CD-KISSにはすべてイミがある[森川智之 保志総一朗]

タクミくんシリーズ10th Anniversary(1)そして春風にささやいて(2组枚)[井上和彦×保志総一朗]
タクミくんシリーズ10th Anniversary(2)ギイがサンタになる夜は+BK[井上和彦×保志総一朗 森久保祥太郎×石田彰]
タクミくんシリーズ10th Anniversary(3)バレンタインルーレット[井上和彦×保志総一朗]
タクミくんシリーズ10th Anniversary(4)約束の海の下で[井上和彦×保志総一朗]
タクミくんシリーズ10th Anniversary(5)美貌のディテイル+BK[井上和彦×保志総一朗 森久保祥太郎×石田彰]
タクミくんシリーズ10th Anniversary(6)緑のゆびさき+BK[保志総一朗 井上和彦 森久保祥太郎 関俊彦]
タクミくんシリーズ10th Anniversary.MINICD[BROWN]
タクミくんシリーズ-01 そして春風にささやいて[井上和彦×松本保典]
タクミくんシリーズ-02 FAREWELLフェアウェル[井上和彦×鳥海勝美]
タクミくんシリーズ-03 CANON[井上和彦×鳥海勝美 森川智之×石田彰]
タクミくんシリーズ-04 恋文[井上和彦×鳥海勝美 林延年×石川英郎]
タクミくんシリーズ-05 Sincerely(2组枚)[井上和彦×鳥海勝美 中井和哉×石田彰]
タクミくんシリーズ-06 そして春風にささやいて それらすべて愛しき日々[井上和彦×鳥海勝美]
タクミくんシリーズ-07 Pride 6月の自尊心[井上和彦×鳥海勝美]
タクミくんシリーズ-08 美貌のディテイル[置鮎龍太郎×青木誠 森久保祥太郎×石田彰]
タクミくんシリーズ-09 緑のゆびさき[置鮎龍太郎×青木誠]
タクミくんシリーズ-10 夢の後先[井上和彦×保志総一朗 森久保祥太郎×石田彰 櫻井孝宏×宮田幸季]
タクミくんシリーズ-11 あの 晴れた青空[井上和彦×保志総一朗]

163:
saiunkokudrama

收藏: QQ书签 del.icio.us 订阅: Google 抓虾

一种软件开发流程

karada 发表于 2008-03-27 20:32:15

以下 蓝色表示新代码, 红色表示替代了其他代码, 绿色表示没有改变过但是从其他地方移动过来的。

1 - 从一个骨架作为开始:
#include <stdio.h>


int main( void ) {
   return 0;
}


2 - 该程序很重要的部分就是输入源, 因此我打开并打印一个测试文件以保证输入正常:
#include <stdio.h>


int main( void ) {
FILE *fp = fopen( "test.txt", "r" );

   if ( fp ) {
int ch;

while ( ( ch = fgetc( fp ) ) != EOF ) {
   fputc( ch, stdout );
}

fclose( fp );
   } else {
perror( "error opening the file" );
   }

   return 0;
}

3 - 好了, 貌似文件打开和读取都如我所愿。现在让它数一数全部的字符看看是否与实际文件中的字符数相等:
#include <stdio.h>


int main( void ) {
   FILE *fp = fopen( "test.txt", "r" );

   if ( fp ) {
int ch;
int n = 0;

while ( ( ch = fgetc( fp ) ) != EOF ) {
   ++n;
}

printf( "total characters: %d\n", n );
fclose( fp );
   } else {
perror( "error opening the file" );
   }

   return 0;
}

4 - 现在已经确定文件输入正确,因此我可以一次对一种字符进行计数,看看是否准确:
#include <stdio.h>
#include <ctype.h>


int main( void ) {
   FILE *fp = fopen( "test.txt", "r" );

   if ( fp ) {
int ch;
int nalpha = 0;
int ndigit = 0;
int npunct = 0;
int nspace = 0;

while ( ( ch = fgetc( fp ) ) != EOF ) {
   if ( isalpha( ch ) ) {
       ++nalpha;
   } else if ( isdigit( ch ) ) {
       ++ndigit;
   } else if ( ispunct( ch ) ) {
       ++npunct;
   } else if ( isspace( ch ) ) {
       ++nspace;
   }
}

printf( "alphabetic characters: %d\n", nalpha );
printf( "digit characters: %d\n", ndigit );
printf( "punctuation characters: %d\n", npunct );
printf( "whitespace characters: %d\n", nspace );
fclose( fp );
   } else {
perror( "error opening the file" );
   }

   return 0;
}

5 - 根据输出提示,所有测试都正常,但是文件仍然是硬编码(译者注:hard coded指程序中的魔数),我希望用户能传递文件名给程序。而且main函数太长,因此我重构计数代码,将其放到单独的函数中并测试它是否还能正确运行。任何改变,即使非常小,意味着重新测试。重构不改变代码的逻辑, 改变的仅仅是代码的结构,优点为能更方便地组织代码,它的行为(跟重构前的代码)完全一样。
#include <stdio.h>
#include <ctype.h>


void process_file( FILE *fp );


int main( void ) {
   FILE *fp = fopen( "test.txt", "r" );

   if ( fp ) {
process_file( fp );
fclose( fp );
   } else {
perror( "error opening the file" );
   }

   return 0;
}


void process_file( FILE *fp ) {
  int ch;
   int nalpha = 0;
   int ndigit = 0;
   int npunct = 0;
   int nspace = 0;

   while ( ( ch = fgetc( fp ) ) != EOF ) {
if ( isalpha( ch ) ) {
   ++nalpha;
} else if ( isdigit( ch ) ) {
   ++ndigit;
} else if ( ispunct( ch ) ) {
   ++npunct;
} else if ( isspace( ch ) ) {
   ++nspace;
}
   }

   printf( "alphabetic characters: %d\n", nalpha );
   printf( "digit characters: %d\n", ndigit );
   printf( "punctuation characters: %d\n", npunct );
   printf( "whitespace characters: %d\n", nspace );
}

6 - 现在我可以将文件名作为命令行参数传递以避免将main函数弄乱。必须确定程序中的每一个分支都能运行到, 因此我故意制造点错误看看错误处理代码是否正确。
#include <stdio.h>
#include <ctype.h>


void process_file( FILE *fp );


int main( int argc, char *argv[] ) {
  if ( argc > 1 ) {
FILE *fp = fopen( argv[1], "r" );

if ( fp ) {
   process_file( fp );
   fclose( fp );
} else {
   perror( "error opening the file" );
}
   } else {
fprintf( stderr, "usage: prog <filename>\n" );
   }

   return 0;
}


void process_file( FILE *fp ) {
   int ch;
   int nalpha = 0;
   int ndigit = 0;
   int npunct = 0;
   int nspace = 0;

   while ( ( ch = fgetc( fp ) ) != EOF ) {
if ( isalpha( ch ) ) {
   ++nalpha;
} else if ( isdigit( ch ) ) {
   ++ndigit;
} else if ( ispunct( ch ) ) {
   ++npunct;
} else if ( isspace( ch ) ) {
   ++nspace;
}
   }

   printf( "alphabetic characters: %d\n", nalpha );
   printf( "digit characters: %d\n", ndigit );
   printf( "punctuation characters: %d\n", npunct );
   printf( "whitespace characters: %d\n", nspace );
}

7 - 现在, 我可以在确保稳定的代码中加上错误保护代码:
#include <stdio.h>
#include <ctype.h>


int process_file( FILE *fp );


int main( int argc, char *argv[] ) {
   if ( argc > 1 ) {
FILE *fp = fopen( argv[1], "r" );

if ( fp ) {
   if ( !process_file( fp ) ) {
       perror( "error reading from the file" );
   }

   fclose( fp );
} else {
   perror( "error opening the file" );
}
   } else {
fprintf( stderr, "usage: prog <filename>\n" );
   }

   return 0;
}


int process_file( FILE *fp ) {
   int ch;
   int nalpha = 0;
   int ndigit = 0;
   int npunct = 0;
   int nspace = 0;
  int rc = 0;

   if ( fp != NULL ) {
while ( ( ch = fgetc( fp ) ) != EOF ) {
   if ( isalpha( ch ) ) {
       ++nalpha;
   } else if ( isdigit( ch ) ) {
       ++ndigit;
   } else if ( ispunct( ch ) ) {
       ++npunct;
   } else if ( isspace( ch ) ) {
       ++nspace;
   }
}

if ( !ferror( fp ) ) {
   printf( "alphabetic characters: %d\n", nalpha );
   printf( "digit characters: %d\n", ndigit );
   printf( "punctuation characters: %d\n", npunct );
   printf( "whitespace characters: %d\n", nspace );
    rc = 1;
}
   }

   return rc;
}

8 - 现在整个代码完成了,但是没有任何注释,我得给整个程序比较让人困惑的地方加上注释。该程序能加的地方不多,因为它实在是太简单了。
/*
   File - prog.c
   Author - D. Burke (Noir)


   Count alphabetic, digit, punctuation, and
   whitespace characters in a user supplied file
*/
#include <stdio.h>
#include <ctype.h>


int process_file( FILE *fp );


int main( int argc, char *argv[] ) {
   if ( argc > 1 ) {
FILE *fp = fopen( argv[1], "r" );

if ( fp ) {
   if ( !process_file( fp ) ) {
      // failure means a stream error or bad file
       perror( "error reading from the file" );
   }

   fclose( fp );
} else {
   perror( "error opening the file" );
}
   } else {
fprintf( stderr, "usage: prog <filename>\n" );
   }

   return 0;
}


int process_file( FILE *fp ) {
   int ch;
   int nalpha = 0;
   int ndigit = 0;
   int npunct = 0;
   int nspace = 0;

  // assume failure
   int rc = 0;

   if ( fp != NULL ) {
while ( ( ch = fgetc( fp ) ) != EOF ) {
   if ( isalpha( ch ) ) {
       ++nalpha;
   } else if ( isdigit( ch ) ) {
       ++ndigit;
   } else if ( ispunct( ch ) ) {
       ++npunct;
   } else if ( isspace( ch ) ) {
       ++nspace;
   }
}

if ( !ferror( fp ) ) {
   // only produce output if there are no errors
   printf( "alphabetic characters: %d\n", nalpha );
   printf( "digit characters: %d\n", ndigit );
   printf( "punctuation characters: %d\n", npunct );
   printf( "whitespace characters: %d\n", nspace );
   rc = 1;
}
   }

   return rc;
}
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

准备做程序员必知的知识

karada 发表于 2008-03-27 20:25:04

眼睛都看花了.....orz

================转载分割线======================

摘要:目前在Windows下开发应用程序的工具虽然很多,但是C/C++作为一种非常成
熟和高效的开发语言在大型复杂项目的开发中仍然得到了广泛应用。为了减轻程序
开发负担,提高开发效率,各种流行的C++都提供了类库,本文就是针对如何在
Visual C++环境中使用MFC类库来开发高级程序所需要解决的一些问题进行了的探
讨,重点讨论了利用MFC开发单文档多视应用程序和DDE应用程序的方法。
一、使用C/C++
随着Windows系列操作系统的日益普遍,传统的基于DOS编程逐渐转向Windows下编程
已经成为必然趋势。目前在Windows下开发应用程序的工具很多,典型的如Borland
C++、Visual C++、Visual Baisic以及Delphi等等。每种开发工具都各有其特点,
一般来讲用户可以根据自己的使用习惯和开发项目的性质来选择具体的开发语言。

Visual Basic是一个被软件界称之为划时代的革新产品,该软件改变了人们开发
Windows程序的方式,它采用交互式的可视化操作,使得人们开发Windows程序的每
一过程都有直观形象的反馈,从而加速整个开发进程。Visual Basic使得Windows程
序设计人员不再只依赖于复杂的SDK编程,使得开发Windows程序非常容易,可以
说,用户学习并使用VB来开发Windows应用的时间是最短的。Visual Basic版本几经
演变,目前已经发展到5.0。在4.0版本中,由于完全使用了面向对象的编程概念,
同时具有Windows 3.1和Windows 95下的版本,因而使得其开发复杂程序的功能逐渐
增强。VB5.0则抛弃了Windows 3.x的用户,只能在32位Windows中使用,据悉,该版
本吸收了Delphi的成功策略,引入了本地代码(Native Code)编译器,从而使得程序
执行速度大大加快,克服了以往版本由于执行文件采用P-Code代码而导致运行速度
慢的特点,根据微软的声明,该版本的采用本地代码编译后得到的应用程序在某些
情况下执行速度较以往提高了10~20倍,执行速度可以直逼与采用Visual C++编写的
应用,而应用开发速度则是VB的强项,因此Visual Basic 5.0非常具有竞争性。目
前Visual Basic非常广泛地用于开发各种Windows程序,如数据库前端应用程序和多
媒体应用等。但是,在作者看来,采用VB也有一定的缺点,原因有以下几点:
1. Visual Basic来源于Basic语言,虽然经过微软的不断增强,但是仍然缺乏非常
灵活的数据类型和编程策略,因而在开发一些项目必须的复杂数据结构遇到麻烦,
如链表、图和二叉树等等。由于在中大型项目开发后期,开发工作不再以界面为
主,而是在算法设计和底层软硬件工作,这就使VB开发项目的后期工作量大幅度增
加,为了达到项目要求,经常需要再转向C/C++开发一些专用的动态连接库来解决问
题。
2. Visual Basic运行速度慢,前文讲过,采用P-Code代码虽然执行文件很小,但是
在运行时需要解释执行,并且,它的运行必须有对应的VBRUN.DLL和所使用的VBX或
者OCX支持。对于浮点操作密集或者循环嵌套很多的应用来说,VB没有采取特别的优
化,因而执行速度远不如用C/C++和Fortran开发的应用速度快。VB 5.0虽然通过引
入本地代码编译器大大弥补了这个缺陷,但是由于其只能运行于32位Windows环境因
而在16位Windows上速度问题仍然得不到解决。虽然目前转向32位Windows的趋势非
常强劲,但是不容忽视由于硬件的限制或者使用习惯等诸多原因,还有许多用户仍
然在16位Windows上工作。在计算机十分普及的美国,96年使用16位Windows的用户
仍然超过了使用32位Windows的用户,任何进行系统软件设计的人员都应该照顾到这
些仍然使用16位Windows的用户。
3. VB不能灵活地使用系统资源。熟悉Windows编程的人都知道,如果要直接访问硬
件或者要编写对系统进行有效访问的应用程序,没有Windows API函数的帮助则非常
困难,但是令VB程序员失望的是,API函数是用C语言和汇编语言实现的,是为C编程
准备的,如果要在VB里面使用这些上千个API函数则比较麻烦,特别是,如果设计人
员不懂C语言则尤其困难。由于API函数的复杂性,而其本身不是为了方便VB编程而
提供的,因此在VB里面调用API函数需要一定的技巧,这些技巧足够用一本很厚的书
来表述。VB程序员可以从书店里找到好多本类似的书籍。可以说,任何一个VB程序
员发展到一定阶段都需要与众多的API函数打交道。另外,由于VB不支持端口操作,
因此,如果要编写类似数据采集等需要与硬件交互的程序则需要求救于C/C++语言。

4. Visual Basic项目分发和管理困难,其原因同上讲的,VB应用的运行不能脱离VB
的运行库和所使用的控件,因此,如果开发人员要将VB应用分发给用户那么一定要
带上VB的运行库和所使用的控件,并且要保证正确安装,这就导致即使一个非常简
单的应用也需要附带大量其它相关支撑库程序,对于VB 4.0及更高版本,由于大量
的使用了OLE控件(在VB中称为OCX),其安装更为复杂。
Delphi软件是国际宝兰公司(Borland)的得意之作,也是备受软件界推崇,与VB一
样,它完全是一个交互式的可视化开发平台,支持Client/Server应用程序的开发,
其最新版本2.0可以开发Windows 3.x、Windows 95和Windows NT的应用程
序。Delphi开发速度也非常快,与VB相比,由于具有本地代码编译器因此它产生的
可执行文件执行速度大大加快。Delphi软件是一个非常有竞争力的软件,采用的是
面向对象的Object pascal语言,支持硬件操作和API调用。但是由于采用的编程语
言为Pascal,这种语言并不非常流行,许多程序设计人员完全不熟悉这种语言,因
此极大地限制了该软件的使用,如果宝兰公司能够将Delphi软件提供的RAD开发机制
引入到其Borland C++中,则可能会形成一个非常成功的产品(目前该版本已经推
出,即C++ Builder,笔者注)。
VB和Delphi引入的可视化开发方法还有一个共同的缺点就是各个版本之间的兼容问
题。一般来讲,采用这些可视化开发工具开发的应用程序在移植到高版本时不会遇
到太大困难,但是一旦往相反方向移植则困难重重,有时甚至不可能。C/C++语言则
不具有这种局限性,各个版本之间的相互移植并不困难,高版本往低版本移植一般
只需重建工程文件即可大功告成。
综上所述,根据作者的观点,如果要开发一个大型复杂的应用程序首选的还是
C/C++,特别是在16位Windows下。虽然这会使前期工作增加,但是在项目的中后期
将逐渐会领略到其优越性和开发效率,其灵活高效的执行代码适合于对速度和应用
程序之间的协同性要求很高的场合。纯粹基于Windows SDK来开发Windows程序是一
项艰巨的工程,值得庆幸的是目前各种流行的C/C++开发工具都提供了类库开发框架
来简化整个开发过程而又不失其固有的灵活高效性,不同的开发语言所提供的类库
开发框架不同,如Borland C++提供的OWL(Object Windows Library)和 Visual C++
提供的MFC(Microsoft Fundmental Class),这两种类库都封装了大量的Windows
API和Windows的开发元素而使得开发任务简化,两种类库各有其优点,据作者掌握
的资料,采用MFC编写的应用程序执行代码更小,执行速度也更快,这大概是因为该
软件的开发者是开发Windows操作系统的Microsoft公司的缘故吧,现在MFC正逐渐成
为Windows下的类库开发标准,正被越来越多的其它C/C++编译工具所支持,如
Watcom C++。使用MC类库同时配合Visual C++提供的AppWizard、ClassWizard和
AppStudio可以大幅度提高开发效率。笔者在工作中积累了一些MFC的使用经验现在
提出来供大家参考,希望对广大同行有所帮助,尤其是那些仍然致力于16位Windows
编程的程序员。本文使用的Visual C++ 1.51编译器,但是其方法同样适用于其它
VC++版本,包括Visual C++ 4.x。
二、MFC编程综述
采用MFC开发Windows程序之所以能够大幅度提高开发速度和效率主要是因为MFC在类
层次封装了大量Windows SDK函数和典型Windows应用的缺省处理,这样,用户只需
要较少的编程就可以实现自己的开发任务。如果在MFC基础上再配合Visual C++提供
的AppWizard、ClassWizard和AppStudio工具那么更可以大幅度加快开发进程。MFC
提供大量的基类供程序员使用,常见的如CWinApp类、CFrameWnd类、CMDIFrameWnd
类、CMDIChildWnd类、CView类、CDC类和CDocument类等等。通过从这些基类中派生
出用户自己的类,然后重载特殊的几个函数就可以生成一个独立的应用程序。可以
说,采用MFC编写Windows应用程序是非常方便的,虽然其学习过程并不简单,但是
其提供的灵活高效性足以使任何Windows程序开发人员为之付出努力。如果用户不曾
使用过MFC,那么用户可以通过附录中所列的参考书去学习MFC的强大功能。
采用MFC应用框架产生的应用程序使用了标准化的结构,因而使得采用MFC编写的程
序的在不同平台上的移植变得非常容易,事实上,MFC的16位和32位版本之间差别很
小。MFC提供的标准化结构是经过众多专家分析调研后总结编写出来的,一般情况下
可以满足绝大多数用户的要求,但有时用户也可以通过重载一些函数来修改其缺省
的风格从而实现自己特有的风格,如自定义应用图表和灰色背景等。在MFC提供的文
档视结构中,文档、视和资源之间的联系是通过定义文档模板来实现的,如:
m_pSimuTemplate = new CMultiDocTemplate(
IDR_SIMUTYPE,
RUNTIME_CLASS(CSimuDoc),
RUNTIME_CLASS(CMyChild), // Derived MDI child frame
RUNTIME_CLASS(CSimuView));
上中第一项IDR_SIMUTYPE就包括了视口的菜单,加速键和图表等资源,如果用户使
用AppWizard来产生的应用基本框架,那么其也同时产生了缺省的图标,如果用户不
满意缺省图标(实际上用户很少满足于缺省图标),只需要将缺省图标删除,然后
编辑或者直接引入一个新的图标,在存储这一图标时只需要使用与被删除图标同样
的ID即可实现替代。
熟悉Windows程序开发的人都知道,在Windows上通过使用灰色背景可以增强应用程
序的视觉效果,曾有人戏称,灰色是图形界面永恒的颜色。使用MFC产生的应用程序
的背景缺省为白色,如果用户希望改变成灰色或者其它颜色,那就需要使用单独处
理,解决的办法很多,如在每次视口的OnPaint()事件中采用灰色刷子人为填充背
景,但是这不是最好的办法。笔者发现最好的办法就是采用AfxRegisterWndClass()
函数注册一个使用灰色背景刷的新的窗口类,这需要重载PreCreateWindow()函数来
实现这一点,如下程序代码片段所示:
BOOL CSimuView::PreCreateWindow(CREATESTRUCT& cs)
{
HBRUSH hbkbrush=CreateSolidBrush(RGB(192,192,192));//创建灰色背景刷
LPCSTR lpMyOwnClass=AfxRegisterWndClass(CS_HREDRAW
|CS_VREDRAW|CS_OWNDC,0,hbkbrush);//注册新类
cs.lpszClass=lpMyOwnClass;//修改缺省的类风格
return TRUE;
}
采用这种方法速度最快,也最省力。同时,还可以在PreCreateWindow()函数定义所
希望的任何窗口风格,如窗口大小,光标式样等。
三、使用单文档-多视结构
如果用户使用过MFC进行编程,那么就会发现借助于AppWizard基于MFC无论编写SDI
(单文档界面)还是编写MDI(多文档界面)都是十分方便的。MDI应用程序目前使用越
来越普遍,人们熟悉的Microsoft公司的Office系列产品以及Visual系列产品都是典
型的多文档应用程序。这种多文档界面具有多窗口的特点,因而人们可以在一个程
序中使用多个子窗口来实现不同数据的浏览查看。如果用户要实现在MDI各个窗口之
间针对同一数据进行不同的可视化就是一件比较麻烦的事情。值得庆幸的是,MFC提
供的文档-视结构大大简化了这一工作。文档-视结构通过将数据从用户对数据的观
察中分离出来,从而方便实现多视,亦即多个视口针对同一数据,如果一个视口中
数据发生改变,那么其它相关视口中的内容也会随之发生改变以反映数据的变化。
SDI和MDI这两种Windows标准应用程序框架并不是总能满足用户的需要,就作者的工
作而言,就特别需要一种被称为单文档多视的应用程序,英文可以缩写为SDMV。通
过SDMV应用我们可以利用文档类来统一管理应用程序的所有数据,同时需要采用多
窗口以多种方式来可视化这些的数据,如棒图,趋势图和参数列表,从而方便用户
从不同角度来观察数据。MDI虽然具有多窗口的特点,但是其为多文档,即通常情况
下,一个视口对应一个文档,视口+文档便构成一个子窗口。在各个子窗口之间数据
相互独立,如果要保持数据同步更新就需要采用特殊的技术了,采用这种方式既费
时又费力。通过笔者的实践发现,利用MFC本身提供的多视概念通过适当改造MDI窗
口应用程序就可以实现上述SDMV结构。
所谓SDMV应用程序本质上仍然是一个MDI应用程序,只是在程序中我们人为控制使其
只能生成一个文档类,这个文档在第一个视口创建时创建,注意,这里并不需要限
制各个视口的创建先后顺序。此后与MDI窗口固有特性不同的是,所有新创建的子窗
口都不再创建独立文档,而是把该新视口直接连接到已有的文档对象上,这样就使
其成为单文档多视的结构,所有相关数据都存储在文档对象中,一旦文挡中数据发
生改变,通过UpdateAllViews()函数通知所有相关视口,各个视口就可以在
OnUpdate()中相应数据的变化。这种响应机制如下图所示:

图 1 文档-视结构数据更新机制
由于MDI本质上并不是为这种单文档多视机制服务的,因而在实际应用时需要解决一
些问题。
1、窗口标题问题
窗口标题本来不应该成为问题,缺省情况下MDI窗口通过在文档模板中提供的资源ID
所提供的对应字符串来确定窗口标题。但是对于SDMV应用,由于各个视口实质上是
对应于同一个文挡,因此每个视口都具有相同标题,只不过增加了一个数据用于指
示这是第几个视口。如果在各个视口中指明具体的窗口名字,那么由不同的视口启
动创建文档产生的窗口标题就不同,这个名字会影响到后继视口。为了作到不同类
型的视口如棒图视口和曲线视口具有不同的标题,这就需要一定的技术处理。根据
笔者的摸索发现可以采用如下步骤实现:
首先在从标准的MDI子窗口基类CMDIChildWnd派生一个自己的子窗口类,姑且命名为
CMyChild,然后在其成员变量中增加一个CString型变量用以存储当前窗口标题:
CString winTitle;
然后在不同的视口创建过程中通过获取父窗口指针按自己的意愿对上述变量进行赋
值,程序片段如下:
pChild=(CMyChild*)GetParent();
pChild->winTitle="棒图显示窗口";
最后在CMyChild派生类中重载CMDIChildWnd基类中的OnUpdateFrameTitle()函数来
强制实现窗口标题的个性化,这一函数在各种类库手册上和联机帮助中都没有,但
的确有这样一个具有保护属性的函数用来实现窗口标题的更新操作,这可以从MFC类
库的源代码中找到该函数的实现。重载后的源代码如下:
void CMyChild::OnUpdateFrameTitle(BOOL bAddToTitle)
{
// update our parent window first
GetMDIFrame()->OnUpdateFrameTitle(bAddToTitle);

if ((GetStyle() & FWS_ADDTOTITLE) == 0)
return; // leave child window alone!

CDocument* pDocument = GetActiveDocument();
if (bAddToTitle && pDocument != NULL)
{
char szOld[256];
GetWindowText(szOld, sizeof(szOld));
char szText[256];

lstrcpy(szText,winTitle); //Modified by author!
if (m_nWindow > 0)
wsprintf(szText + lstrlen(szText), ":%d", m_nWindow);

// set title if changed, but don't remove completely
if (lstrcmp(szText, szOld) != 0)
SetWindowText(szText);
}
}
2、如何创建SDMV应用
如何创建SDMV应用比较麻烦,下面通过举例来具体说明。该例子假设用户需要建棒
图类型和曲线形式的两种视口,假设用户已经利用CView基类派生并且实现了这两个
类,分别对应于CMyChart和CMyTraceView两个类。
1) 在应用类(从CWinApp派生出来的类)的头文件中加入下列变量和函数原型说
明:
CMultiDocTemplate* m_pMyTraceTemplate;
CMultiDocTemplate* m_pMyChartTemplate;
int ExitInstance();
2) 在应用类的InitInstance成员函数中删除对AddDocTemplate函数的调用和
OpenFileNew()语句,并且加入如下代码:
m_pMyTraceTemplate = new CMultiDocTemplate(
IDR_MYTRACEVIEW,
RUNTIME_CLASS(CSimuDoc),
RUNTIME_CLASS(CMyChild), // Derived MDI child frame
RUNTIME_CLASS(CMyTraceView));

m_pMyChartTemplate = new CMultiDocTemplate(
IDR_MYCHART,
RUNTIME_CLASS(CSimuDoc),
RUNTIME_CLASS(CMyChild), // Derived MDI child frame
RUNTIME_CLASS(CMyChart));
3) 实现ExitInstance()函数,在其中删除所用的两个辅助模板:
int CTestApp::ExitInstance()
{
if(m_pMyChartTemplate) delete m_pMyChartTemplate;
if(m_pMyTraceTemplate) delete m_pMyTraceTemplate;
return TRUE;
}
4) 在菜单资源中去掉File菜单中的New和Open项,加入New Chart View和New
Trace View两项,在对应的菜单命令中实现如下:
void CMainFrame::OnNewMychart()
{
// TODO: Add your command handler code here
OnNewView(((CSimuApp*)AfxGetApp())->m_pMyChartTemplate);
}
void CMainFrame::OnNewMyTrace()
{
// TODO: Add your command handler code here
OnNewView(((CSimuApp*)AfxGetApp())->m_pMyTraceTemplate);
}
上中OnNewView的实现如下:
BOOL CMainFrame::OnNewView(CMultiDocTemplate* pDocTemplate)
{
CMDIChildWnd* pActiveChild = MDIGetActive();
CDocument* pDocument;
if (pActiveChild == NULL ||
(pDocument = pActiveChild->GetActiveDocument()) == NULL)
{
TRACE0("Now New the specify view\n");
ASSERT(pDocTemplate != NULL);
ASSERT(pDocTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate)));
pDocTemplate->OpenDocumentFile(NULL);
return TRUE;
}

// otherwise we have a new frame to the same document!
CMultiDocTemplate* pTemplate = pDocTemplate;
ASSERT_VALID(pTemplate);
CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
if (pFrame == NULL)
{
TRACE0("Warning: failed to create new frame\n");
return FALSE; // command failed
}
pTemplate->InitialUpdateFrame(pFrame, pDocument);
return TRUE;
}
OnNewView是整个SDMV应用的核心组成,它的任务是创建一个新的指定类型的视口,
它首先判断是否有活动视口存在,文档是否已经创建,正常情况下活动视口存在则
表明文档存在,如果不存在则利用所指定的文档模板创建一个新的活动视口,否则
则只创建视口,同时将其连接到已存在的文档对象上。
通过以上步骤就可以实现SDMV应用,在其后的具体应用中利用文档对象的
UpdateAllViews()函数和视口的OnUpdate()函数就可以很好的工作了。
四、使用DDE服务
Windows 3.x是一个分时多任务操作环境,在此环境下,多个应用程序可以并发地执
行。为了在并发执行的多个任务之间共享数据和资源,Windows 提供了几种机制,
主要是通过剪贴板(Clipboard)和动态数据交换(Dynamic Data Exchange)。前者对
于用户需要直接参与的数据交换来说,是一个非常方便的工具,但是如果希望数据
交换自动进行时就必须依靠DDE技术了。编写DDE应用的技术也发展了好几代,从最
初的基于消息的DDE到基于DDEML(动态数据交换管理库),再到现在流行的OLE技
术。DDE技术的发展使得程序开发人员编写DDE应用更为简洁。从发展趋势来看,基
于OLE的数据交换是最好的,它特别符合当今软件领域的客户-服务器机制
(Client-Server)。为适应多平台和Internet的需要,在OLE基础上微软又开发了
ActiveX技术。但是不容忽视的是,基于传统的DDE数据交换也自有它的应用空间,
使用仍然广泛。目前在Windows 3.x下,基于OLE的远程数据交换还很不成熟,但是
在WFW(Windows for Workgroup)下基于网络动态数据交换的技术却很成熟,目前也
应用非常普遍。关于DDE应用的开发和NetDDE的应用可以参看附录7。
1、回调函数的处理
由于DDEML机制需要使用回调函数,因此使用DDEML的关键是解决在MFC编程体系中回
调函数的使用。回调函数(Callback function)大量用于Windows的系统服务,通过
它,程序员可以安装设备驱动程序和消息过滤系统,以控制Windows的有效使用。
许多程序员都发现,利用MFC或者其它的C++应用编写回调函数是非常麻烦的,其根
本原因是回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以
将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函
数将发生错误,甚至编译就不能通过。通过查询资料发现,其错误是普通的C++成员
函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自
身的指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为
什么C++类的多个实例可以共享成员函数但是确有不同的数据成员。由于this指针的
作用,使得将一个CALLBACK型的成员函数作为回调函数安装时就会因为隐含的this
指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关
键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调
函数所遇到的问题。这种方法具有通用性,适合于任何C++。
1. 不使用成员函数,直接使用普通C函数,为了实现在C函数中可以访问类的成员变
量,可以使用友元操作符(friend),在C++中将该C函数说明为类的友元即可。这种
处理机制与普通的C编程中使用回调函数一样。
2. 使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作
为回调函数了。静态成员函数具有两大特点:其一,可以在没有类实例的情况下使
用;其二,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非
静态成员函数。由于在C++中使用类成员函数作为回调函数的目的就是为了访问所有
的成员变量和成员函数,如果作不到这一点将不具有实际意义。解决的办法也很简
单,就是使用一个静态类指针作为类成员,通过在类创建时初始化该静态指针,如
pThis=this,然后在回调函数中通过该静态指针就可以访问所有成员变量和成员函
数了。这种处理办法适用于只有一个类实例的情况,因为多个类实例将共享静态类
成员和静态成员函数,这就导致静态指针指向最后创建的类实例。为了避免这种情
况,可以使用回调函数的一个参数来传递this指针,从而实现数据成员共享。这种
方法稍稍麻烦,这里就不再赘述。
2、在MFC中使用DDEML
对于典型的MFC应用程序,主框架窗口类(CMainFrame)只有一个实例,因此可以使用
静态成员函数作为回调函数,从而实现DDE机制。具体的代码片段如下:
(1) 在CMainFrame类中声明如下静态成员:
static CMainFrame* pThis;
static DWORD idInst;
static HDDEDATA CALLBACK EXPORT DdeCallback(UINT,UINT,HCONV,HSZ,HSZ, HDDEDATA,DWORD,DWORD);
(2) 在类的创建代码(OnCreate())中作如下说明:
pThis=this;
lpDdeCallback=MakeProcInstance((FARPROC)DdeCallback,hInstance);
if(DdeInitialize(&idInst,(PFNCALLBACK)lpDdeCallback,CBF_FAIL_EXECUTES
|CBF_SKIP_REGISTRATIONS|CBF_SKIP_UNREGISTRATIONS,0L))
{
AfxMessageBox("不能初始化DDE服务","错误");
DestroyWindow();
}
(3) 回调函数实现如下:
HDDEDATA FAR PASCAL _export CMainFrame::DdeCallback(UINT iType,UINT iFmt, HCONV hConv,HSZ hsz1,HSZ hsz2,HDDEDATA hData,DWORD dwData1,DWORD dwData2)
{
char szBuffer[16];
int i;

switch(iType)
{
case XTYP_CONNECT: //hsz1=topiv, hsz2=service
return (HDDEDATA)TRUE;//TRUE;
case XTYP_ADVSTART: //hsz1=topic, hsz2=item
case XTYP_REQUEST:
case XTYP_ADVREQ:
case XTYP_POKE: //hsz1=Topic, hsz2=item, hData=data
case XTYP_ADVSTOP:
return NULL;
}
}
3、避免变量类型冲突
如果在MFC应用直接使用DDEML服务,那么该MFC应用在编译时将会遇到变量类型HSZ
重复定义错误。经过追踪发现,错误在于在DDEML.H对HSZ作了如下定义:
DECLARE_HANDLE32(HSZ);
而在AFXEXT.H(通过stdafx.h引入)中对HSZ又作了如下说明:
typedef BPSTR FAR* HSZ; // Long handle to a string
两个定义一个为32位整数,一个为BASIC字符串指针,当然会发生编译器不能作变量
类型转换的错误。实际上,将HSZ声明为BASIC字符串指针主要用于在MFC应用中使用
VBX控制。要改正这一错误,就必须保证不要在同一个代码模块中使用DDEML和VBX支
持,通过将使用DDEML和VBX的代码分开,并在使用DDEML代码的模块中最开头定义如
下编译器宏就可以解决上述问题:
#define NO_VBX_SUPPORT
五、使用3D控制
毫无疑问,3D控制的使用可以显著提高Windows应用程序的界面友好性,目前,许多
流行的Windows应用程序都使用了3D控制,典型的如Microsoft公司的Office系列软
件,而且,在Windows 95和Windows NT 4.0中,3D控制更是作为操作系统的一部分
直接提供,这意味着在其上运行的软件不需要作任何特殊处理,就具有3D界面效
果,但是,很遗憾的是,在Windows 3.x中,除了命令按钮控制使用3D控制以外,其
余所有的控制,如编辑框,列表框,检查框等都只使用2D控制,要想使用3D控制,
程序设计人员就必须在自己的程序中作一定的修改,考虑到目前3D效果的流行,这
点努力是值得的。
为了支持3D效果,Microsoft公司提供了一个专门用于3D控制的动态连接库,即
CTL3D.DLL,但是在其Visual C++中却没有如何使用3D控制的讨论,并且,Visual
C++也不直接支持3D编码,因为它不包括使用3D控制所必须的头文件。但是,这并不
意味着在Visual C++中不能使用3D控制,只不过用户需要从其它地方获取技术支持
罢了。由于使用的是动态连接库机制,因此,任何其它语言提供的3D头文件和
CTL3D.DLL的输入库都是可用的。作者使用的就是Borland公司的Borland C++中提供
的CTL3D.H和CTL3D.LIB。在C/C++中使用3D控制的方法也有很多种,在这里,为节约
篇幅,只讨论与本文相关的主题,即使用MFC编程时如何使用3D控制。
在MFC的所有对话框中使用3D控制可以遵循如下步骤:
1. 在CWinApp::InitInstance函数中调用Ctl3dRegister和Ctl3dAutosubclass函
数:
Ctl3dRegister(AfxGetInstanceHandle());
Ctl3dAutoSubclass(AfxGetInstanceHandle());
值得一提的是,在AppWizard产生的应用框架的CWinApp::InitInstance中有一个函
数调用为SetDialogBkColor,此函数的作用是将所有对话框的背景颜色设置为灰
色,这个功能与3D界面实现相同的功能,可以移去此语句。
由于CTL3D在初始化时读入所有的系统颜色并自己维持,为了使应用程序能够正确反
映系统颜色的变化,MFC应用程序可以在WM_SYSCOLORCHANGE消息中调用
Ctl3dColorChange函数。
2. 在MFC应用程序的CWinApp类中的ExitInstance函数中调用Ctl3dUnregister函
数,以方便Windows对CTL3D库的正确管理。
3. 在MFC应用程序的项目文件中加入CTL3D.LIB(可以用IMPORT.EXE产生)。
使用上述CTL3D的自动子类化的机制可以大大简化使用3D控制,如果这不满足你的要
求,那么你就必须单独在需要使用3D控制的对话框的OnInitDialog()中自行子类化
相关的控制类了,典型的如下代码片断所示:
BOOL CMyDialog::OnInitDialog()
{
Ctl3dSubclassDlgEx(m_hWnd,CTL3D_ALL);
return TRUE;
}
上面讲了在对话框中使用3D效果的办法,如果用户想在非对话框中使用3D控制,典
型的在FormView导出类中使用,可以在导出类的OnInitialUpdate函数中进行适当修
改,修改的大小取决于你是否使用了3D控制的自动子类化机制。如果使用前面提到
的自动子类化方法,那么仅需要在相应的OnInitialUpdate函数中调用
Ctl3dSubclassDlg函数了,如下代码片断所示:
void CMyView::OnInitialUpdate()
{
Ctl3dSubclassDlg(m_hWnd,CTL3D_ALL);
}
否则,则需要修改如下:
void CMyView::OnInitialUpdate()
{
Ctl3dSubclassDlgEx(m_hWnd,CTL3D_ALL);
}
六、使用自定义消息
1、MFC的消息映射机制
Windows是一个典型的消息驱动的操作系统,程序的运行是靠对各种消息的响应来实
现的,这些消息的来源非常广泛,既包括Windows系统本身,如WM_CLOSE、
WM_PAINT、WM_CREATE和WM_TIMER等常用消息,又包括用户菜单选择、键盘加速
键以及工具条和对话框按钮等等,如果应用程序要与其它程序协同工作,那么消息的来
源还包括其它应用程序发送的消息,串行口和并行口等硬件发送的消息等等。总
之,Windows程序的开发是围绕着对众多消息的合理响应和实现来实现程序的各种功
能的。使用过C语言来开发Windows程序的人都知道,在Windows程序的窗口回调函数
中需要安排Switch语句来响应大量的消息,同时由于消息的间断性使得不同的消息
响应之间信息的传递是通过大量的全局变量或者静态数据来实现的。
人们常用的两种类库OWL和MFC都提供了消息映射机制用以加速开发速度,使用者只
需要按规定定义好对应消息的处理函数自身即可,至于实际调用由类库本身所提供
的机制进行,或采用虚函数,或采用消息映射宏。为了有效节约内存,MFC并不大量
采用虚函数机制,而是采用宏来将特定的消息映射到派生类中的响应成员函数。这
种机制不但适用于Windows自身的140条消息,而且适用于菜单命令消息和按钮控制
消息。MFC提供的消息映射机制是非常强大的,它允许在类的各个层次上对消息进行
控制,而不简单的局限于消息产生者本身。在应用程序接收到窗口命令时,MFC将按
如下次序寻找相应的消息控制函数:
SDI应用
MDI应用
视口
视口
文档
文档
SDI主框架
MDI子框架
应用
MDI主框架

应用
大多数应用对每一个命令通常都只有一个特定的命令控制函数,而这个命令控制函
数也只属于某一特定的类,但是如果在应用中对同一消息有多个命令控制函数,那
么只有优先级较高的命令控制函数才会被调用。为了简化对常用命令的处理,MFC在
基类中提供并实现了许多消息映射的入口,如打印命令,打印预览命令,退出命令
以及联机帮助命令等,这样在派生类中就继承了所有的基类中的消息映射函数,从
而可以大大简化编程。如果我们要在自己派生类中实现对消息的控制,那么必须在
派生类中加上相应的控制函数和映射入口。
2、使用自己的消息
在程序设计的更深层次,人们常常会发现只依赖于菜单和命令按钮产生的消息是不
够的,常常因为程序运行的逻辑结构和不同视口之间数据的同步而需要使用一些自
定义的消息,这样通过在相应层次上安排消息响应函数就可以实现自己的特殊需
要。比如如果我们要在特定的时间间隔内通知所有数据输出视口重新取得新数据,
要依靠菜单命令和按钮命令实现不够理想,比较理想的解决办法是采用定时器事件
进行特定的计算操作,操作完成后再采用SendMessage发送自己的特定消息,只有当
这一消息得到处理后才会返回主控程序进行下一时间计算。通过在文档层次上安排
对消息的响应取得最新计算数据,而后通过UpdateAllViews()成员函数来通知所有
相关视口更新数据的显示。视口通过重载OnUpdate()成员函数就可以实现特定数据
的更新显示。
如果用户能够熟练使用SendMessage()函数和PostMessage()函数,那么要发送自定
义消息并不难,通常有两种选择,其一是发送WM_COMMAND消息,通过消息的WORD
wParam参数传递用户的命令ID,举例如下:
SendMessage(WM_COMMAND,IDC_GETDATA,0); //MFC主框架发送
然后在文档层次上安排消息映射入口:
ON_COMMAND(IDC_GETDATA, OnGetData)
同时在文档类中实现OnGetData()函数:
void CSimuDoc::OnGetData()
{
TRACE("Now in SimuDoc,From OnGetData\n");
UpdateAllViews(NULL);
}
注意在上中的消息映射入口需要用户手工加入,Visual C++提供的ClassWizard并不
能替用户完成这一工作。上中例子没有使用PostMessage函数而使用SendMessage函
数的原因是利用了SendMessage函数的特点,即它只有发送消息得到适当处理后方才
返回,这样有助于程序控制。
另一种发送自定义消息的办法是直接发送命令ID,在控制层次上采用ON_MESSAGE来
实现消息映射入口,注意这时的命令控制函数的原型根据Windows本身消息处理的规
定必须如下:
afx_msg LONG OnCaculationOnce(WPARAM wParam,LPARAM lParam);
相对来讲,这种机制不如上述机制简单,也就不再赘述。
七、使用不带文挡-视结构的MFC应用
文档-视结构的功能是非常强大的,可以适合于大多数应用程序,但是有时我们只需
要非常简单的程序,为了减少最终可执行文件尺寸和提高运行速度,我们没有必要
使用文挡-视结构,典型的有简单SDI应用和基于对话框的应用。
1、简单SDI应用
此时只需要使用CWinApp和CFrameWnd两个类就完全可以了。由于CWinApp类封装了
WinMain函数和消息处理循环,因此任何使用MFC进行编程的程序都不能脱离开该
类。实际上使用CWinApp类非常简单,主要是派生一个用户自己的应用类,如
CMyApp,然后只需重载CWinApp类的InitInstance()函数:

BOOL CMyApp::InitInstance()
{
m_pMainWnd=new CMainFrame();
ASSERT(m_pMainWnd!=NULL); //error checking only
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
至于所需要的主框架类,则可以直接使用ClassWizard实用程序生成,该类的头文件
与实现代码可以与CMyApp类的头文件和实现代码放在一起。注意,这里由一个技
巧,由于ClassWizard的使用需要有相应的CLW文件存在,而收工建代码时没有对应
的CLW文件,因此不能直接使用,解决办法是进入App Studio实用工具后使用
ClassWizard,此时系统会发觉不存在相应的CLW文件,系统将提示你重建CLW文件并
弹出相应对话框,这时候你不需要选择任何文件就直接选择OK按钮,这样系统将为
你产生一个空的CLW文件,这样就可以使用ClassWizard实用工具了。为了将CWinApp
和CFrameWnd的派生类有机地结合在一起,只需在CFrameWnd派生类的构造函数中进
行窗口创建即可。典型代码如下:
CMainFrame::CMainFrame()
{
Create(NULL,"DDE Client Application",WS_OVERLAPPEDWINDOW,rectDefault,
NULL,MAKEINTRESOURCE(IDR_MAINFRAME));
}
采用ClassWizard实用程序生成相关类代码后,所有的类的其它实现和维护就同普通
由AppWizard实用程序产生的代码一样了。
2、基于对话框的程序
有些主要用于数据的输入和输出等的应用在使用时没有必要改变窗口大小,典型的
如各种联机注册程序,这些使用对话框作为应用的主界面就足够了,而且开发此类
应用具有方便快捷的特点,代码也比较短小,如果直接采用各种控制类生成所需要
的控制就特别麻烦。在Visual C++ 4.x版本中使用AppWizard就可以直接生成基于对
话框的应用。在Visual 1.x中没有此功能,因此这类应用需要程序员自己实现。
实际上使用MFC实现基于对话框的应用非常简单,同样只使用两个MFC类作为基类,
这两个类为CWinApp类和CDialog类。所使用的对话框主界面同样可以先用App
Studio编辑对话框界面,再使用ClassWizard产生相应代码框架,然后修改CMyApp类
的声明,增加一个该对话框类的成员变量m_Mydlg,最后修改CMyApp类的
InitInstance()函数如下:
BOOL CMyApp::InitInstance()
{
m_Mydlg.DoModal();
return TRUE;
}
八、MFC应用的人工优化
使用C/C++编写Windows程序的优点就是灵活高效,运行速度快,Visual C++编译器
本身的优化工作相当出色,但这并不等于不需要进行适当的人工优化,为了提高程
序的运行速度,程序员可以从以下几方面努力:
1) 减少不必要的重复显示
相对来讲,Windows的GDI操作是比较慢的,因此在程序中我们应该尽可能地控制整
个视口的显示和更新,如果前后两此数据不发生变化,那么就不要重新进行视口的
GDI图形操作,尤其对于背景图显示时非万不得已时不要重绘,同时不要经常五必要
的刷新整个窗口。
2) 在视口极小化时不要进行更新屏幕操作
在窗口处于极小化时没有必要继续进行视口更新工作,这样可以显著提高速度。为
此需要在子窗口一级捕获上述信息(视口不能捕获该类信息),再在视口中进行相
应操作。如下代码片段所示:
首先在子窗口类中添加如下程序段:
void CMyChild::OnSysCommand(UINT nID,LPARAM lparam)
{
CMDIChildWnd::OnSysCommand(nID,lparam);
if(nID==SC_MINIMIZE){
RedrawFlag=0;
}
else
RedrawFlag=1;
}
再在视口更新时中修改如下:
void CMyChart::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint )
{
if(pChild->RedrawFlag)
{
InvalidateRect(&r,FALSE);
TRACE("Now In CMyChart::OnUpdate\n");
}
}
至于上中pChild指针可以在视口创建的例程中获取:
pChild=(CMyChild*)GetParent();
3) 使用永久性的资源
在频繁进行GDI输出的视口中,如在监控软件中常常使用的趋势图显示和棒图显示等
等,应该考虑在类层次上建立频繁使用的每种画笔和刷子,这可以避免频繁的在堆
中创建和删除GDI对象,从而提高速度。
4) 使用自有设备描述句柄
亦即在创建视口时通过指定WM_OWNDC风格来拥有自己的显示设备句柄,这虽然会多
消耗一些内存,一个DC大约占800字节的内存,但是这避免了每次进行GDI操作前创
建并合理初始化显示设备句柄这些重复操作。特别是要自定义坐标系统和使用特殊
字体的视口这一点尤其重要。在16M机器日益普遍的今天为了节约一点点内存而降低
速度的做法并不可取。
5) 优化编译时指定/G3选项和/FPix87选项
/G3选项将强迫编译器使用386处理器的处理代码,使用嵌入式协处理器指令对那些
频繁进行浮点运算的程序很有帮助。采用这两种编译开关虽然提高了对用户机型的
要求,但在386逐渐被淘汰,486市场大幅度萎缩,586市场日益普及的今天上述问题
已经不再成为问题了。
九、结束语
总体上讲,使用Visual C++和MFC类库进行Windows编程是非常方便的,本文中所提
到的一些看法只代表本人的观点,经验也只是笔者根据近年使用MFC进行Windows编
程的总结,在此写出来是希望对那些使用VC和MFC进行Windows编程的同行有所帮
助,如有不同看法欢迎与笔者联系讨论。

收藏: QQ书签 del.icio.us 订阅: Google 抓虾

软件开发流程

karada 发表于 2008-03-27 20:17:30

邵老师首先介绍了软件开发的流程,他把软件开发分为了两大类,即项目开发及产品开发。
项目开发是公司根据某一客户的需求单独为某一客户订制的软件;
产品开发是公司针对某一市场需求而开发的软件产品(比如WINDOWS、OFFICE等)。

程序员的基本技能包括了以下几个方面:
1、项目实践
  • 软件工程理论
  • 质量体系:ISO9001和CMM体系
  • UML基本理论
  • 测试理论和测试工具使用
  • 加密理论和加密方法
  • 源代码控制工具使用
  • 说明书编写
  • 程序的安装和部署

2、专业技能
3、程序员基本素质

  • 团队精神和协作能力(• 木桶理论、• 学习性组织
  • 文档习惯(• 注释、• 开发过程文档:良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。
  • 规范化,标准化的代码编写习惯(作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。• 代码编写规范• 界面设计规范
这里邵老师强调了标准未必要固定,但在一个项目组中间要有统一的标准。
  • 复用性,模块化思维能力(• 用户控件 • 组件技术
  • 测试习惯(• 单元测试 • 集成测试 • 系统测试 • 稳定性测试 • 软件研发作为一项工程而言,一个很重要的特点就是问题发现的越早,解决的代价就越低,程序员在每段代码,每个子模块完成后进行认真的测试,就可以尽量将一些潜在的问题最早的发现和解决,这样对整体系统建设的效率和可靠性就有了最大的保证。
  • 学习和总结的能力(
学习:程序员是人才很容易被淘汰,很容易落伍的职业,因为一种技术可能仅仅在三两年内具有领先性,程序员如果想安身立命,就必须不断跟进新的技术,学习新的技能。• 总结:善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有目的的跟踪该程序的应用状况
和用户反馈,随时总结,找到自己的不足,这样逐步提高,一个程序员才可能成长起来。

4、职业素质
  • 交际能力  
  • 表达能力  
  • 职业素养  
5、个人素质
  • 信心和恒心     
  • 良好的个人品质
  • 良好的个人习惯

• 关于质量控制和开发模板
• 项目组建设

高级程序员的基本素质:
  1. 需求分析能力
  对于程序员而言,理解需求就可以完成合格的代码,但是对于研发项目的组织和管理者,他们不但要理解客户需求,更多时候还要自行制定一些需求,为什么这么说呢?
  
2. 项目设计方法和流程处理能力
  程序设计者必须能够掌握不少于两到三种的项目设计方法(比如自顶至下的设计方法,比如快速原型法等等),并能够根据项目需求和资源搭配来选择合适的设计方法进行项目的整体设计。设计方法上选择不当,就会耽误研发周期,浪费研发资源,甚至影响研发效果。
  3. 复用设计和模块化分解能力
  一个成熟的软件行业,在一些相关项目和系统中,不同的部件是可以随意换装的,比如微软的许多桌面软件,在很多操作模块(如打开文件,保存文件等等)都是复用的同一套功能模块,而这些接口又通过一些类库提供给了桌面应用程序开发者方便挂接,这就是复用化的模块设计明显的一个佐证。

  4. 整体项目评估能力
  作为系统设计人员,必须能够从全局出发,对项目又整体的清醒认识,比如公司的资源配置是否合理和到位,比如工程进度安排是否能最大化体现效率又不至于无法按期完成。评估项目整体和各个模块的工作量,评估项目所需的资源,评估项目可能遇到的困难,都需要大量的经验积累,换言之,这是一种不断总结的累计才
能达到的境界
  5. 团队组织管理能力
  
首先是工作的量化,没有量化就很难做到合适的绩效考核,而程序量化又不是简单的代码行数可以计算的,因此要求技术管理人员需要能真正评估一个模块的复杂性和工作量。
  其次是对团队协作模式的调整,一般而言,程序开发的协作通常分为小组进行,小组有主程序员方式的,也有民主方式的,根据程序员之间的能力水平差距,以及根据项目研发的需求,选择合适的组队方式,并能将责权和成员的工作任务紧密结合,这样才能最大发挥组队的效率。

质量/过程标准部分的介绍

质量/过程标准是什么,有什么用?
• 开始并没有什么质量标准或者过程标准,但有些组织和企业呢,做的很成功,而有些则不成功。那么有人就去分析为什么,这些组织和企业成功了呢?他们有哪些的共同的特征吗?答案是有,于是这些特征被归纳出来(比如9000中的立项,开发策划,cmm中需求管理、配置管理等),并应用管理理论的成果,使之成为一种体系。
他能做到什么和不能做到什么?
• 当操作者有意识时,标准可以帮忙。假如你没做产品立项,或者作了,但没有市场分析报告,标准可以帮忙,因为SQA会来说,这违背了规程,我们必须先做产品立项,并且必须基于市场分析报告。
• 但大家没有意识时,比如产品立项时,假如与会人员多数认为没有市场,或者我们没有能力去做这个产品,但最终仍然立项通过,标准无能为力。
如何应用标准?
• 标准的目的?
– 可控制– 可追溯
• 开发模板
– 用户需求规格说明书 – 需求评审报告
– 系统设计书     – 系统开发进度计划
– 项目验收标准    – 用户手册项目组文档

接下来的课程中邵老师又介绍了下面的内容:
• 编码规范           
• 项目组守则         
• 工作计划总结       
• Sourcesafe使用规范
• 公共几类和常用代码

Sourcesafe使用
一、版本管理的必要性
• 如果说70年代的软件危机导致了软件工程思想的诞生和理论体系的发展,那么80~90年代尤其是90年代软件产业的迅猛发展导致了另一种新思想的产生和实现,这就是软件的版本管理。
• 以往的那种被誉为具有良好编程风格的做法,诸如在对他人的源程序进行修改时注释修改原因,修改人和日期,如果是多个成员同时进行了修改,那么需要进行及时的人工的差异比较和综合以便形成一个统一的新版本。这种做法在当前的大型软件的开发中已经越来越没有空间了,可以说是一种以小作坊的形式来面对软件的社会化大生产,再也不可能行得通了
二、Visual SourceSafe 6.0(VSS 6.0)简介
• Microsoft的VSS 6.0解决了软件开发小组长期所面临的版本管理问题,它可能有效地帮助项目开发组的负责人对项目程序进行管理,将所有的项目源文件(包括各种文件类型)以特有的方式存入数据库。
• 开发组的成员不能对该数据库中的文件进行直接的修改,而是由该版本管理器将该项目的源程序或是子项目的源程序拷贝到各个成员自己的工作目录下进行调试和修改,然后将修改后的项目文件作Checkin提交给VSS,由它进行综合更新。
• VSS的客户端和服务端的安装
• VSS服务端和客户端的使用

收藏: QQ书签 del.icio.us 订阅: Google 抓虾

网站运营管理的6S理论

karada 发表于 2008-03-27 19:47:44

6S是一个网站管理工作的基础。6S运用到网站管理维护中,可以提升网站质量、网站形象、服务水平,提高网站管理工作效率,6S实施不到位的网站,必然出现资金、精力的浪费。

第一个S:SEIRI(整理)

涵义:区分必要的栏目和不必要的栏目,去掉可以去掉的栏目及版块。
重新分类,使网站版面井然有序,不至于出现混乱的感觉。
通过整理,可以提高网站管理人员的工作效率,力量更集中,目标更明确。同时使网站的主题更鲜明。

砍掉一些网站栏目需要魄力,有些网站管理人员可能觉得这些版块或者栏目每天都能带来流量,所以舍不得丢弃,这样的心态是不利于网站发展的。有人会认为我们网站一直就这样,不是很好吗,但是,过去不代表未来。除非你的网站就是面向无聊和闲逛的用户,他们会从搜索引擎中不经意逛进来,但是,王义辉要提醒的是,这些用户除了浪费你的硬件资源,还能给你带来什么呢,当然,目前大多数人,包括投资者都是流量的盲目崇拜者、迷信者。

效率和精准,是务实的网络创业者所追求的,我们不期望做到世界排名多少然后圈钱上市,我们要踏踏实实的从创业开始就稳健的发展盈利。

第二个S:SEITON(整顿)

涵义:调整页面设计,优化用户体验。王义辉在以前的文章中提到过,网站应当用最简单高效的方式充分满足用户的需求,争取让用户可以在10秒钟之内找到所需。
网络竞争比传统经济中的竞争更残酷,在传统经济中,用户会因为地理等因素留在你这里,但在网络上,用户轻点鼠标就离你而去,所以,一定要在最醒目的地方告诉用户这里能满足其所需,让他们安心留下来。

第三个S:SEISO(清扫)

涵义:去掉网站内的一切垃圾内容,比如SPAM回帖,AD等等,让网站保持干净整洁。清扫的对象:漂浮广告,过多的站内广告,SPAM回帖等各种影响网站形象的内容。
当然还包括清理过期内容,及时清理缓存等等,这样还能提高网站的运行速度。

第四个S:SSEIKETSU(清洁)

涵义:将清扫工作持之以恒,制度化,公开化。还有,找到垃圾内容产生的源头并堵住它。比如修补网站程序,阻止AD群发软件的登录;从一开始就禁止灌水、AD、枪
稿,防止成为风气导致这一现象的蔓延,创造一个没有污染的网站。请参考“破
窗理论”。

第五个S:SHITSUKE(修养)

涵义:网站管理人员一言一行体现自身的修养,代表网站形象,对管理工作负责,对用户负责。要发扬团队精神,严格执行规定。

管理团队成员要养成好的习惯,这一点非常重要,养成不好的习惯,再扭转就比较困难。把网站管理工作持之以恒的做好,团队每一个人都要养成良好的习惯。要有内心的认同、自觉遵守规定。在网络这个浮躁的大环境下,很多人好的习惯没有养成,却养成了虎头蛇尾的习惯,做事三分钟热度,使管理工作不能有序进行。所以,做为网站管理团队成员,应该知道自己必须要做的事,养成好的习惯,做一个优秀的人。无数的收获都在你的奉献之后,未来的收获有很多并不在你的预期之中。

第六个S:Shikoku(坚持)
关于“坚持”的理论意义,王义辉已单独成篇进行阐述,这里不再重复了,总之,理论最终还要落实到执行上,并且要每个人持之以恒的坚持下去,才能逐渐见到成效。

王义辉认为,做个网站就赚钱的年代是不存在的,有流量就能赚钱年代仍在持续,所以,很多网站盲目的扩充栏目、大量的采集内容,希望增加被搜索引擎索引数量而增加流量,却不注重网站质量和核心竞争力的打造,导致很多垃圾站的出现,随着网络
的发展,网络上的很多领域必将出现同类网站过剩,供大于求的局面,搜索引擎这时也会对收录的网站变得苛刻和挑剔,不少网站会在网络时代的快速发展中败下阵来,
随着网络的规范和发展,靠过去的思路发展的网站即时勉强坚持,其收入也将会不断缩水,不具备竞争优势的网站在网络经济的大潮中被淘汰是必然的,各位网站经营者务必清醒的看到这一现实。

目前很多网站将面临严峻挑战,如果仍然以短期利益为主,则失去竞争力是必然的,如果想做为一项事业、长远经营的话,必须要有产品的观念,至少要把你的网站当作你经营的独特产品,注重产品的独特性,高品质,服务的贴近性,灵活性等等,才有长久生存和发展的空间。

提高网站的品质,王义辉刚才提到的6S是最基础的工作。如果能够找到到最精准的定位,实现最专业的品质,最快的响应速度,最贴心的服务,最灵活的工作方式、最合理的价格,网站就会跃上新的台阶。

收藏: QQ书签 del.icio.us 订阅: Google 抓虾