Day_02学习记录

正在学的

1.《操作系统》王道

2.《数据结构》

3.mfc程序设计

///

今天学了mfc程序设计和数据结构

mfc笔记如下

Day_02学习记录

Day_02学习记录

MFC工具栏

一般地,工具栏和菜单是相互绑定的。至于为什么是这样,因为点击他们发出的都是WM_COMMAND消息 低16位是ID,如果在资源管理器中写这两个控件的ID一致,那么无论点那个都是会发送一样的消息,所以一样。但是本质山其实她两没哈关系,如果想不一样也不是不可以。

相关的类

CToolBar

添加步骤

首先vs自带资源编辑器,编辑(画好)工具栏的形状,确定ID,添加rescourse头文件。

然后记住 在CMyFrameWnd框架类中new 这个类。延长声明周期,然后成员函数Create(),把参数填进去即可,注意,这属于子窗口控件,所以WS_VISIBLE WS_CHILD 什么的也不能少。

然后成员函数LoadToolBar(&toolbar);即可挂载上工具栏。

其他特性

工具栏一大特性是停靠(Docking)特性,即拖动工具栏放到任意位置

想要实现这个功能,首先添加新风格,CBRS_GRIPPER 

然后,CToolBar::EnableDocking(PARAM); 有一个参数,参见msdn //工具栏想要停哪

CFrameWnd::EnableDocking(PARAM);有一个参数 参见msdn 这个是工具栏可以停哪

CFrameWnd::DockControlBar(&toobar,param);暂时停哪

#include <afxwin.h>
#include "resource.h"
#include <afxext.h>//工具栏类
class CMyFrameWnd :public CFrameWnd{
	DECLARE_MESSAGE_MAP()
public:
	CToolBar toolbar;
	void OnNew();
	int OnCreate(LPCREATESTRUCT ls);
	void OnSet();
};
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
	ON_COMMAND(ID_NEW,OnNew)
	ON_COMMAND(ID_SET, OnSet)
	ON_WM_CREATE()
END_MESSAGE_MAP()
int CMyFrameWnd::OnCreate(LPCREATESTRUCT ls) {
	toolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP|CBRS_GRIPPER);
	toolbar.EnableDocking(CBRS_ALIGN_ANY);//那都可以停
	this->EnableDocking(CBRS_ALIGN_ANY);//想停哪停哪
	this->DockControlBar(&toolbar, AFX_IDW_DOCKBAR_BOTTOM);
	toolbar.LoadToolBar(IDR_TOOLBAR1);
	return CFrameWnd::OnCreate(ls);
}
void CMyFrameWnd::OnNew() {
	AfxMessageBox("Menu Click!");
}
void CMyFrameWnd::OnSet() {
	AfxMessageBox("Set Click!");
}
class CMyWinApp : public CWinApp {
	virtual BOOL InitInstance() {
		CMyFrameWnd* pFrame = new CMyFrameWnd;
		pFrame->Create(nullptr, "mfctoolbar", WS_OVERLAPPEDWINDOW, CFrameWnd::rectDefault, NULL, (CHAR*)IDR_MENU1);
		m_pMainWnd = pFrame;
		pFrame->ShowWindow(SW_SHOW);
		pFrame->UpdateWindow();
		return TRUE;
	}

};
CMyWinApp theApp;

MFC六大特性之动态创建机制和运行时信息机制 了解

MFC视图

其实就是一个窗口去掉标题栏 周围的东西,因为MFC受到c++面向对象的特点,把显示东西的功能单独抽象成一个类,就是视图类。

相关类

CView

包含视图和与文档交互操作

视图的使用

先定义自己派生自CView的类,首先重写虚函数OnDraw;

然后再处理WM_CREATE消息时,定义CMyView对象,调用函数Create窗口窗口。

窗口倒数第二个是视图ID,填写AFX_IDW_PANE_FIRST使视图填充整个窗口。

​
#include <iostream>
#include <afxwin.h>
#define FIRST 1
class CMyView : public CView {
	virtual void OnDraw(CDC* pDC){
		//Cview是抽象类
	}
};

class CMyFrame :public CFrameWnd {
	virtual LRESULT WindowProc(UINT msg, WPARAM wparam, LPARAM lparam) {
		PAINTSTRUCT ps = { 0 };
		CMyView* pView = new CMyView;
		HDC hdc;
		switch (msg)
		{
		case WM_PAINT:
			hdc = ::BeginPaint(this->m_hWnd, &ps);
			TextOut(hdc, 0, 0, "Frame_fuck111111111111111111you!",45);
			EndPaint(&ps);
			break;
		case WM_CREATE:
			//NEW 延长生命周期
			pView->Create(NULL, "MFCVIEW", WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(0, 0, 200, 200), this, AFX_IDW_PANE_FIRST);
			//AFX_IDW_PANE_FIRST改成这个ID  视图窗口就会平铺
			break;
		default:
			break;
		}
		return CFrameWnd::WindowProc(msg, wparam, lparam);
	}
};
class CMyWinApp :public CWinApp {
	virtual BOOL InitInstance() {
		CFrameWnd* pFrame = new CMyFrame;
		pFrame->Create(nullptr, "view");
		m_pMainWnd = pFrame;
		pFrame->ShowWindow(SW_SHOW);
		pFrame->UpdateWindow();
		
		return true;
	}
};
CMyWinApp theApp;

​

上面我是用覆写框架函数的WindowProc完成的

《数据结构》

学了顺序(顺序

)表的特征,优点,缺点,存储方式,以及用c实现他的一些简单算法

注意插入算法频度n/2 删除频度n-1/2,还有查找,是从头开始遍历的。

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define LIST_SIZE 100
typedef struct {
	int first;
	int second;
}ElemType;
typedef struct {
	ElemType* elem;
	int length;
	int listsize=LIST_SIZE;
	
}SqList;
int InitList(SqList& L) {//初始化 
	L.elem = (ElemType*)malloc(LIST_SIZE * sizeof(ElemType));
	L.length = 0;
	return OK;
}
void Destroy(SqList& L) {
	if (L.elem) free(L.elem);
}
void ClearList(SqList& L) {
	L.length = 0;
}
int GetLength(SqList L) {
	return L.length;
}
bool IsEmpty(SqList L) {
	if (L.length) return 1;
	return 0;
}
int GetElem(SqList L, int i, ElemType& e) {//取第i个元素
	e = L.elem[i];
	return OK;
}//算法时间复杂度 O(1) 常量阶 这是顺序表的一个好处 链式表就不一样了
几个比较重要的算法
//最简单的查找方法 顺序查找法
int FindList(SqList L, int target) {//顺序查找算法
	int pos = -1;
	for (int i = 0; i < L.length; i++) {
		if ((L.elem[i]).first == target) { pos = i; return pos; }
	}// N(N+1)/N*2  T(n)=O(n) 平均查找长度
	return pos;
}
//插入算法
//在某个位置插入 而且长度要更改
bool InsertList(SqList& L,int index,ElemType e) {
	//具体要看他插入在哪
	//考虑异常情况 插入在规定序列 或者已经满了
	//要把插入位置空出来 将从i->n个位置依次往后移动
	//然后放进去 长度加一
	//1.判断插入位置是否合法
	if (index<1 || index>L.length + 1) return -1;
	for (int j = L.length; j >= index; j--) {
		L.elem[j + 1] = L.elem[j];//般元素 Σ
		//移动多少次取决与我们插入的位置 也是O(n) 
	}
	L.length++;
	L.elem[index] = e;
	return OK;//此算法的时间复杂度也要考虑平均情况 n/2  O(n)
}
bool DeleteList(SqList& L, int i) {
	//删除也要考虑他在哪 必须从前往后往前补 前驱后继不能变
	//然后元素个数减一
	for (int j = i; j <= L.length - 1; j++) {
		L.elem[j] = L.elem[j+1];
	}
	L.length--;
	return OK;  //删除的时间复杂度是(n-1)/2 至于为啥比插入少1 因为它最多就移动n-1次
}
//查删减时间复杂度都是O(n)空间复杂度都是S(n)
int main() {

	return 0;
}

上一篇:爬虫学习笔记 Day 6 + 记录遇到的小问题


下一篇:第四天day