文档库 最新最全的文档下载
当前位置:文档库 › vc综合资料

vc综合资料

vc综合资料
vc综合资料

快捷键与热键有何异同?

关键字快捷键热键

相同点是它们都是通过键盘来访问。不同点可以从用户和开发者两个方面来说明,下面以“粘

贴”功能为例。快捷键与热键有何异同?

关键字快捷键热键

相同点是它们都是通过键盘来访问。不同点可以从用户和开发者两个方面来说明,下面以“粘贴”功能为例。用户使用热键进行“粘贴”操作的步骤为先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);

数据库的相关知识见本人拙作第八章.

相关文档