VC常用技巧

  • 格式:pdf
  • 大小:132.43 KB
  • 文档页数:17

1)为什么某个类突然在工作区间里面突然看不见了?只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了(2)在基于对话框的程序中,一按回车键,对话框就没了。

把确定按纽的缺省属性前面的对勾去掉,重载OnOk()函数,在OnOk()函数里注释掉调用基类的OnOk()函数那行代码(3)为什么我的VC6.0自动显示成员列表功能时有时无?删除该项目扩展名为.ncb文件,重新打开该项目。

(4)如何干净的删除一个类?先从workspace中的fileview中删除对应的.h和.cpp文件;再关闭项目,从实际的文件夹中删除对应的.h和.cpp文件;再删除.clw文件。

最后打开项目,rebuild all。

(5)网络程序只能在debug运行,release不行,提示错误error LNK2001: unresolved external symbol __imp__WSAStartup在Release下仍然需要添加Ws2_32.lib。

(6)在安装VC时未安装MSDN, 自己再用MSDN安装盘安装后在VC中按F1无法调用?修改注册表是最直接的方法,具体过程如下: 在HKEY_CURRENT_USER/Software/Microsoft/DevStudio/6.0/Help下增加Enable,Filename,State三个主键,注意其类型,含义如下: Enable 类型:DWORD,默认值是1,改变为0x00000001 Filename 类型:字符串改为c:\program files\....\MSDev98\help\Msdev.hlp State 类型:DWORD 默认值为0,改变为0x00000001(7)复制了一段代码到当前工作空间里,可是代码排列很乱,如何调整?简单,按下鼠标左键拖动鼠标将代码选择上,同时按下键盘的ALT+F8键(8)如何建立多文档?为了加入对附加文档类型的支持,你可以在CWinApp派生类中创建和注册附加CmultiDocTemplate对象。

将一个附加文档类型加入到MFC程序的一般步骤如下:用AppWizard来创建一个新的文档类和视图类。

用资源编辑器增加新的资源字串来支持新的文档类。

要想知道关于文档样板字符串格式的更多内容,请参阅"如何理解文档样板字符串"。

用资源编辑器增加附加的应用程序图标和菜单资源。

注意,这些资源中每一个的ID都必须与在步骤2中创建的文档模板字符串的ID是相同的。

这个ID被CmultiDocTemplate类用来识别与附加文档类型相关的资源。

在应用程序的InitInstance()函数中,创建了另一个CMultiDocTemplate对象并且用CWinApp::AddDocTemplate()函数来注册。

例如:CMultiDocTemplate* pDocTemplate2 = new CMultiDocTemplate( IDR_DOC2TYPE, RUNTIME_CLASS(CDoc2),RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(CView2));AddDocTemplate(pDocTemplate2);最后,将定制的序列化和绘图代码加入到你的新文档和视图类中。

(9)如何使我的程序在启动时不创建一个新文档?在程序的InitInstance中的ProcessShellCommand函数之前加入: cmdInfo.m_nShellCommand = CCommandLineInf:FileNothing(10)如何获取应用程序的实例句柄?应用程序的实例句柄保存在CWinApp m_hInstance 中,可以这么调用AfxGetInstanceHandle 获得句柄.(11)如何得到程序中其它类的指针(例如框架类,视类,文档类等等)?MFC应用程序中指针的使用(转)(12)获得各种目录信息Windows目录: Use "GetWindowsDirectory"Windows下的system目录: Use "GetSystemDirectory"temp目录: Use "GetTempPath"当前目录: Use "GetCurrentDirectory"(13)如果让控制台应用程序支持MFC类库?可以在控制台应用程序中include 来引入mfc库,但是控制台应用程序缺省是单线程的,mfc是多线程的,为解决该矛盾,在project setting->c/c++ 选项,选择code generation,在use run-time library 下拉框中选择debug multithread。

(14)我怎样才能在我的应用程序中循环浏览已经打开的文档?使用CDocTemplate中未公开的GetFirstDocPosition()和GetNextDoc()函数。

(15)怎样才能在我的应用程序中循环浏览已经打开的视?使用 CDocument 中未公开的 GetFirstViewPosition() 和 GetNextView() 函数。

(16)PreCreateWindow是干什么用的?PreCreateWindow 允许你在调用CreateWindow之前来改变窗口属性。

(17)该怎样防止MFC在窗口标题栏上把文档名预置成应用程序名?在 PreCreateWindow 函数中删除 FWS_PREFIXTITLE 标志的窗口样式:cs.style &= ~FWS_PREFIXTITLE;(18)我应该怎样防止MFC在窗口标题栏上添加文档名?在 PreCreateWindow 函数中删除 FWS_ADDTOTITLE 标志的窗口样式:cs.style &= ~FWS_ADDTOTITLE ;(19)我应该如何改变视窗口的大小?因为视窗口实际上是框架窗口的子窗口,所以你必须改变框架窗口的大小,而不是改变视窗口。

使用CView类中的GetParent() 函数获得指向框架窗口的指针,然后调用 MoveWindow() 函数来改变框架的大小。

这会使变尺寸的视充满框架窗口。

(20)我有一无模式对话框。

我怎样才能在窗口退出时删除CDialog对象?把“delete this”加到 PostNcDestroy 中。

这主要用在需要自动删除对象的场合。

(21)为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy?OnNcDestroy 只被已建立的窗口调用。

如果建立窗口失败 ( 如 PreCreateWindow ),则没有窗口处来发送 WM_NCDESTROY 消息。

PostNcDestroy 是在对象窗口被完全删除,在OnNcDestroy 后,甚至在窗口建立失败之后调用的。

(22):怎么才能让窗口最大化显示啊?要使窗口最大化显示,应改变ShowWindow()的参数.在InitInstance()中将m_pMainWnd->ShowWindow(...)改为m_pMainWnd->ShowWindow(SW_SHOWMAXINIZE);就Ok(23)怎么把别人程序中设计好的对话框放到自己的程序中??用VC打开自己的程序,选择资源视图;然后点FILE->OPEN菜单项,打开设计好的对话框的资源文件(后缀名为。

RC),这里注意一定只打开后缀名为。

RC的资源文件,然后在VC 编辑器的文档区域就会有你刚打开的另一个程序的资源文件中资源的一个树型结构图,然后找到你要复制的对话框资源ID,鼠标左键按住ID号,然后拖放到资源视图中,这个时候你再看看自己程序的资源视图,是不是已经复制过来了。

罗嗦了这么多,其实问题的关键是在一个编辑器中同时打开自己的项目和另一个项目的资源文件。

(24)关于installshield制作中的注册表问题:怎样在注册表中写入用户单位的名称在InstallShield选择Resources,在其中的Registry Entry部分输入要添加的注册项。

(25)简介对话框应用程序中UpdateData函数的作用及其参数含义与使用场合。

UpdateData只有一个BOOL类型的参数,UpdateData(FALSE)一般用于对话框控件连接的变量值刷新屏幕显示;UpdateData(TRUE)用于获取屏幕数据到对话框控件连接的变量中。

(26)如何单击除了窗口标题栏以外的区域使窗口移动当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理该信息使Windows认为鼠标在窗口标题上。

对于对话框和基于对话的应用程序,可以使用ClassWizard处理该信息并调用基类函数,如果函数返回HTCLIENT 则表明鼠标在客房区域,返回HTCAPTION表明鼠标在Windows的标题栏中。

UINT CSampleDialog : : OnNcHitTest (Cpoint point){UINT nHitTest =Cdialog: : OnNcHitTest (point );return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest ;}上述技术有两点不利之处,其一是在窗口的客户区域双击时,窗口将极大;其二,它不适合包含几个视窗的主框窗口。

还有一种方法,当用户按下鼠标左键使主框窗口认为鼠标在其窗口标题上,使用ClassWizard在视窗中处理WM_LBUTTODOWN 信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION。

void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point){CView::OnLButtonDow (nFlags, pont);//Fool window into thinking somene clicked on its caption bar .GetParent() —> PostMessage (WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(poitn.x, point.y));}该技术也适用于对话框和基于对的应用程序,只是不必调用CWnd : : GetParent 。

void CSampleDialog::OnLbuttonDown(UINT nFlags, Cpoint point){Cdialog::OnLButtonDow(nFlags, goint ); //Fool dialog into thinking simeone clicked on its caption bar .PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARM(point.x, point. y))}(27)VC中怎样Copy当前程序到启动目录BOOL DataManageDlg::CopyFiles(CString sForm, CString sTo)拷贝函数{BOOL isb;SHFILEOPSTRUCT fo;TCHAR szFrom[MAX_PATH+1];TCHAR szTo[MAX_PATH+1];ZeroMemory(&fo, sizeof(fo));ZeroMemory(szFrom, sizeof(szFrom));ZeroMemory(szTo, sizeof(szTo));// CString strPath;isb=false;CString str1;// strPath = _T("D:\\vcvc\\ado10\\Debug\\");// strPath += _T("1.txt");_tcscpy(szFrom, sForm);_tcscpy(szTo, sTo);fo.hwnd=this->m_hWnd;fo.wFunc = FO_COPY;fo.pFrom = szFrom;fo.pTo = szTo;// fo.fFlags = FOF_SIMPLEPROGRESS;// fo.fFlags = FOF_ALLOWUNDO;fo.fFlags=FOF_NOCONFIRMATION;::SHFileOperation(&fo);isb=true; return isb;}启动路径C:\Documents and Settings\All Users\「开始」菜单\程序\启动/////////////////////////////////////////////////CreateShortcut("c:\\windows\\notepad.exe", //快捷方式指向的应用程序//"c:\\config.sys", //命令行参数//"c:\\windows", //起始位置(工作目录)//"c:\\windows\\desktop\\记事本.lnk", //快捷方式的文件名(包含路径) //"记事本"); //快捷方式的描述HRESULT CreateShortcut(LPCSTR pszPathObj,LPSTR pszParam,LPSTR pszPath,LPSTR pszPathLink,LPSTR pszDesc){HRESULT hres; //调用 COM 接口方法之后的返回值IShellLink *pShellLink;IPersistFile *pPersistFile;WCHAR wsz[MAX_PATH]; //UNICODE串, 用来存放快捷方式文件名CoInitialize(NULL); //初始化 COM 库//创建 COM 对象并获取其实现的接口hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&pShellLink);if(FAILED(hres)){pShellLink ->Release(); //释放 IShellLink 接口CoUninitialize(); //关闭 COM 库, 释放所有 COM 资源return FALSE;}//设置快捷方式的各种属性pShellLink->SetPath(pszPathObj); //快捷方式所指的应用程序名pShellLink->SetArguments(pszParam); //参数pShellLink->SetDescription(pszDesc); //描述pShellLink->SetWorkingDirectory(pszPath); //设置工作目录//pShellLink->SetIconLocation("C:\\Icon.ico",0); //快捷方式的图标//pShellLink->SetHotkey(热键); //启动快捷方式的热键(只能是Ctrl+Alt+_)//pShellLink->SetShowCmd(SW_MAXIMIZE); //运行方式(常规窗口,最大化,最小化) //查询 IShellLink 接口从而得到 IPersistFile 接口来保存快捷方式hres = pShellLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile);if(FAILED(hres)){pPersistFile ->Release(); //释放 IPersistFile 接口pShellLink ->Release(); //释放 IShellLink 接口CoUninitialize(); //关闭 COM 库, 释放所有 COM 资源return(FALSE);}//转换 ANSI 串为 UNICODE 串(COM 内部使用 NUICODE)MultiByteToWideChar(CP_ACP, 0, pszPathLink, -1, wsz, MAX_PATH);//使用 IPersistFile 接口的 Save() 方法保存快捷方式hres = pPersistFile ->Save(wsz, TRUE);//释放 IPersistFile 接口pPersistFile ->Release();//释放 IShellLink 接口pShellLink ->Release();//关闭 COM 库, 释放所有 COM 资源CoUninitialize();return(hres);}(28)怎样获取当前程序(EXE)所在的路径TCHAR szFilePath[MAX_PATH + 1];GetModuleFileName(NULL, szFilePath, MAX_PATH);(_tcsrchr(szFilePath, _T('\\')))[1] = 0; //删除文件名,只获得路径字串9CString str_url = szFilePath;1:获取应用程序自身完整路径文件名方法1:#include "stdlib.h"void main(){cout << _pgmptr << endl;}方法2:char szFullPath[MAX_PATH];ZeroMemory(szFullPath,MAX_PATH);::GetModuleFileName(NULL,szFullPath,MAX_PATH);::MessageBox(NULL,szFullPath,"path",MB_ICONINFORMATION);2:如何获取应用程序所在目录?这里值得注意的是很多人都用GetCurrentDirectory(MAX_PATH, szCurrentPath);来获取。