WinAPI:GetOpenFileName、GetSaveFileName、OFNHookProc

一、GetSaveFileName

函数功能:该函数创建一个Open公共对话框,使用户指定驱动器、目录和文件名、或使用户打开文件。

    函数原型:BOOL GetOpenFileName(LPOPENFILENAME Ipofn);

    参数:

    Ipofn:指向包含初始化对话框的信息的一个OPENFILENAME结构。当OpenfileName函数返回时,此结构包含有关用户文件选择的信息。

    返回值:如果用户指定了一个文件名,点击OK按钮,返回值为非零。由OPENFILENAME结构的IPstrFile成员指向的缓冲区含有全路径和用户指定的文件名。如果用户取消或关闭Open对话框或错误出现,返回值为零。


二、GetSaveFileName

    函数功能:该函数创建一个Save公共对话框,以便用户指定驱动器、目录和文件名。

    函数原型:BOOL GetSaveFileName(LPOPENFILENAME Ipofn);

    参数:

    Ipofn:指向一个包含初始化对话框信息的OPENFILENAME结构。当GetsaveFileName函数返回时,此结构含有关于用户文件选择的信息。

    返回值:如果用户指定了一个文件名且点击OK按钮,返回值为非零值。由OPENFILENAME结构中的归IpstrFile成员指向的缓冲区含有全路径和用户指定的文件名。如果用户取消或关闭Save对话框或错误出现,返回值为零。


三、OFNHookProc

    函数功能:该挂钩函数是应用程序定义的或库定义的回调函数,此回调函数与Explorer_Style和Save As公共对话框一起使用。函数贮存从公共对话框发送来的消息或通知LPOFNHOOKPROC类型定义一个指向回调函数指针,OFNHOOKProc是应用程序定义的或库定义的函数名的位置占有者,当创建一个Open或Save As公共对话框时,如果没有指定OFN_EXPLORER标志且需一个挂钩函数。必须用旧式的OFNHookProcOldSttyle挂钩函数。这种情况下对话框将显示旧式的用户界面。

    函数原型:UINT CALLBACK OFNHookProc(HWND hdlg,UINT uiMsg,WPARAM wParam,LPARAM IParam);

    参数:

    hdlg:指向Open或Save as对话框的子对话框的句柄。用GetParent函数可得到指向Open或Save As对话框窗口的句柄。

    uiMsg.标识存放的消息。

    wParam:指定有关消息的其他信息。精确的意义要根据uiMSg参数的值来决定。

    IParam;指定有关消息的其他信息。精确的意义要根据uiMsg参数的值来决定。如果uiMsg参数显示了WM_INITDIALOG消息,IParam是一个指向OPENFILENAME结构的指针。该结构含有创建对话框时指定的值。

    返回值:如果挂钩函数返回零,缺省对话框函数处理消息。如果挂钩函数返回非零值,缺省对话框函数忽略消息。对于CDN_SHAREVIOLATION和CDN_FILEOK通告消息,挂钩函数应该返回非零值,以表明已经利用SetWindowLong函数设置了一个非零DWL_MSGRESULT值。

三、样例

UINT_PTR CALLBACK  OpenFileNametHook (HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam)
{
	switch(uiMessage)
	{
	case WM_INITDIALOG:
		{
				int a = 3;
		}
	
		break;
	default:
		break;
	}
	return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择:
		switch (wmId)
		{
		case ID_TEST:
			{
				TCHAR szFile[MAX_PATH] = {0x00};
				OPENFILENAME ofn = {sizeof(OPENFILENAME)};
				//ZeroMemory( &ofn , sizeof( ofn));  

				ofn.lStructSize = sizeof ( ofn );  

				ofn.hwndOwner = hWnd  ;  

				//ofn.lpstrFile = TEXT("C:\\Users\\Public\\Pictures\\Sample Pictures\\菊花.jpg") ;  

				//ofn.lpstrFile[0] = '\0';  

				ofn.nMaxFile = sizeof( szFile );  

				ofn.lpstrFilter = TEXT("All\0*.*\0Text\0*.TXT\0Bmp\0*.bmp");  

				ofn.nFilterIndex =1;  

				ofn.lpstrFileTitle = NULL ;  

				ofn.nMaxFileTitle = 0 ;  

				ofn.lpstrInitialDir=NULL ;  

				ofn.Flags =  OFN_ENABLEHOOK ; 
				ofn.lpfnHook = OpenFileNametHook;
				GetOpenFileName(&ofn);
				GetSaveFileName(&ofn);
			}
			
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: 在此添加任意绘图代码...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}



你可能感兴趣的:(Windows,API)