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即可

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