MFC操作

如何在vs中新建一个MFC Application项目:
http://jingyan.baidu.com/album/3ea51489cd23d352e71bba71.html?picindex=4
http://www.jizhuomi.com/school/c/190.html

插入符的显示
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

int CMFCApplication1_5View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

//创建设备描述表
CClientDC dc(this);
//定义文本信息结构体变量
TEXTMETRIC tm;
//获得设备描述表中的文本信息
dc.GetTextMetrics(&tm);
//根据字体大小,创建合适的插入符
CreateSolidCaret(tm.tmAveCharWidth/8, tm.tmHeight);
//显示插入符
ShowCaret();

return 0;

}
//插入符随鼠标的移动
void CMFCApplication1_5View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetCaretPos(point);//插入符移动到鼠标左键单击处

m_strLine.Empty();//清空内容
m_ptOrigin = point;//保存鼠标的座标值
CView::OnLButtonDown(nFlags, point);

}

如果希望输入的图形或者文字始终都在窗口上显示的话,就应该在OnDraw里面操作
void CMFCApplication1_5View::OnDraw(CDC* pDC)
{
CMFCApplication1_5Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CString str(“11111111111111111”);
pDC->TextOut(0,0,str);

if (!pDoc)
	return;

// TODO: add draw code for native data here

}

//设置可以在视图框中输入的功能
CMFCApplication1_5View::CMFCApplication1_5View()
{
// TODO: add construction code here
m_strLine = “”;
m_ptOrigin = 0;
m_nWidth = 0;
}
void CMFCApplication1_5View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//设置可以在视图框中输入的功能
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if (0x0d == nChar)
{
m_strLine.Empty();
m_ptOrigin.y += tm.tmHeight;
}
else if (0x08 == nChar)
{
COLORREF clr = dc.SetTextColor(dc.GetBkColor());//这个函数将会返回文本先前的颜色
dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);
dc.SetTextColor(clr);
}
else
{
m_strLine += (TCHAR)nChar;
}

//设置插入符随字符的输入而移动的功能
CSize sz = dc.GetTextExtent(m_strLine);//GetTextExtent函数就可以得到字符串的宽度
CPoint pt;
pt.x = m_ptOrigin.x + sz.cx;
pt.y = m_ptOrigin.y;
SetCaretPos(pt);


dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);

CView::OnChar(nChar, nRepCnt, nFlags);

}

AfxMessageBox((“click”));
错误 error C2665: ‘AfxMessageBox’ : none of the 2 overloads could convert all the argument types
解决方法:
AfxMessageBox(_T(“click”));

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//设置某个菜单项复选
GetMenu()->GetSubMenu(0)->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);
//GetSubMenu找到子菜单的作用
//MF_BYPOSITION表示根据索引号来访问菜单项
//MF_CHECKED设置菜单项的复选标志

GetMenu()->GetSubMenu(0)->SetDefaultItem(1, TRUE);//设置某个菜单项变粗
//设置禁用菜单项
GetMenu()->GetSubMenu(0)->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED);

SetMenu(NULL);//移除当前的菜单
//重新装载菜单
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
menu.Detach();//将菜单句柄与菜单对象分离

//在子菜单中添加菜单
CMenu menu1;
menu1.CreateMenu();
menu1.AppendMenu(MF_POPUP, (UINT)menu1.m_hMenu, _T("Hello33"));
//在已有的菜单项目中插入 菜单项目
GetMenu()->InsertMenu(2, MF_POPUP | MF_BYPOSITION, (UINT)menu1.m_hMenu, _T("Hello1"));
menu1.Detach();

//根据位置索引并删除它
GetMenu()->GetSubMenu(2)->DeleteMenu(0, MF_BYPOSITION);
return 0;

}

void CTestDlg::OnClickedBtnAdd()
{
// TODO: Add your control notification handler code here
int num1, num2, num3;
num1 = GetDlgItemInt(IDC_EDIT1);//获得静态文本框对象
num2 = GetDlgItemInt(IDC_EDIT2);

num3 = num1 + num2;

SetDlgItemInt(IDC_EDIT3, num3);//设置静态文本框对象

}

error C2664: ‘void CWnd::SetDlgItemTextW(int,LPCTSTR)’ : cannot convert argument 2 from ‘const char [7]’ to ‘LPCTSTR’
SetDlgItemText(IDC_BUTTON1, “收缩<<”);改为SetDlgItemText(IDC_BUTTON1, _T(“收缩<<”));
或者在新建项目时,把使用UNICODE字符集取消

//如果希望在程序窗口创建之前修改他的外观和大小,在此函数中修改
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~FWS_ADDTOTITLE;
cs.lpszName = _T(“http://www.tonghao.com”);//修改文档的标题
}

如果出现这种错误:
strResult.Format("%d","%c,%f,%s",i,ch,f,str);
error C2664: ‘void ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::Format(UINT,…)’ : cannot convert argument 1 from ‘const char [3]’ to ‘const wchar_t *’ d:\test\mfcapplication13_1\mfcapplication13_1\mfcapplication13_1view.cpp 117 1 MFCApplication13_1
改正后:
将项目的格式转化为multi-byte;
//向文件中写入数据
void CMFCApplication13_1View::OnFileWrite()
{
// TODO: Add your command handler code here
//构造CFile文件对象
CFile file(_T(“1.txt”),CFile::modeCreate | CFile::modeWrite);
//构造存档对象
CArchive ar(&file,CArchive::store);
int i = 4;
char ch = ‘a’;
float f = 1.3f;
CString str(_T(“http://www.sunxin.org”));
//保存数据
ar << i << ch << f << str;

}
//向文件中读出数据
void CMFCApplication13_1View::OnFileRead()
{
// TODO: Add your command handler code here
//构造CFile文件对象
CFile file(_T(“1.txt”),CFile::modeRead);
//构造存档对象
CArchive ar(&file,CArchive::load);
int i;
char ch;
float f;
CString str;
CString strResult;
//读取数据
ar >> i >> ch >> f >> str;
strResult.Format(_T("%d"),"%c,%f,%s",i,ch,f,str);
//将读取的数据显示出来
MessageBox(strResult);
}

//当自己写一个响应函数的时候
afx_msg void OnFileWrite();//afx_msg表明该标识符表示这个函数确实是一个菜单命令消息响应函数
ON_COMMAND(IDM_FILE_WRITE, &CMFCApplication13_1View::OnFileWrite)
void CMFCApplication13_1View::OnFileWrite()

//当出现这种问题的时候
void CChatDlg::OnSock(WPARAM wParam,LPARAM lParam){}
error C2440: ‘static_cast’ : cannot convert from ‘void (__thiscall CChatDlg:😗 )(WPARAM,LPARAM)’ to 'LRESULT (__thiscall CWnd:😗 )(WPARAM,LPARAM)
改正:
afx_msg LRESULT OnSock(WPARAM, LPARAM);
ON_MESSAGE(UM_SOCK,&OnSock)
LRESULT CChatDlg::OnSock(WPARAM wParam, LPARAM lParam)

新建一个由菜单响应对话框:
1.新建一个对话框的类大致代码:
Dlg.h
#pragma once
#include “afxwin.h”
#include “Resource.h”
class CTestDlg :public CDialog
{
public:
CTestDlg(CWnd* pParent = NULL); // standard constructor
enum { IDD = IDD_DIALOG1 };
};

Dlg.cpp
#include “stdafx.h”
#include “TestDlg.h”

CTestDlg::CTestDlg(CWnd* pParent /=NULL/)
CDialog(CTestDlg::IDD, pParent)
{
}
2.新建一个菜单项(由视图类进行捕获),并且由这个菜单项添加一个响应函数(注意菜单项的ID和对话框的ID号必须一致)

error c4996: ‘fopen’: This function or variable may be unsafe
解决方法:项目 =》属性 =》c/c++ =》预处理器=》点击预处理器定义,编辑,加入_CRT_SECURE_NO_WARNINGS。

chart *pBuf;
strcpy(pBuf,str);
error C2664: “strcpy”: 不能将参数 1 从“TCHAR [100]”转换为“char *”
解决方式:wchar_t *pBuf;
wcscpy(pBuf,str);
并在stdafx.h里面加
#define _CRT_SECURE_NO_DEPRECATE

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

还有一种简单的办法,在头文件中包含string.h即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章