MFC_基本知识

1.创建窗口的四大步骤(这是必须掌握的)  整体框架

  1. 设计窗口类
  2. 注册窗口类
  3. 创建窗口
  4. 显示窗口
#include "windows.h"//包含头文件 LoadCursor,TextOut 等函数
#include "stdio.h"//包含 sprintf,printf 等函数
LRESULT CALLBACK MyProc(...);//声明回调函数
int WINAPI WinMain()
{
WNDCLASS wndcls;//设计窗口类
wndcls.hcursor=LoadCursor();//初始化
....
RegisterClass(&wndcls);//注册窗口类
hwnd=CreateWindow(...);//创建窗口
ShowWindow(..);//显示窗口
UpdateWindow(..);
MSG msg;//定义消息结构体
while(GetMessage(...))//消息循环
{
...
}
return 0;
}
LRESULT CALLBACK MyProc(...)//实现回调函数
{
switch(uMsg)
{
case WM_CHAR:
break;
...
}
}

2.基本概念

变量的生命周期:可以认为出了包含它的大括号,这个变量的生命周期结束。所以全局变量的声明位于所有大括号之外。但是用 new 声明的变量和用 static 声明的变量除外

野指针:将指针指向的变量的内存释放后,此指针即变成野指针!如何避免野指针?答:将此指针指向 NULL 即可。p=NULL;

#include <xxx.h>与#include "xxx.h"的区别:<>不查找运行时目录,""查找运行时目录!

3.如何防止类的重复定义?

  用#inndef Point_H_H
  #define Point_H_H
  class Point{};
  #endif 来防止

4.强制类型转换注意事项

  强制类型转换。 如果 CFish 从 CAnimal 派生而来。 则可以将鱼的对象转换为 CAnimal 的对
象,而反之则不行。从现实中理解也是正常的,鱼可以是动物,而动物却不是鱼。再如 int
可以强制转换成 char 型。而反之则出错

5.在 main 或 WinMain 之前,全局变量已经被分配内存并初始化了。

6 MFC 大致流程

CTestApp theApp;//构造全局对象
WinMain()
{
AfxWinMain();//调用下面的函数
}
AfxWinMain()
{
pThread->Initinstance();//初始化工作和注册窗口类,窗口显示和更新
pThread->Run();//消息循环
}
而在 BOOL CTestApp::InitInstance()中的代码
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);
完成了将这三个类关联起来的工作

7.消息响应

 消息响应会在 3 处修改代码,1 处是在头文件中,
 1 2 //{{AFX_MSG(CDrawView)
 3 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
 4 afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
 5 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
 6 //}}AFX_MSG
 7 DECLARE_MESSAGE_MAP()
 8 另一处是 cpp 文件的 begin MessageMap 和 End MessageMap 之间,
 9 BEGIN_MESSAGE_MAP(CDrawView, CView)
10 //{{AFX_MSG_MAP(CDrawView)
11 ON_WM_LBUTTONDOWN()
12 ON_WM_LBUTTONUP()
13 ON_WM_MOUSEMOVE()
14 //}}AFX_MSG_MAP
15 // Standard printing commands
16 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
17 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
18 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
19 END_MESSAGE_MAP()
20 最后是要有函数实现的代码。
21 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
22 {
23 // TOD Add your message handler code here and/or call default
24 m_ptOrigin=m_ptOld=point;
25 m_bDraw=TRUE;
26 CView::OnLButtonDown(nFlags, point);
27 }

8.画线

 2 1)API 函数方法画线用 HDC
 3 2)用 CDC 类成员函数画线。此时别忘记 ReleaseDC
 4 3)用 CClientDC
 5 4)用 CWindowDC,用它甚至可以整个屏幕区域画线。
 1 画线:定义一个成员变量保存 mouseDown 的点 m_Point
 2 1)API 函数方法画线用 HDC
 3 2)用 CDC 类成员函数画线。此时别忘记 ReleaseDC
 4 3)用 CClientDC
 5 4)用 CWindowDC,用它甚至可以整个屏幕区域画线。
 6 下面是上面 4 种方法的代码
 7 /*HDC hdc;
 8 hdc=::GetDC(m_hWnd);
 9 MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
10 LineTo(hdc,point.x,point.y);
11 ::ReleaseDC(m_hWnd,hdc);必须成对使用。*/
12 /*CDC *pDC=GetDC();
13 pDC->MoveTo(m_ptOrigin);
14 pDC->LineTo(point);
15 ReleaseDC(pDC);必须成对使用。*/
16 //CClientDC dc(this);
17 /*CClientDC dc(GetParent());
18 dc.MoveTo(m_ptOrigin);
19 dc.LineTo(point);此处不需要 ReleaseDC,因为 CClientDC 会自动释放 DC*/
20 //CWindowDC dc(this);
21 //CWindowDC dc(GetParent());
22 /*CWindowDC dc(GetDesktopWindow());//此时可以在整个屏幕上画线。
23 dc.MoveTo(m_ptOrigin);
24 dc.LineTo(point);*/
25 /*CPen pen(PS_DOT,1,RGB(0,255,0));
26 CClientDC dc(this);
27 CPen *pOldPen=dc.SelectObject(&pen);
28 dc.MoveTo(m_ptOrigin);
29 dc.LineTo(point);
30 dc.SelectObject(pOldPen);*/
时间: 2024-10-13 23:57:52

MFC_基本知识的相关文章

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

前端里移动端到底比pc端多哪些知识?

前端里移动端到底比pc端多哪些知识,为啥面试时好多公司都问h5水平如何? 我做过几年的web前端开发,就简单谈谈自己的感受吧. 首先来看看PC端和移动端在前端开发上的一些区别: (1)PC考虑的是浏览器兼容性,移动端开发考虑的更多的是手机兼容性,因为目前不管是android手机还是ios手机,一般浏览器用的都是webkit内核,所以做移动端开发,更多考虑的应该是手机分辨率的适配,和不同操作系统的略微差异化: (2)在部分事件的处理上,移动端自然是偏向于触屏的,所以触屏事件的一些规律要多摸索一下,

linux入门基础知识及简单命令介绍

linux入门基础知识介绍 1.计算机硬件组成介绍 计算机主要由cpu(运算器.控制器),内存,I/O,外部存储等构成. cpu主要是用来对二进制数据进行运算操作,它从内存中取出数据,然后进行相应的运算操作.不能从硬盘中直接取数据. 内存从外部存储中取出数据供cpu运存.内存的最小单位是字节(byte) 备注:由于32的cpu逻辑寻址能力最大为32内存单元.因此32位cpu可以访问的最大内存空间为:4GB,算法如下: 2^32=2^10*2^10*2^10*2^2 =1024*1024*1024

认知,构建个人的知识体系(上)

1.前言 本文将聊聊我对构建个人知识体系的一些想法,主要是为了提升自我认知.从个人经历开始,谈谈对知识的划分,也就是一个是什么,为什么的过程. 2.缘起 把时间回到一年前,那时候我工作快一年了,得益于前面的一些努力,工作比较顺利.特别是技术上,没有遇到太多过无法解决的问题.同时也开始迷茫,工作难道就是这个轻松的样子?三五年之后那不是很无趣,该怎么办? 想找到这个问题的答案,而最好的方式莫过于,亲自去了解那些三五年工作经验的人是怎么的样子. 因此从那时候起,关注了不少来公司面试的人的简历,也有过几

知识汇总都在这里了,赶紧点开看看吧!

微信公众号:Web前端精髓 Web前端技术由html.css和JavaScript三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言.而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知识点,因此对于初学者很难理清楚整个体系的脉络结构. Web前端精髓是一个分享前端知识的平台,内容包括HTML.CSS.javascript 等和前端技术相关的一切,如果您想对前端有更多的了解,那就持续关注我们,目的是帮助大家审查自己的知识结构是否完善,希望我的文章对你们有

学习虚拟化技术需要掌握的知识与能力(未完成版)

我从1993年学习计算机,有过短期的C语言开发经历,现在主要从事网络与系统集成的工作.我可以算是学习计算机比较"早"的一批人了. 1993年的时候,我是从MS-DOS 3.30开始,直到最后的MS-DOS 6.22.Windows系统是从Windows 3.1(中文版)开始,再到Windows 3.11.Windows 95.98一直到现在的Windows 10. 组建Windows网络是在1996年河北省国税局全省联网,是从Windows NT 3.51开始,到后来的Windows

CentOS下的路由知识及配置路由

博文目录 简介 上一篇博文已经讲解了IP地址的配置,那么有IP,就准备开始进行通信吧,网络之间的通信主要是依靠路由器,当然生成环境中是拥有路由器的,但是系统中的路由配置也是需要了解一下地,今天讲解一下软路由的显现,与一个路由的小实验 linux下需要启用ip_forword 启用路由功能 echo 1 > /proc/sys/net/ipv4/ip_forword 一.路由表中的接口 到达目标网段从本路由器的那个接口能到达,这个借口就本路由的记录接口 1.如果目标网络和路由器直接相连,网关即是路

javascript必须知道的知识要点(二)

该文章不详细叙述各知识要点的具体内容,仅把要点列出来,供大家学习的时候参照,或者检测自己是否熟练掌握了javascript,清楚各个部分的内容. 内建对象可划分为数据封装类对象.工具类对象.错误类对象,如下. 数据封装类对象: Number对象 String对象 Boolean对象 Array对象 Object Function 工具类对象: Math对象 Date对象 RegExp对象 错误类对象: Error对象  Number对象 JavaScript 只有一种数字类型.Number,包括

关于H5框架之Bootstrap的小知识

浏览器支持 旧的浏览器可能无法很好的支持 Bootstrap 支持 Internet Explorer 8 及更高版本的 IE 浏览器 CSS源码研究 我们不是在head里面引入了下面这些文件么 <!-- 新 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css"> &l