快捷键与热键有何异同?
关键字快捷键热键
相同点是它们都是通过键盘来访问。不同点可以从用户和开发者两个方面来说明,下面以“粘
贴”功能为例。快捷键与热键有何异同?
关键字快捷键热键
相同点是它们都是通过键盘来访问。不同点可以从用户和开发者两个方面来说明,下面以“粘贴”功能为例。用户使用热键进行“粘贴”操作的步骤为先Alt+E,再P,用户使用快捷键进行“粘贴”操作的步骤是直接Ctrl+v。开发者修改热键相对简单,修改菜单标题就行了,如将“编辑(&E)”、“粘贴(&P)\tCtrl+V”改成“编辑(&A)”、“粘贴(&B)\tCtrl+V”,那么使用热键进行“粘贴”操作的步骤为先Alt+A,再B,修改快捷键需要修改快捷键资源,具体步骤如下:
一,进入资源视图,双击Accelerator展开快捷键资源。
二,双击“IDR_MAINFRAME”,再在右边的正文窗口中双击“ID_EDIT_COPY”项进行修改用户使用热键进行“粘贴”操作的步骤为先Alt+E,再P,用户使用快捷键进行“粘贴”操作的步骤是直接Ctrl+v。开发者修改热键相对简单,修改菜单标题就行了,如将“编辑(&E)”、“粘贴(&P)\tCtrl+V”改成“编辑(&A)”、“粘贴(&B)\tCtrl+V”,那么使用热键进行“粘贴”操作的步骤为先Alt+A,再B,修改快捷键需要修改快捷键资源,具体步骤如下:
一,进入资源视图,双击Accelerator展开快捷键资源。
二,双击“IDR_MAINFRAME”,再在右边的正文窗口中双击“ID_EDIT_COPY”项进行修改
如何给多维数组赋初值
关键字多维数组赋初值
如何给多维数组赋初值
问题提出:
十年前有人写如下代码:
char szData[6][10];
//...
memset(szData,0,6*10);
五年前,有人改了数组定义:
//char szData[6][10];
char szData[6][100];
前几天,我花了两天修改了一个Bug,错误的根源就在这。
问题分析:
由于数组的大小变小,使得只初始化数组的部分空间。
解决方法:
用sizeof函数取得数组空间。
具体代码如下:
class CData
{
public:
int x ;
};
CTest33View::CTest33View()
{
char szData[6][100];
int iSize = sizeof(szData);
memset(szData,0,iSize);
CString strMess ;
strMess.Format("\nchar占用%d个字节char szData[6][100]占用%d个字节\n",sizeof(char), sizeof(szData));
TRACE(strMess);
CData data[100] ;
iSize = sizeof(data);
memset(data,0,iSize);
strMess.Format("CData占用%d个字节CData data[100]占用%d个字节\n",sizeof(CData), sizeof(data));
TRACE(strMess);
}
输出区(OutPut)内容:
char占用1个字节char szData[6][100]占用600个字节
CData占用4个字节CData data[100]占用400个字节
按Ctrl键会引发几次按键消息
关键字Ctrl键按键消息
(一),新建一个单文档工程CtrlEg。
(二),为CCtrlEgView的WM_KEYDOWN消息和WM_KEYUP消息添加响应函数。具体代码如下:
void CCtrlEgView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
{
CString strMess ;
strMess.Format("CCtrlEgView::OnKeyDown nChar = %d nFlags = %x\n",nChar,nFlags); TRACE(strMess);
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CCtrlEgView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
{
CString strMess ;
strMess.Format("CCtrlEgView::OnKeyUp nChar = %d nFlags = %x\n",nChar,nFlags);
TRACE(strMess);
}
CView::OnKeyUp(nChar, nRepCnt, nFlags);
}
(三)只按Ctrl键,结果如下:
CCtrlEgView::OnKeyDown nChar = 17 nFlags = 1d
CCtrlEgView::OnKeyUp nChar = 17 nFlags = c01d
(四)按Ctrl+v,结果如下:
CCtrlEgView::OnKeyDown nChar = 17 nFlags = 1d
CCtrlEgView::OnKeyUp nChar = 17 nFlags = c01d
CCtrlEgView::OnKeyUp nChar = 86 nFlags = c02f
(五),删除“粘贴”命令的快捷键,具体操作是从快捷键资源IDR_MAINFRAME中删除项ID_EDIT_PASTE。再按Ctrl+v键,结果如下:
CCtrlEgView::OnKeyDown nChar = 17 nFlags = 1d
CCtrlEgView::OnKeyDown nChar = 86 nFlags = 2f
CCtrlEgView::OnKeyUp nChar = 17 nFlags = c01d
CCtrlEgView::OnKeyUp nChar = 86 nFlags = c02f
附:
#define VK_CONTROL 0x11
VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)
VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)
如何利用CHtmlView类实现IE"查看->源文件"命令?
关键字CHtmlView 查看源文件
一,新建一个单文档工程WatchSourceFile,视图类基于CHtmlView。
二,更改CWatchSourceFileView::OnInitialUpdate()函数,具体代码如下:
void CWatchSourceFileView::OnInitialUpdate()
{
CHtmlView::OnInitialUpdate();
Navigate2(_T("https://www.wendangku.net/doc/1f14891443.html,"),NULL,NULL);
}
三,在工具栏增加两个按钮ID_SEE1,IDD_SEE2,并在视力类为它们增加响应函数,具体代码如下:
#include "mshtml.h"
#include "atlbase.h"
void CWatchSourceFileView::OnSee1()
{
CString refString ;
CComPtrspDisp = GetHtmlDocument();
if ( spDisp )
{
HGLOBAL hMemory = GlobalAlloc(GMEM_MOVEABLE, 0);
if( NULL != hMemory )
{
CComQIPtrspPersistStream = spDisp;
if( spPersistStream )
{
CComPtr spStream;
if(SUCCEEDED(CreateStreamOnHGlobal(hMemory, TRUE, &spStream))) {
spPersistStream-> Save(spStream, FALSE);
LPCTSTR pstr = (LPCTSTR) GlobalLock(hMemory);
if( pstr )
{
refString = pstr;
AfxMessageBox(refString);
GlobalUnlock(hMemory);
}
::GlobalFree(hMemory);
}
}
}
}
}
VC中如何把一串文字旋转90度显示?
关键字文字旋转90度
一,新建一个单文档工程ChangeFont。
二,修改ChangeFontView::OnDraw函数,代码如下:
void CChangeFontView::OnDraw(CDC* pDC)
{
CChangeFontDoc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
CFont* pFont = pDC->GetCurrentFont();
LOGFONT logFont ;
pFont->GetLogFont(&logFont);
logFont.lfEscapement = 900 ;//900/10 = 90
HFONT hFont = CreateFontIndirect(&logFont);
pDC->SelectObject(hFont);
pDC->TextOut(200,200,"VC中如何把一串文字旋转90度显示的?");
}
三。msdn对lfEscapement的解释如下:
Specifies the angle, in tenths of degrees, between the escapement vector and the x-axis of the device.tenths是十分之一的意思,degrees是角度的意
思。所以参数900表示90度。
SetCapture可能影响快捷键
关键字SetCapture 快捷键
(一),新建一个单文档工程SetCaptureEg,视图类基于CEditView。
(二),经检验利用快捷键ctrl+v粘贴的功能正常。
(三),为CSetCaptureEgView的WM_KEYDOWN消息和WM_KEYUP消息添加响应函数。具体代码如下:
void CSetCaptureEgView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
SetCapture();
CEditView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CSetCaptureEgView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
ReleaseCapture();
CEditView::OnKeyUp(nChar, nRepCnt, nFlags);
}
(四)经检测,快捷键粘贴的功能已经失效,按住ctrl不放,多按几次v,还是可以粘贴的。(五)删除主菜单上的“粘贴”菜单项。
(六)经检验利用快捷键ctrl+v粘贴的功能正常。
如何知道鼠标进入及离开CHtmlView(或它的子类)?
关键字鼠标进入离开CHtmlView
如何知道鼠标进入及离开CHtmlView(或它的子类)?
(一),新建一个单文档工程HtmlCtrl,视图类基于CHtmlView。
(二),在#include 前,加一行代码#define _WIN32_WINNT 0x0400
(三),在CHtmlCtrlView中增加一个成员变量:bool m_bMouseOver,并在构造函数中赋初值为false。
(四),重写CHtmlCtrlView::PreTranslateMessage函数,代码如下:
BOOL CHtmlCtrlView::PreTranslateMessage(MSG* pMsg)
{
if( WM_MOUSEMOVE == pMsg->message )
{
if(!m_bMouseOver)
{
TRACE(_T("Mouse enter\n"));
m_bMouseOver = TRUE;
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = pMsg->hwnd;
tme.dwHoverTime = HOVER_DEFAULT;
::TrackMouseEvent(&tme);
}
}
else if( WM_MOUSELEA VE == pMsg->message )
{
TRACE(_T("Mouse Leave!\n"));
m_bMouseOver = FALSE;
}
return CHtmlView::PreTranslateMessage(pMsg);
}
先按ctrl再按A和先按A再按ctrl一样吗?
关键字ctrl A
不一样。
先按ctrl再按A,会先后产生两个WM_KEYDOWN消息,nChar分别为VK_CONTROL和VK_A。
先按A再按ctrl, 会先后产生两个WM_KEYDOWN消息,nChar分别为VK_A和
VK_CONTROL。
按下Ctrl弹出一个对话框松开关闭此对话框,如何实现?
关键字Ctrl 弹出对话框松开关闭此对话框
(一),新建一个单文档工程CtrlEg。
(二),在视图类中为WM_KEYDOWN和WM_KEYUP增加响应函数。具体代码如下:Dialog dlg ;//定义成类成员更规范,这儿定成变量是为了方便查看void CCtrlEgView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_CONTROL )
if( NULL == dlg.GetSafeHwnd())
{
dlg.Create(IDD_ABOUTBOX);
dlg.ShowWindow(SW_SHOW);
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CCtrlEgView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_CONTROL)
dlg.DestroyWindow();
CView::OnKeyUp(nChar, nRepCnt, nFlags);
}
(三),运行CtrlEg.exe,按Ctrl可以弹出对话框,松开没有关闭此对话框。根本原因是
CCtrlEgView并没有收到WM_KEYUP消息。
(四),进行如下修改就好了:
void CCtrlEgView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_CONTROL )
if( NULL == dlg.GetSafeHwnd())
{
dlg.Create(IDD_ABOUTBOX);
dlg.ShowWindow(SW_SHOW);
SetFocus();
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
如何知道鼠标进入及离开一个视图?
关键字鼠标进入及离开一个视
(一),新建一个单文档工程HtmlCtrl,视图类基于CFormView(其它视图也行)。(二),在#include 前,加一行代码#define _WIN32_WINNT 0x0400
(三),在CHtmlCtrlView中增加一个成员变量:bool m_bMouseOver,并在构造函数中赋初值为false。
(四),手动增加WM_MOUSEMOVE和WM_MOUSELEA VE的响应函数。
//{{AFX_MSG(CCKeyEgView)
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
//{{AFX_MSG_MAP(CCKeyEgView)
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEA VE, OnMouseLeave)
//}}AFX_MSG_MAP
void CHtmlCtrlView::OnMouseMove(UINT nFlags, CPoint point)
{
if(!m_bMouseOver)
{
TRACE(_T("Mouse enter\n"));
m_bMouseOver = TRUE;
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
::TrackMouseEvent(&tme);
}
CFormView::OnMouseMove(nFlags, point);
}
LRESULT CHtmlCtrlView::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
TRACE(_T("Mouse Leave!\n"));
m_bMouseOver = FALSE;
return 0;
}
为什么要把父类的析构函数定义成虚函数?
关键字把父类析构函数定义成虚函数?
问:为什么要把父类的析构函数定义成虚函数?
答:否则子类的析构函数可以未被调用,具体代码如下:
class A
{
public:
A(){TRACE("A()\n");};
~A(){TRACE("~A()\n");};
};
class B : public A
{
public:
B(){TRACE("B()\n");};
~B(){TRACE("~B()\n");};
};
void CEgDlg::OnButton1()
{
A * p = (A*)new B() ;
delete p ;
}
运行结果如下:
A()
B()
~A()
对话框完全显示后,马上执行一个按钮的事件
关键字对话框完全显示后马上执行一个按钮的事件
对话框完全显示后,马上执行一个按钮的事件
(一),新建一个基于对话框的工程DlgEvent。
(二),增加一个按钮IDC_BUTTON1,并为其增加响应函数,代码如下:void CDlgEventDlg::OnButton1()
AfxMessageBox("CDlgEventDlg::OnButton1");
}
(三),修改函数CDlgEventDlg::OnInitDialog,方法一代码如下:
BOOL CDlgEventDlg::OnInitDialog()
{
//...
ShowWindow(SW_NORMAL);
OnButton1();
return TRUE; // return TRUE unless you set the focus to a control
}
方法二代码如下:
BOOL CDlgEventDlg::OnInitDialog()
{
//...
HWND hButton = ::GetDlgItem(m_hWnd,IDC_BUTTON1);
::PostMessage(hButton,WM_LBUTTONDOWN,MK_LBUTTON,NULL);
::PostMessage(hButton,WM_LBUTTONUP,MK_LBUTTON,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
一,新建一个基于对话框的工程EditFont。
二,增加一个编辑框IDC_EDIT1,增加一个按钮IDC_BUTTON1,并为其增加响应函数,代码如下:
void CEditFontDlg::OnButton1()
{
CFontDialog dlg ;
if( IDOK != dlg.DoModal())
return ;
LOGFONT longFont ;
dlg.GetCurrentFont(&longFont);
CFont font;
font.CreateFontIndirect(&longFont);
CWnd * pEdit = GetDlgItem(IDC_EDIT1);
pEdit->SetFont(&font);
}
已知文件名取文件所在目录
关键字文件名取文件所在目录
已知文件名取文件所在目录?最简单的办法是从后向前查找"\\".但有时,文件名中没有"\\",这时就要先对文件名进行转换.具体代码如下:
CString GetPathName(const CString strPathFileName)
{
//取得经过处理后的文件名长度
int nLength = GetFullPathName(strPathFileName,0,NULL,NULL);
if( 0 == nLength )
return "" ;
//取得新文件名
CString strPathName ;
char * pszPathName = strPathName.GetBufferSetLength(nLength);
nLength = GetFullPathName(strPathFileName,nLength,pszPathName,NULL); strPathName.ReleaseBuffer();
if( 0 == nLength )
return "" ;
//取得路径
int nPos = strPathName.ReverseFind('\\');
if(-1 == nPos )
return "";
strPathName = strPathName.Left(nPos);
return strPathName ;
}
测试代码如下:
void CMy2View::OnDraw(CDC* pDC)
{
CMy2Doc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
CString strMess ;
CString strInput[] = {"1.txt","c:\\2.txt","d:3.txt","e:\\2/4.txt"};
int iCount = sizeof(strInput)/sizeof(strInput[0]) ;
for(int i = 0 ; i < iCount ; i++ )
{
CString strLine ;
CString strOutput = GetPathName(strInput[i]) ;
strLine.Format("文件名: %s\r\n对应文件夹%s\r\n\r\n",strInput[i],strOutput);
strMess += strLine ;
}
CRect r ;
GetClientRect(r);
pDC->DrawText(strMess,&r,0);
}
结果如下:
文件名: 1.txt
对应文件夹G:\TEST\2
文件名: c:\2.txt
对应文件夹c:
文件名: d:3.txt
对应文件夹D:
文件名: e:\2/4.txt
对应文件夹e:\2
如果文件名标准,可以用_splitpath函数解析,示例代码如下:
char path_buffer[_MAX_PA TH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" );
_splitpath( path_buffer, drive, dir, fname, ext );
如何模拟按下"计算器"的"7"键?
关键字模拟按下"计算器" "7"键
如何模拟按下“计算器”的“7”键?
一,新建一个基于对话框的工程CalEx。
二,使用VC++自带的工具spy++,可以得到计算器主窗口的类名是"SciCalc",“7”的ID是0x83. 三,增加一个按钮IDC_BUTTON1,并为其增加响应函数,代码如下:
void CCalExDlg::OnButton1()
HWND hWnd = ::FindWindow("SciCalc",NULL);
HWND hButton = ::GetDlgItem(hWnd,0x83);
::SendMessage(hButton,WM_LBUTTONDOWN,MK_LBUTTON,NULL);
::SendMessage(hButton,WM_LBUTTONUP,MK_LBUTTON,NULL);
}
如何存取文件中的空字符?
关键字存取文件空字符?
如何存取文件中的空字符?
问题提出:
空字符(ASCII为零的字符)是字符串的结束符,所以fgets函数和CStdioFile类的ReadString 函数无法读取多个空字符。
问题分析:
可以用fread函数和CFile类的Read函数.
解决方法:
CString strFileName = "f:\\1.txt" ;
char szBuf[16] = {0} ;
strcpy(szBuf,"ABCDE");
CFile file ;
file.Open(strFileName,CFile::modeWrite|CFile::modeCreate);
file.Write(szBuf,sizeof(szBuf)/sizeof(szBuf[0]));
file.Close();
memset(szBuf,' ',sizeof(szBuf)/sizeof(szBuf[0])) ;
file.Open(strFileName,CFile::modeRead );
file.Read(szBuf,sizeof(szBuf)/sizeof(szBuf[0])) ;
file.Close();
VC错误:数据被截断
关键字数据被截断
VC错误:数据被截断
问题提出:
利用类向导增加一个CRecordset的子类来管理数据库,程序正常运行一段时间后出错,提示信息为"数据被截断".
问题分析:
RFX_Text的第四个参数默认值为255,当表中对应字段的内容超过255时,数据就会被截断. 解决方法:
假定默认的代码为:RFX_Text(pFX, _T("[test]"), m_test);且test字段的最大长度为8000.则将代码改成RFX_Text(pFX, _T("[test]"), m_test,8000);
数据库的相关知识见本人拙作第八章.