VC技术总结(转贴)

转载 2007年10月08日 17:41:00

 版权归作者所有

       作者:不祥

VC技术总结

                                      

 

1.如何获取应用程序的实例句柄?
应用程序的实例句柄保存在CWinAppIm_hInstance中,可以这么调用
AfxGetInstancdHandle获得句柄.
Example:HANDLEhInstance=AfxGetInstanceHandle();

2.如何通过代码获得应用程序主窗口的指针?
主窗口的指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。
AfxGetMainWnd()->ShowWindow(SW_SHOWMAXMIZED);//使程序最大化.

3.如何在程序中获得其他程序的图标?
两种方法:
(1)SDK函数SHGetFileInfo或使用ExtractIcon获得图标资源的handle,
(2)SDK函数SHGetFileInfo获得有关文件的很多信息,如大小图标,属性,
类型等.
Example(1):在程序窗口左上角显示NotePad图标.

voidCSampleView:OnDraw(CDC*pDC)
{
if(::SHGetFileInfo(_T("c://pwin95//notepad.exe"),0,
&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))
{
pDC->DrawIcon(10,10,stFileInfo.hIcon);
}
}
Example(2):同样功能,UseExtractIconFunction

voidCSampleView::OnDraw(CDC*pDC)
{
HICONhIcon=::ExtractIcon(AfxGetInstanceHandle(),_T
("NotePad.exe"),0);

if(hIcon&&hIcon!=(HICON)-1)
pDC->DrawIcon(10,10,hIcon);
}
说明:获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到,
如果是调用win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个
比较考究的程序,考虑应该全面点.

4.如何编程结束应用程序?如何编程控制windows的重新引导?
这是个很简单又是编程中经常要遇到的问题.
第一问,向窗口发送WM_CLOSE消息,调用CWnd::OnClose成员函数.允许对用户提示
是否保存修改过的数据.
Example:AfxGetMainWindow()->SendMessage(WM_CLOSE);

还可以创建一个自定义的函数TerminateWindow
voidTerminateWindow(LPCSTRpCaption)
{
CWnd*pWnd=Cwnd::FindWindow(NULL,pCaption);
if(pWnd)
pWnd->SendMessage(WM_CLOSE);
}

说明:FindWindow函数不是提倡的做法,因为它无法处理标题栏自动改变,比如
我们要检测Notepad是不是已运行而事先不知道Notepad的标题栏,这时FindWindow就
无能为力了,可以通过枚举windows任务列表的办法来实现。在机械出版社
"Windows95API开发人员指南"一书有比较详细的介绍,这里就不再多说乐。

第二问,UseExitWindowsExFunction函数控制系统是重新引导,还是重启windows.
前面已经有人讲过乐,就不再提了。

5.怎样加栽其他的应用程序?
我记得这好象是出场频度很高的问题。
三个SDK函数winexec,shellexecute,createprocess可以使用。
WinExec最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参数
值得说一下,比如泥用SW_SHOWMAXMIZED方式去加栽一个无最大化按钮的程序,呵呵
就是Neterm,calc等等,就不会出现正常的窗体,但是已经被加到任务列表里了。
ShellExecute较WinExex灵活一点,可以指定工作目录,下面的Example就是直接
打开c:/temp/1.txt,而不用加栽与txt文件关联的应用程序,很多安装程序完成后
都会打开一个窗口,来显示ReadmeorFaq,偶猜就是这么作的啦.
ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c://temp"),SW_SHOWMAXMIZED);

CreateProcess最复杂,一共有十个参数,不过大部分都可以用NULL代替,它可以
指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的Example:
STARTUPINFOstinfo;//启动窗口的信息
PROCESSINFOprocinfo;//进程的信息

CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE,NORMAL_PRIORITY_
CLASS,NULL,NULL,&stinfo,&procinfo);

6.确定应用程序的路径
前些天好象有人问过这个问题.
UseGetModuleFileName获得应用程序的路径,然后去掉可执行文件名。
Example:
TCHARexeFullPath[MAX_PATH];//MAX_PATH在API中定义了吧,好象是128
GetModuleFileName(NULL,exeFullPath,MAX_PATH)

7.获得各种目录信息
Windows目录:Use"GetWindowsDirectory“
Windows下的system目录:Use"GetSystemDirectory"
temp目录:Use"GetTempPath"
当前目录:Use"GetCurrentDirectory"
请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区;后两个相反.

8.如何自定义消息
也有人问过的,其实不难。
(1)手工定义消息,可以这么写#defineWM_MY_MESSAGE(WM_USER+100),
MS推荐的至少是WM_USER+100;
(2)写消息处理函数,用WPARAM,LPARAM返回LRESULT.
LRESULTCMainFrame::OnMyMessage(WPARAMwparam,LPARAMlParam)
{

//加入你的处理函数
}
(3)在类的AFX_MSG处进行声明,也就是常说的"宏映射"

17-19工具栏和状态栏

17、如何在代码中获取工具栏和状态栏的指针

缺省时,工作框创建状态栏和工具栏时将它们作为主框窗口的子窗口,状态栏
有一个AFX_IDW_STATUS_BAR标识符,工具栏有一个AFX_IDW_TOOLBAR标识符,下例说
明了如何通过一起调用CWnd::GetDescendantWindow和AfxGetMainWnd来获取这些
子窗口的指针:
//Getpointertostatusbar.
CStatusBar*pStatusBar=
(CStatusBar*)AfxGetMainWnd()—>GetDescendantWindow
(AFX_IDW_STUTUS_BAR);

//Getpointertotoolbar.
CToolBar*pToolBar=
(CToolBar*)AfxGetMainWnd()—>GetDescendantWindow(AFX_IDW_TOOLBAR);


18、如何使能和禁止工具栏的工具提示

如果设置了CBRS_TOOLTIPS风格位,工具栏将显示工具提示,要使能或者禁止
工具提示,需要设置或者清除该风格位。下例通过调用CControlBar::GetBarStyle
和CControlBar::SetBarStyle建立一个完成此功能的成员函数:
voidCMainFrame::EnableToolTips(BOOLbDisplayTips)
{
ASSERT_VALID(m_wndToolBar);

DWORDdwStyle=m_wndToolBar.GetBarStyle();

if(bDisplayTips)
dwStyle|=CBRS_TOOLTIPS;
else
dwStyle&=~CBRS_TOOLTIPS;

m_wndToolBar.SetBarStyle(dwStyle);
}


19、如何设置工具栏标题

工具栏是一个窗口,所以可以在调用CWnd::SetWindowText来设置标题,
例子如下:
intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)
{


//Setthecaptionofthetoolbar.
m_wndToolBar.SetWindowText(_T"Standdard");

20-23对话框

20、如何创建和使用无模式对话框

MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几
个对话需要几个额处的步骤。首先,使用资源编辑器建立对话资源并使用
ClassWizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的:
模式对话通过调用CDialog::EndDialog来中止,无模式对话则是调用
CWnd::DestroyWindow来中止的,函数CDialog::OnOK和CDialog::OnCancel
调用EndDialog,所以需要调用DestroyWindow并重置无模式对话的函数。
voidCSampleDialog::OnOK()
{
//Retrieveandvalidatedialogdata.
if(!UpdateData(TRUE))
{
//theUpdateDatarountinewillsetfocustocorrectitem
TRACEO("UpdateDatafailedduringdialogtermination./n");
return;
}

//CallDestroyWindowinsteadofEndDialog.
DestroyWindow();
}

voidCSampleDialog::OnCancel()
{
//CallDestroyWindowinsteadofEndDialog.
DestroyWindow();
}
其次,需要正确删除表示对话的C++对象。对于模式对来说,这很容易,需要创
建函数返回后即可删除C++对象;无模式对话不是同步的,创建函数调用后立即返回,
因而用户不知道何时删除C++对象。撤销窗口时工作框调用CWnd::PostNcDestroy,
可以重置该函数并执行清除操作,诸如删除this指针。
voidCSampleDialog::PostNcDestroy()
{
//DecletetheC++objectthatrepresentsthisdialog.
deletethis;
}
最后,要创建无模式对话。可以调用CDialog::DoModal创建一个模式对放,
要创建一个无模式对话则要调用CDialog::Create。下面的例子说明了应用程序
是如何创建无模式对话的:
voidCMainFrame::OnSampleDialog()
{
//Allocateamodelessdialogobject.
CSampleDilog*pDialog=newCSampleDialog;
ASSERT_VALID(pDialog);

//Createthemodelessdialog.
BOOLbResult=pDialog—>Creste(IDD_IDALOG);
ASSERT(bResult);
}


21、如何在对话框中显示一个位图

这要归功于Win32先进的静态控件和Microsoft的资源编辑器,在对话框中
显示位图是很容易的,只需将图形控件拖到对话中并选择适当属性即可,用户也
可以显示图标、位图以及增强型元文件。


22、如何改变对话或窗体视窗的背景颜色

调用CWinApp::SetDialogBkColor可以改变所有应用程序的背景颜色。第
一个参数指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置
为蓝色背景和黄色文本。
BOOLCSampleApp::InitInstance()
{


//usebluedialogwithyellowtext.
SetDialogBkColor(RGB(0,0,255),RGB(255,255,0));


}
需要重画对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,
通常用户可以让Windows选择绘画背景的刷子,也可重置该消息指定刷子。下例说
明了创建一个红色背景对话的步骤。
首先,给对话基类增加一人成员变量CBursh:
classCMyFormView:publicCFormView
{


private:
CBrushm_brush;//backgroundbrush


};
其次,在类的构造函数中将刷子初始化为所需要的背景颜色。
CMyFormView::CMyFormView()
{
//Initializebackgroundbrush.
m_brush.CreateSolidBrush(RGB(0,0,255))
}
最后,使用ClassWizard处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的
刷子句柄。注意:由于当重画对话控件时也要调用该函数,所以要检测nCtlColor
参量。
HBRUSHCMyFormView::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)
{
//Determineifdrawingadialogbox.Ifweare,return+handleto
//ourownbackgroundbrush.Otherwiseletwindowshandleit.
if(nCtlColor==CTLCOLOR_DLG)
return(HBRUSH)m_brush.GetSafeHandle();

returnCFormView::OnCtlColor(pDC,pWnd,nCtlColor);
}


23、如何获取一个对话控件的指针

有两种方法。其一,调用CWnd::GetDlgItem,获取一个CWnd*指针调用成
员函数。下例调用GetDlgItem,将返回值传给一个CSpinButtonCtrl*以便调用
CSpinButtonCtrl::SetPos函数:
BOOLCSampleDialog::OnInitDialog()
{
CDialog::OnInitDialog();

//Getpointertospinbutton.
CSpinButtonCtrl*pSpin-(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN);
ASSERT_VALID(pSpin);

//Setspinbutton'sdefaultposition.
pSpin—>SetPos(10);

returnTRUE;
}
其二,可以使用ClassWizard将控件和成员变量联系起来。在ClassWizard中简
单地选择MemberVariables标签,然后选择AddVariable…按钮。如果在对话资源
编辑器中,按下Ctrl键并双击控件即可转到AddMemberVariable对话。

24、显示和隐藏标题栏

 

方法一:使用API实现

//隐藏TitleBar
LONGlStyle=::GetWindowLong(this->m_hWnd,GWL_STYLE);
::SetWindowLong(this->m_hWnd,GWL_STYLE,lStyle&~WS_CAPTION);
::SetWindowPos(this->m_hWnd,NULL,0,0,0,0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_FRAMECHANGED);

//显示TitleBar
::SetWindowLong(this->m_hWnd,GWL_STYLE,lStyle|WS_CAPTION);
::SetWindowPos(this->m_hWnd,NULL,0,0,0,0,??SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_FRAMECHANGED);
方法二:使用CWnd成员函数ModifyStyle实现
//隐藏TitleBar
ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED);
//显示TitleBar
ModifyStyle(0,WS_CAPTION,SWP_FRAMECHANGED);


25、怎么用SendMessage()来发送消息来清空它的内容??
HWNDhEditWnd=GetDlgItem(IDC_EDIT1)->GetSafeHwnd();
::SendMessage(hEditWnd,WM_SETTEXT,(WPARAM)0,(LPARAM)"");

26、弹出文件的属性窗口
SHELLEXECUTEINFOShExecInfo={0};
ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask=SEE_MASK_INVOKEIDLIST;
ShExecInfo.hwnd=NULL;
ShExecInfo.lpVerb="properties";
ShExecInfo.lpFile="c:/";//也可以是文件
ShExecInfo.lpParameters="";
ShExecInfo.lpDirectory=NULL;
ShExecInfo.nShow=SW_SHOW;
ShExecInfo.hInstApp=NULL;
ShellExecuteEx(&ShExecInfo);

27、删除一个目录下的所有文件

BOOLDeleteDirectory(LPCTSTRDirName)
{
CFileFindtempFind;//声明一个CFileFind类变量,以用来搜索
chartempFileFind[200];//用于定义搜索格式
sprintf(tempFileFind,"%s//*.*",DirName);
//匹配格式为*.*,即该目录下的所有文件

BOOLIsFinded=(BOOL)tempFind.FindFile(tempFileFind);
//查找第一个文件
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();//递归搜索其他的文件
if(!tempFind.IsDots())//如果不是"."目录
{
charfoundFileName[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory())//如果是目录,则递归地调用
{//DeleteDirectory
chartempDir[200];
sprintf(tempDir,"%s//%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{//如果是文件则直接删除之
chartempFileName[200];
sprintf(tempFileName,"%s//%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(DirName))//删除目录
{
AfxMessageBox("删除目录失败!",MB_OK);
returnFALSE;
}
returnTRUE;
}

28、lib和dll文件的区别和联系

.dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。

.lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。如果你想使用lib文件,就必须:
1包含一个对应的头文件告知编译器lib文件里面的具体内容
2设置lib文件允许编译器去查找已经编译好的二进制代码

如果你想从你的代码分离一个dll文件出来代替静态连接库,仍然需要一个lib文件。这个lib文件将被连接到程序告诉操作系统在运行的时候你想用到什么dll文件,一般情况下,lib文件里有相应的dll文件的名字和一个指明dll输出函数入口的顺序表。如果不想用lib文件或者是没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress。事实上,我们可以在VisualC++IDE中以二进制形式打开lib文件,大多情况下会看到ASCII码格式的C++函数或一些重载操作的函数名字。

一般我们最主要的关于lib文件的麻烦就是出现unresolvedsymble

 

 

我的Java开发技术总结

我的Java项目开发工具总结
  • cloud_ll
  • cloud_ll
  • 2016年06月04日 17:51
  • 1561

大数据技术总结

二、数据层 1、SQL GBase MonetDB 2、NoSQL HBase Cassandra MongoDB 3、缓存 Redis Memcached 三、计算层 1、内存计算 Spark ...
  • yfx000
  • yfx000
  • 2016年06月22日 22:32
  • 1080

关于无线通信技术的简单总结

无线通信技术,本质上是利用无线传输介质实现终端之间的互联互通,这种无线介质可以是电磁波,也可以是光波,实际上根据量子力学的理论,光波也是一种电磁波,它们的区别是波长不同。 有了传输介质,下一步的工作...
  • u011543541
  • u011543541
  • 2016年08月19日 10:58
  • 892

分享与技术总结的必要性

说起来搞IT这一行也有些年头了,虽然本科几乎是在荒废中度过的,和那些从小对computer就很敏感的牛人,那只能自嘲了,但对Computer的基础知识和术语还是较为熟悉的。可是,问题来了,上了研究生,...
  • lrongzheni
  • lrongzheni
  • 2014年03月16日 21:54
  • 471

IT技术团队管理-总结

摘要:此文是书籍的读书笔记. 主要是方便自己回顾. 您也可以通过此文简要了解此书的内容. IT技术团队员工的特点 高学历, 知识密集型. 技术立身. 人际关系简单. 摩擦大多数由技术产生,...
  • xkfz008
  • xkfz008
  • 2014年04月21日 19:22
  • 1217

android开发工作用到技术总结

本期用工作算是告一段落,下面就对工作中用的技术进行一些总结。 一、实现listview中item如下图效果。 如设计图所示,当点击item后,item上弹出一个半透明的视图层。主要是用的popup...
  • bluejww
  • bluejww
  • 2016年07月28日 14:32
  • 1358

ASP.NET Web开发技术的深入总结

【IT168技术】在国内.Net开发这个环境里, 中小型公司,或者大公司但主营业务不是软件开发里面的软件小团队,针对.Net开发人员的要求都是十项全能型的全才, 能做的了从前台页面展现到最后数据存储的...
  • SJian123
  • SJian123
  • 2014年09月02日 16:01
  • 1182

2017阿里技术年度精选(全)

2017年,在技术发展的历史上,一定是个特别的一年:柯洁与AlphaGo的惊世大战,无人咖啡店开放体验,AI设计师“鲁班”横空出世、三年投入千亿的达摩院正式成立…… 这次,在阿里全年发布的近300篇...
  • youanyyou
  • youanyyou
  • 2018年01月06日 16:47
  • 170

投资计划以及小结

一、去年投资小结 几乎是没有管理的,这样是不行的。从去年来看,房地产、股市、btc等等都是有很多机会的,每天都充满机遇,当前应该是风险与机遇加急的时期,一定要把握好。 二、投资种类 1、基金:比自己炒...
  • pppaass
  • pppaass
  • 2017年03月26日 17:56
  • 184

技术管理岗岗位职责总结

一 技术总监岗位职责 技术总监,CTO,又常称为技术官或首席技术官,是企业团体里的高阶主管职位之一,是企业内负责技术的最高负责人。 技术总监一般负责一个企业的技术管理体系的建设和维护,制定技术标准...
  • bcbobo21cn
  • bcbobo21cn
  • 2015年12月31日 23:21
  • 915
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC技术总结(转贴)
举报原因:
原因补充:

(最多只允许输入30个字)