2023年MFC学习笔记.pdf
《2023年MFC学习笔记.pdf》由会员分享,可在线阅读,更多相关《2023年MFC学习笔记.pdf(150页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 一 课 1.M FC生 成 的 C+源 文 献 中 都 有 StdAfx.h,此 文 献 包 含 了 常 用 的 A F X 函 数 的 声 明,其 中 有 a fx w in.h,此 文 献 包 含 了 CR ECT,CP。i n t,C Wn d 等 许 多 类 及 其 方 法 的 声 明。2.Pro ject-S e tting-D ebug可 以 加 入 命 令 行 参 数。3.在 SDK 中 要 力 口 入 wind o ws.h和 s t di o.h。由 于 LoadCur s or,Mes s age Box 等 函 数 的 声 明 在 这 个 文 献 中。4.创 建 一
2、个 完 整 的 窗 口 的 四 个 环 节 SDK,1设 计 窗 口 类,2注 册 窗 口 类,3创 建 窗 口,4 显 示 窗 口 5.函 数 名 可 以 代 表 函 数 代 码 的 首 地 址,即 可 作 为 函 数 指 针。6.要 查 看 V C数 据 类 型,可 以 在 M S D N中 输 入“BOOL”然 后 选 择“DA TA TY PE”。7.ato f 将 字 符 串 转 化 为 f l oat,ato i 将 字 符 串 转 化 为 in t 型。8.所 有 从 C W nd类 派 生 的 类 都 有 m_hWn d 句 柄。9.变 量 的 生 命 周 期:可 以 认 为
3、出 了 包 含 它 的 大 括 号,这 个 变 量 的 生 命 周 期 结 束。所 以 全 局 变 量 的 声 明 位 于 所 有 大 括 号 之 外。但 是 用 n e w 声 明 的 变 量 和 用 s t a t i c 声 明 的 变 量 除 外。10.S D K示 范 程 序,见 下 面。1 l.sprin t f 格 式 化 字 符,其 头 文 献 为 std i o.h,在 M F C 中 格 式 化 字 符 用 C S t r i ng.Format1 2.GetD C()与 R e le a s e D C()要 成 对 使 用,否 则 会 内 存 泄 漏。同 样,B e g
4、 in Paint。与 E nd Pain t()o1 3.G etS tockO b J e c t()得 到 画 笔、画 刷、字 体、调 色 板 的 句 柄,使 用 时 必 须 用 类 型 转 换。1 4.什 么 时 候 用 N U L L,什 么 时 候 用 0.答,对 指 针 赋 值 时 用 N U L L,对 变 量 赋 值 时 用 0.15.什 么 是 野 指 针?答:将 指 针 指 向 的 变 量 的 内 存 释 放 后,此 指 针 即 变 成 野 指 针!如 何 避 免 野 指 针?答:将 此 指 针 指 向 N U L L即 可。p=NULL;16.SDK代 码 流 程:#i
5、ncl u de wind o w s.h 包 含 头 文 献 L o ad C ursor,TextOu t 等 函 数#i nclud e n s tdio.h*/包 含 sp r i n t f,pri n tf 等 函 数 LRE SULT CALLBACK MyProc(.);声 明 回 调 函 数 int WIN API W i nMai n()!W NDCLAS S wnd c Is;/设 计 窗 口 类 wnd c 1 s.h cursor=Lo a dCur s o r();/初 始 化 RegisterC 1 ass(&wndcls);注 册 窗 口 类 hwnd=Cr e
6、 ateWin d ow(.);创 建 窗 口 ShowWi n dow(显 示 窗 口 UpdateWind o wMSG msg;/定 义 消 息 结 构 体 while(GetMe s s a g e(.)消 息 循 环()r e turn 0;)LRESU LT CA LLB A CK My P ro c()实 现 回 调 函 数(switch(uMs g)(c a s e WM_CHA R:brea k;第 2课 1.定 义 结 构 体 和 类 时 别 忘 掉 在 最 后 加 入;号!例 如 Class Po i n tin t x;i n t y;2.#i ncl u d e V
7、x x x.h 与#inclu d e xxx.h的 区 别:不 查 找 运 营 时 目 录,查 找 运 营 时 目 录!3.类 的 定 义 中,假 如 未 指 明 成 员 类 型,则 缺 省 为 p riv ate.而 结 构 体 中 则 缺 省 为 public.4.引 用:引 用 经 常 用 在 函 数 的 传 参 上。此 外 数 值 互 换 函 数 也 经 常 用 引 用。例 c ha n ge(i n t&x,i nt&y)int temp;t e mp=x;x=y;y=x 调 用 时 即 可 以 用 in t a=3;intb=4;change(a,b);一 般 不 用 指 针 来
8、 作 为 参 数 进 行 数 值 互 换。由 于 会 引 起 歧 义。5.通 常 将 类 的 定 义 放.h 文 献,而 将 其 实 现 放 在 c p p文 献 中,别 忘 掉 了 在 c p p文 献 中#inc 1ude xxx.h 6.如 何 防 止 类 的 反 复 定 义?用#innd e f P o i#define P o i n t _H_Hclass P o in t;#endi f 来 防 止 7.源 文 献 cpp文 献 单 独 编 译 成。b j文 献。最 后 由 链 接 器 将 与 将 要 使 用 到 的 C+标 准 库 类 链 接 成 exe文 献,头 文 献 不
9、参 与 编 译。所 以 在 c p p文 献 中 别 忘 掉 了 加 入#i nclud e x xx.h 8.函 数 的 覆 盖,在 子 类 中 重 写 父 类 的 函 数,此 时 采 用 初 期 绑 定 的 方 法。假 如 加 入 了 vi r tu a l,则 将 采 用 迟 绑 定 的 技 术,在 运 营 时 根 据 对 象 的 类 型 拟 定 调 用 哪 一 个 函 数。此 迟 绑 定 技 术 是 M FC的 类 的 继 承 的 精 髓。9.强 制 类 型 转 换。假 如 CFi s h 从 CA n im al派 生 而 来。则 可 以 将 鱼 的 对 象 转 换 为 CA nim
10、a l的 对 象,而 反 之 则 不 行。从 现 实 中 理 解 也 是 正 常 的,鱼 可 以 是 动 物,而 动 物 却 不 是 鱼。再 如 in t可 以 强 制 转 换 成 char型。而 反 之 则 犯 错。第 3课1.在 m ai n 或 W in Ma i n 之 前,全 局 变 量 已 经 被 分 派 内 存 并 初 始 化 了。2.在 M F C中 在 W i n M ain之 前 有 个 theA p p 全 局 变 量 先 被 构 造 并 被 初 始 化,而 由 于 子 类 构 造 函 数 执 行 前,其 父 类 的 构 造 函 数 先 被 执 行,所 以 CT e st
11、A pp的 父 类 CW inAPP的 构 造 函 数 先 执 行。产 生 了 theApp对 象 后,在 WinMain()中 的 指 针*p Thre a d 和*pA pp就 有 了 内 容。3.M F C大 体 流 程:C T e s tApp t h eApp;/构 造 全 局 对 象 W inM ain()(AfxWi n M a in();调 用 下 面 的 函 数)A f xWinMain()!pT h r e a d-In i tin s t anc e();/初 始 化 工 作 和 注 册 窗 口 类,窗 口 显 示 和 更 新 p T h read-R u n();/消
12、息 循 环)而 在 B O O L CT e s tApp:Ini t Inst a n c e()中 的 代 码 C S i ng 1 eDocTemplat e*pDocTemp 1 ate;pDoc T emp 1 ate=new CSing 1 e D ocTem p late(ID R _M A IN FR A M E,RUNT I ME_CLAS S(C TestD o c),RUNTIME_C L A S S(CM a in F ram e),/mai n SD I frame wind o wRUNTIME_C L A S S(C T est V iew);A d dDocT
13、e mpl a t e(p DocT e mpl a t e);完 毕 了 将 这 三 个 类 关 联 起 来 的 工 作。4.如 何 在 单 文 档 文 献 中 显 示 一 个 C Button的 对 象?在 CMainFrame:O n Creale()中 定 义 一 个 CB u t ton 的 对 象 bln;然 后 调 用 b t n.Create(维 新,W S _D IS A B L E D|WS_CHILD|W S.VISIBLE|BS_A U TO 3STA TE,C R e c t(0,0,3 0 0,1 00),/*G etP a r e n t(),*/this,12
14、3);注 意 点:(1).此 处 b t n 不 能 是 局 部 变 量,否 则 它 的 生 命 周 期 太 短,将 不 能 显 示。(2).在 e re a t e函 数 的 第 二 个 参 数 中 加 入 W S_V IS I B L E参 数 才 行。否 则 必 须 调 用 Sh o w Win d ow也 可 以 在 v i e w 的 O n C re a te消 息 响 应 函 数 中 加 入(3).CB u 11 o n 类 的 定 义 头 文 献 在 af x w i n.h中,而 st d a f x,h包 含 了 a f x win.h,所 以 可 以 直 接 使 用。由
15、于 M FC中 的 每 一 个 类 中 都 有#i n c 1 ude”stdafx.h”的 声 明。第 4 课 1.在 单 文 档 中 view挡 在 Mai n Fr a m e的 前 面。此 时 假 如 编 写 针 对 Ma i n F r a m e的 m ouseClic k 事 件,将 不 会 有 反 映。2.消 息 响 应 会 在 3 处 修 改 代 码,1处 是 在 头 文 献 中,/AFX_MSG(CD r a w Vie w)a f x _msg void 0 nLButto n D own(U I NT n Flag s,C P oin t poi n t);a仅 msg
16、 void OnLButtonUp(U I NT n F 1 a g s,CP o int p oin t);a fx_msg v oid OnMo u seM o v e(U I N T nFl a gs,CPoi n t point);/AFX_M S GD E C LAR E _MESS AGE_MA P()另 一 处 是 c pp 文 献 的 b egi n Mess a g eM ap 和 End Mess a g e Map 之 间,BEGIN_MESSAGE_MA P(CDr a wV i e w,CView)/AFX_MSG_M A P(CDrawV i ew)0 N_W M_
17、L B U T TONDOW N()ON_W M _LBUTT ONUP()ON WM MOUSEMOVE()/AFX_M SG_M AP/St a nda r d printi n g commandsON_COMMAND(I D _F ILE_PR I NT,CView:OnFileP r i n t)ON_C O M M A N D(ID _ F IL E _ P R I N T_DIR E CT,CVie w:On F ile P r i n t)0 N _C O M M A N D(ID _F IL E _P R IN T _P REVIEW,CView::0 nFilePrintP
18、rev i e w)END_MESS AGE_M AP()最 后 是 要 有 函 数 实 现 的 代 码。vo i d C Draw View::OnLB u t t onD o wn(UINT nF lags,CPoint point)(/TO D Add y o u r m e s sage hand 1 er c od e h e r e a n d/or call defaultm_ p tOrigi n=m _ p tO 1 d=p o int;m_ b D ra w=T RUE;C View:OnLB u ttonDown(n F 1 ags,point);)3.画 线:定 义 一
19、 个 成 员 变 量 保 存 m o u s eDown的 点 m_Po i n t1)A P I函 数 方 法 画 线 用 HDC2)用 C D C类 成 员 函 数 画 线。此 时 别 忘 掉 Releas e DC3)用 CC1 i entDC4)用 C W indow D C,用 它 甚 至 可 以 整 个 屏 幕 区 域 画 线。下 面 是 上 面 4 种 方 法 的 代 码/*HDC hdc;hdc=:GetDC(m_h W n d);Mov e T o Ex(hdc,m_ p tOrigin.x,m_ptOrig i n.y,N U L L);Li n e T o(h d c,p
20、 o i n t.x,p o in t.y);::R e I e aseDC(m _ h W n d,hd c);必 须 成 对 使 用。*/*CDC*pDC=Ge t DC();pD C-Move T o(m_ p t Or i gin);pDC Li n eT o(poin t);R e le a s e D C(p D C);必 须 成 对 使 用。*/CClie n t DC d c(th is);/*CClie n tDC dc(GetP a rent();d c.M o ve To(m_ p t O r ig i n);de.LineTo(p o i n t);此 处 不 需 要
21、Release D C,由 于 C C li e n tD C 会 自 动 释 放 DC*/CWin d owDC dc(t his);/C Windo w DC d c(GetPare n t();/*CWi n dowDC dc(G e t Des k topWindow();/此 时 可 以 在 整 个 屏 幕 上 画 线。de.Mo v e To(m_ p 10 rigin);de.Lin e T o(po i n t);*/*CPen pen(P S _ D O T,1,RGB(0,255,0);CC1 i entDC d c(th i s);CP e n*p 01 d Pen=d
22、c.S elect O b j e c t(&p en);d c.M o v eTo(m_ p(Origin);dc.L i neTo(p o int);de.Sei e c tO b j e c t(p 0 IdPe n);*/5)用 Bitma p 填 充 所 画 的 矩 形。CBitmap b i tma p;b i t map.Loa d Bitmap(ID B _ BITMAP1);C B r u sh b r u sh(&b i tmap);CClientDC de(t h i s);dc.FillR e ct(CRect(m_ p tOrigin,poi n t),&brush)
23、;/C B R U S H:FromH a n d l e 是 静 态 成 员 函 数,所 以 可 以 用 下 面 的 方 法 调 用。CBr u s h*p B r ush=CBru s h::F r om H a n die(H B RUSH)GetStoc k Obje c t(N U LL _ B R U S H);C Bru s h*p O 1 dBrus h=dc.S e l e c tObject(pBrus h);d c.Rect a n g le(C Rec t(m_ptOrig i n,point);d c.S ele c tOb j ec t(p 0 IdBru s h)
24、;m _b D r aw=FALS E;6)用 其 它 颜 色 画 线 C ClientDC d c(t hi s);C Pe n p e n(P S _ S O L ID,l,R G B(255,0,0);CP e n*pOldP e n二 dc.SelectObject(&pe n);选 中 红 色 画 笔 if(m_b D raw=TRU E)(d c.SetROP 2(R2_BLACK);设 立 绘 画 模 式 dc.MoveTo(m_p t Ori g in);/dc.LineTo(p o i n t);d c,Lin e To(m_ptOl d);/dc.MoveTo(m_ptOr
25、i g i n);dc.Mov e T o(m_ptO 1 d);dc.LineTo(point);/m_ptOrigin=po i nt;m_ptOld=point;)d c.S e 1 ectObje c t(pOldPe n);4.M FC中 隐 式 的 包 含 了 w i ndows.h。为 什 么?由 于 在 A FX V _W 32.h文 献 中:/This i s a p ar t o f t h e M i cro s o ft F oun d atio n Clas s es C+1 i b rary./Copy r ig h t(C)1 992 1 9 98 Micro s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 MFC 学习 笔记
限制150内