函数一:_splitpath 分解路径
函数原型:
void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext);
参数:
- path,完成的文件绝对路径;加入一个const证明是一个输入参数,不可以修改。
- drive:磁盘的字符串,比如 C
- dir:中间路径的字符串
- fname:文件名称
- 文件的后缀名
如果不关注某个参数(绝对路径除外),就在相应位置填 NULL
比如:D:\Program Files\Config\BPMNTagActionTool.xml
char path[_MAX_PATH], drive[_MAX_PATH], dir[_MAX_PATH], fname[_MAX_PATH], ext[_MAX_PATH];
path = ;
_splitpath();
例子:创建一个Win32 console 文件,带简单例子:
// dfgf.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main(int argc, char* argv[])
{
char path[_MAX_PATH] ,drive[_MAX_PATH], dir[_MAX_PATH], fname[_MAX_PATH], ext[_MAX_PATH];
strcpy(path,"D:\\Program Files\\Config\\BPMNTagActionTool.xml");
_splitpath(path,drive,dir,fname,ext);
printf("drive: %s\n",drive);
printf("dir: %s\n",dir);
printf("fname: %s\n",fname);
printf("ext: %s\n",ext);
return 0;
}
输出为:
drive: D
dir: \Program Files\Config\
fname:BPMNTagActionTool
ext: .xml
【注意】\转义字符 这个是C程序 用双斜杠才可以,路径表示方法与C++有点不太一样。否则会出现解析路径失败的问题。
【引申问题】如何将字符串赋值给字符数组
[方法一] 初始化的时候直接赋值。
char path[_MAX_PATH] = “D:\Program Files\Config\BPMNTagActionTool.xml”,drive[_MAX_PATH], dir[_MAX_PATH], fname[_MAX_PATH], ext[_MAX_PATH]; //初始化时 =不是赋值运算
**[方法二]**一个字符一个字符的赋值,
char a[6] = {‘h’,‘e’,‘l’,‘l’,‘o’};
[方法三] 利用strcpy函数:
strcpy(path,“hello”);//此处用hello字符串 示意一下 上面的绝对路径(太长)
不过得添加头文件 #include “string.h”
【引申问题】strcpu()函数原型为
char *strcpy(
char *strDestination,
const char *strSource
);
char * __cdecl strcpy(char *, const char *);//一个标准C函数
第一个参数 为 赋值参数,目标参数 strDestination;
第二个参数为 输入参数,源参数 strSource
函数返回值类型为char *,返回的是strDestination,其实返回的结果与源参数也是一样子哒,毕竟是copy函数嘛。
函数二:_wmakepath 合成路径
功能 :合成路径 ,,,参数如上面一个函数的,只不过 只有path可以修改,其他参数不可以修改。注意与上式的区别。
void _wmakepath(
wchar_t *path,
const wchar_t *drive,
const wchar_t *dir,
const wchar_t *fname,
const wchar_t *ext
);
函数三:GetModuleFileName:获取执行程序的绝对路径
函数原型:
需要添加头文件:#include"windows.h"
DWORD GetModuleFileNameA(
HMODULE hModule,//可执行程序或者DLL的实力句柄,为NULL时可执行程序的路径名
LPSTR lpFilename,//接收路径的字符串缓冲区//如果为CString,则要调用GetBuffer转换数据类型
DWORD nSize//接收路径的字符串缓冲区大小
);
//返回值:return nSize 缓冲区字符串的大小
实例程序:
CString strPath;
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
char mstrpath[_MAX_PATH];
::GetModuleFileName(NULL,strPath.GetBuffer(_MAX_PATH+1),_MAX_PATH+1);//注意此处//获取程序绝对路径
strPath.ReleaseBuffer();
_splitpath(strPath,drive,dir,fname,ext);//分解路径
CString str;
str.Format("%s--%s--%s--%s",drive,dir,fname,ext);
AfxMessageBox(str);//E--\C++Program\dgdfh\Debug\--dgdfh--.exe
_makepath(mstrpath,drive,dir,fname,ext);//合成路径
AfxMessageBox(mstrpath);//E:\C++Program\dgdfh\Debug\dgdfh.exe
函数四:GetModuleHandle
函数原型:
HMODULE GetModuleHandleA(
LPCSTR lpModuleName//模块名字可以是.exe,也可以是.dll,此参数为NULL时,默认为.dll
);
//路径必须为\
//返回值为:特定模块的句柄
//注意:该函数不会增加木块的引用计数,无论调用多少次都只调用一次FreeLibrary(),
//该模板就在进程中卸载了。在不同线程中调用该函数不一定一直都有效,在获得模板句柄
//后,另一个线程将该句柄释放了,获得了其他模板的句柄,当再次使用该句柄时就不是一
//开始时获得了句柄了。【此段摘抄,不太懂】
函数五:GetModuleHandleEx
GetModuleHandleEx (dwFlags, lpModuleName, phModule);
dwFlags:
如果是0,则当调用该函数时,模块的引用计数自动增加,调用者在使用完模块句柄后,必须调用一次FreeLibrary
如果是GET_MODULE_HANDLE_EX_FLAG_PIN,则模块一直映射在调用该函数的进程中,直到该进程结束,不管调用多少次FreeLibrary
如果是GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,则同GetModuleHandle相同,不增加引用计数
如果是GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,则lpModuleName是模块中的一个地址
phModule存储要找的句柄。其他都和GetModuleHandle函数相同
函数六:CCommandLineInfo
功能:辅助在应用程序启动时分析命令行,这是一个类
class CCommandLineInfo : public CObject
所需头文件:#include <afxwin.h>
MFC 应用程序通常将创建此类中的本地实例InitInstance其应用程序对象的函数。 然后将此对象传递给CWinApp::ParseCommandLine,从而会反复调用ParseParam填充CCommandLineInfo对象。 CCommandLineInfo对象然后传递给CWinApp::ProcessShellCommand处理命令行参数和标志。
要处理其它的选项,可以从类CCommandLineInfo派生一个子类,然后覆盖函数ParseParam进行相应的处理。
函数七:屏幕坐标,客户区坐标
CRect rect;
GetWindowRect:获取的是整个窗口相对于桌面的rect,而Client坐标不包括非客户区;;;指定窗口的尺寸大小,以屏幕坐标表示,取的是整个窗口的矩形,包括菜单栏,工具栏啥的。
GetClientRect(&rect)::获得窗口客户区的大小,rect(0,0,x,y);;永远是获得左上角的位置
ScreenToClient:屏幕坐标转换为客户区坐标
ClientToScreen:客户区坐标转化为屏幕坐标
GetCursorPos(&pt) 获得光标所在的位置,屏幕坐标表示的。
TextOut:客户区坐标表示的
MoveWindow():对于顶层的CWnd对象,x和y参数是相对于屏幕的左上角的。对于子对象,它们是相对于父窗口客户区的左上角的。
例子:
POINT pt;//CPoint pt;
GetCursorPos(&pt);//该函数检取光标的位置,以屏幕坐标表示, 如果为了与TextOut 相比的话,则需要将屏幕坐标转换为客户区坐标
ScreenToClient(hWnd, &pt);//的将屏幕坐标转换为客户区坐标//TextOut中就是客户区坐标
屏幕坐标:相对于屏幕的左上角,整个电脑屏幕的左上角
客户区坐标:相对于窗口客户区的的左上角,整个应用程序窗口的左上角。
函数八:Invalidate(TRUE/false)
区别:HANDLE HWND
HANDLE : a handle to a object 用来定义任何类型的句柄,包括 hwnd
HWND: a handle to a window :窗口句柄
HMODULE : A handle to a module
HINSTANCE :A handle to an instance.
HWND h_wnd = ::FindWindow(_T("MainForm"), NULL);
HANDLE hMutex = ::CreateMutexW(NULL, TRUE, application);
HMODULE moudle_handle = ::LoadLibraryW(L"shell32.dll");
HINSTANCE inst = ::ShellExecute(NULL, L"open", dir.c_str(), NULL, NULL, SW_SHOW);
参考
1.https://blog.csdn.net/milanleon/article/details/18077911
2.http://www.cnblogs.com/braver/articles/2569837.html
3.https://blog.csdn.net/Gordennizaicunzai/article/details/79464336 示例
4. 屏幕坐标与客户区坐标 https://www.cnblogs.com/wb-DarkHorse/archive/2013/07/08/3178201.html 必须好好理解啦
5. https://blog.csdn.net/wangshubo1989/article/details/53203718