正在学的
1.《操作系统》王道
2.《数据结构》
3.mfc程序设计
///
今天学了mfc程序设计和数据结构
mfc笔记如下
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;
}