zl程序教程

您现在的位置是:首页 >  后端

当前栏目

VC中常见API函数使用方法(经验版)

方法API 函数 常见 经验 vc 使用
2023-09-11 14:20:43 时间

***********************************************声明************************************************************************************* 

      原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

      因为各种原因。可能存在诸多不足。欢迎斧正!

******************************************************************************************************************************************* 

1.设置对话框为无边框方法  

ModifyStyle(WS_CAPTION | WS_THICKFRAME, 0, SWP_FRAMECHANGED);

2.设置控件灰色与不灰色

void CMthread1Dlg::OnStop() 

{
	// TODO: Add your control notification handler code here
	m_bRun = FALSE;
	GetDlgItem(IDC_START)->EnableWindow(TRUE);
	GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}
按stopbutton,IDC_START相应button可见,IDC_STOP相应button不可见。


3.模态对话框与非模态对话框

    模式对话框创建后,程序的其它窗体便不能进行操作。必须将该窗体关闭后,其它窗体才干进行操作。

而非模式对话框则无需这样,它不强制要求用户马上反应,而是与其它窗体同一时候接受用户操作。模式对话框就是不处理它就没法处理父窗体。而非模式对话框就是不用先处理此对话框也能够处理父窗体。

A、创建模态对话框

CMyDemoDlg dlg;
dlg.DoModal();

B、创建非模态对话框

CDeviceDomeDlg *tmpDlg;
tmpDlg=new CDeviceDomeDlg;
tmpDlg->Create(IDD_DEVICE_DIALOG1,this); //创建一个非模态对话框 
tmpDlg->MoveWindow( CRect(iter->left,iter->top,iter->right,iter->bottom) );//设置对话框位置
tmpDlg->ShowWindow(SW_SHOW); //显示非模态对话框  
dlg.push_back(tmpDlg);

4.计算程序执行时间

    计算程序执行时间有非常多方法,大都是计算时间差。

<span style="font-size:14px;">DWORD dwStartTime=GetTickCount();
DWORD dwElapsedTime=GetTickCount()-dwStartTime;</span>

       上面这个代码是在不会被中断的情况下使用的。

可是,在抢占式操作系统中,永远无法知道线程何时被赋予CPU时间。当取消线程的CPU时间时,就更难计算线程运行不同任务时所用的时间。我们须要一个函数。以便返回线程得到的CPU时间的数量。

<span style="font-size:14px;">BOOL GetThreadTimes(HANDLE hThread,
   PFILETIME pftCreationTime, PFILETIME pftExitTime,
   PFILETIME pftKernelTime, PFILETIME pftUserTime);

FILETIME ftKernelTimeStart, ftKernelTimeEnd;
FILETIME ftUserTimeStart,   ftUserTimeEnd;
FILETIME ftDummy;
__int64 qwKernelTimeElapsed, qwUserTimeElapsed,
    qwTotalTimeElapsed;

GetThreadTimes(GetCurrentThread(), &ftDummy,
    &ftDummy, &ftKernelTimeStart, &ftUserTimeStart);

GetThreadTimes(GetCurrentThread(), &ftDummy,
    &ftDummy, &ftKernelTimeEnd, &ftUserTimeEnd);

qwKernelTimeElapsed = 
   FileTimeToQuadWord(&ftKernelTimeEnd) -
   FileTimeToQuadWord(&ftKernelTimeStart);

qwUserTimeElapsed = 
   FileTimeToQuadWord(&ftUserTimeEnd) -
   FileTimeToQuadWord(&ftUserTimeStart);

qwTotalTimeElapsed = qwKernelTimeElapsed + 
   qwUserTimeElapsed;
</span>
GetProcessTimes是个类似GetThreadTimes的函数,适用于进程中的全部线程:
<span style="font-size:14px;">BOOL GetProcessTimes(HANDLE hProcess,
   PFILETIME pftCreationTime, PFILETIME pftExitTime,
   PFILETIME pftKernelTime, PFILETIME pftUserTime);
返回的时间适用于某个进程中的全部线程,比如。返回的内核时间是全部进程的线程在内核代码中经过的全部时间的总和。</span>

5.在任务栏而非窗体处理

   有时须要控件在排除任务栏的窗体内显示,此时仅仅需调用   

<span style="font-size:14px;">   RECT winRc;
   SystemParametersInfo(SPI_GETWORKAREA,0,(PVOID)&winRc,0);</span>

得到的winRc即除去了任务栏,注意此时不随任务栏位置变化而变化。


6.MFC中CString和STL中string的互换

<span style="font-size:14px;">string转CString
CString strMfc。
std::string strStl=“test“;
strMfc=strStl.c_str();
CString转string
CString strMFC;
string strSTL;
strSTL = CStringA(strMFC)</span>

7.GetModuleHandle()函数使用方法

HMODULEGetModuleHandle(LPCTSTRlpModuleName);
获取一个特定的应用程序或动态链接库的模块句柄,且这个模块必须已经被载入到调用者的进程空间中。
參数说明:lpModuleName 模块名称
返回值:如运行成功成功。则返回模块句柄;零表示失败,并通过GetLastError获得错误信息.
GetModuleHandle(NULL);这将返回自身应用程序句柄。


8.对话框支持文件拖拽
第一步、须要加入消息响应WM_DROPFILES
1)、假设是MFC,操作例如以下:对话框上点击右键,选择Properties->Extended Styles,点选Accept files选项就可以。


2)、假设不是MFC,如ATL、Win32、金山卫士开源码等。操作例如以下:

LONG dwLong = GetWindowLong(GWL_EXSTYLE);
SetWindowLong(GWL_EXSTYLE, dwLong|WS_EX_ACCEPTFILES);
第二步、文件拖拽消息响应函数

void CMainDlg::OnDropFiles(HDROP hDropInfo) 
{ 

	UINT count;     
	TCHAR strFilePath[MAX_PATH + 1]   ;   
	count = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);           
	if(count)            
	{ 
		for(UINT i=0; i<count; i++) 
                //支持多个文件的拖拽操作                    
		{ 
		    int pathLen = DragQueryFile(hDropInfo, i, strFilePath, sizeof(strFilePath)); 
                   //strFilePath存储的是当前文件的完整路径+文件名称
                   //此处能够加入待处理的操作。完毕应用程序的功能
		} 
	} 
	DragFinish(hDropInfo);  
        //CDialog::OnDropFiles(hDropInfo);//假设是MFC。最好加入此操作
} 


9、获取当前进程已载入模块的文件的完整路径。该模块必须由当前进程载入

  如以下的C:\Users\jimjxu\Desktop\我的程序\1.cpp源程序运行起来就是  "szPath = C:\Users\jimjxu\Desktop\我的程序\Debug\1.exe"

#include <windows.h>
#include <stdio.h>

BOOL GetExactFileName()
{
    TCHAR szPath[MAX_PATH];
    if( !GetModuleFileName( NULL, szPath, MAX_PATH ) )
    {
        printf("GetModuleFileName failed (%d)\n", GetLastError());
        return FALSE;
    }
	printf("szPath = %s\n", szPath);
	return TRUE;
}

int main(int argc, TCHAR* argv[])
{	
	GetExactFileName();
	return 0;
}


10、对话框支持文件拖拽
第一步、须要加入消息响应WM_DROPFILES
1)、假设是MFC,操作例如以下:对话框上点击右键,选择Properties->Extended Styles,点选Accept files选项就可以。
2)、假设不是MFC。如ATL、Win32、金山卫士开源码等,操作例如以下:   

LONG dwLong = GetWindowLong(GWL_EXSTYLE);
SetWindowLong(GWL_EXSTYLE, dwLong|WS_EX_ACCEPTFILES);

第二步、文件拖拽消息响应函数

void CMainDlg::OnDropFiles(HDROP hDropInfo) 
{ 

	UINT count;     
	TCHAR strFilePath[MAX_PATH + 1]   ;   
	count = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);           
	if(count)            
	{ 
		for(UINT i=0; i<count; i++) 
                //支持多个文件的拖拽操作                    
		{ 
		    int pathLen = DragQueryFile(hDropInfo, i, strFilePath, sizeof(strFilePath)); 
                   //strFilePath存储的是当前文件的完整路径+文件名称
                   //此处能够加入待处理的操作,完毕应用程序的功能
		} 
	} 
	DragFinish(hDropInfo);  
        //CDialog::OnDropFiles(hDropInfo);//假设是MFC。最好加入此操作
}