控制台下面使用 OPENFILENAME结构 打开文件

本文介绍了作者在毕设中使用OpenGL开发的一个简单软件,并详细记录了如何通过OPENFILENAME结构实现文件选择功能,特别关注了Unicode的支持及文件路径处理。

毕设是在控制台下面利用opengl做了一个简单的软件,界面截图如下:


最后想增加一个打开文件功能,使用了OPENFILENAME这个结构, 将工程属性设置为unicode字集,

为了支持中文目录:

1,使用宽字符串保存文件目录,

2,然后将wstring转化为string,打开文件。

需要注意的是,使用了这个结构打开文件,工程工作的相对目录会被修改到对话框选择的目录下面,(刚开始不知道这一点,文件老是打开失败,莫名其妙...)所以打开文件的时候,必须调用strrchr函数,求出文件名,

具体代码如下:

BOOL  ret;
OPENFILENAME open_file;
const int  file_name_len = 256;
wchar_t   file_name[ file_name_len ] = L"";
std::wstring  wName;

memset( &open_file, 0, sizeof(OPENFILENAME) );
open_file.lStructSize = sizeof(OPENFILENAME);
open_file.hwndOwner = NULL;
open_file.lpstrFilter = _T("BVH Motion Data (*.bvh)/0*.bvh/0All (*.*)/0*.*/0");
open_file.nFilterIndex = 1;
open_file.lpstrFile = (LPWSTR)file_name;  //
open_file.nMaxFile = file_name_len;
open_file.lpstrTitle = _T("Select a BVH file");
open_file.lpstrDefExt = _T("bvh");
open_file.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

ret = GetOpenFileName( &open_file );

wName = file_name;
fileName = Helper::ws2s( wName ); //unicode转化为多字节  
char* str = const_cast<char*> ( fileName.c_str() );
char* name = strrchr(str, '//') + 1;
//name = "KICK R.bvh"
if( ret )
{
 //Figure的一系列初始化  ....
 Share::setFigure ( new Figure( name ) );
}

#define _CRT_SECURE_NO_WARNINGS #include <windows.h> #include <commctrl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <io.h> // 窗口类名和标题使用宽字符定义 const wchar_t MAIN_CLASS_NAME[] = L"Student Management Window Class"; const wchar_t MAIN_WINDOW_TITLE[] = L"学生信息管理系统"; // 按钮ID #define BUTTON_IMPORT 1 // 初始化共同控件 #pragma comment(lib, "comctl32.lib") void InitCommonControlsWrapper() { INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_LISTVIEW_CLASSES; InitCommonControlsEx(&icex); } // 显示CSV文件内容在控制台 void DisplayCSVContent(const wchar_t* filename) { // 创建控制台窗口 AllocConsole(); // 将宽字符文件名转换为多字节字符串 int filenameLength = WideCharToMultiByte(CP_UTF8, 0, filename, -1, NULL, 0, NULL, NULL); char* narrows = (char*)malloc(filenameLength * sizeof(char)); if (narrows == NULL) { printf("内存分配失败。\n"); FreeConsole(); return; } WideCharToMultiByte(CP_UTF8, 0, filename, -1, narrows, filenameLength, NULL, NULL); // 设置控制台输出编码为UTF-8 _setmode(_fileno(stdout), _O_U16TEXT); FILE* file = fopen(narrows, "r"); free(narrows); if (file) { char line[1024]; while (fgets(line, sizeof(line), file)) { wprintf(L"%s", line); } fclose(file); } else { printf("无法打开文件。\n"); } // 保持控制台窗口打开 system("pause"); // 释放控制台窗口 FreeConsole(); } // 主窗口过程函数 LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: if (LOWORD(wParam) == BUTTON_IMPORT) { OPENFILENAMEW ofn = { 0 }; WCHAR szFileName[MAX_PATH] = { 0 }; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwnd; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.lpstrFilter = L"CSV Files (*.csv)\0*.csv\0All Files (*.*)\0*.*\0"; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetOpenFileNameW(&ofn)) { DisplayCSVContent(szFileName); } } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProcW(hwnd, uMsg, wParam, lParam); } } // 创建和注册窗口类,然后显示窗口 int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR lpCmdLine, int nCmdShow) { InitCommonControlsWrapper(); WNDCLASSEXW wc = { 0 }; wc.cbSize = sizeof(WNDCLASSEXW); wc.lpfnWndProc = MainWndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszClassName = MAIN_CLASS_NAME; RegisterClassExW(&wc); HWND hwnd = CreateWindowExW( 0, MAIN_CLASS_NAME, MAIN_WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 400, NULL, NULL, hInstance, NULL ); if (!hwnd) return 0; CreateWindowExW( 0, L"BUTTON", L"导入", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 100, 20, 80, 30, hwnd, (HMENU)BUTTON_IMPORT, hInstance, NULL ); ShowWindow(hwnd, nCmdShow); MSG msg = { 0 }; while (GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessageW(&msg); } return 0; }这是我现在的代码,现在问题是导入之后不显示csv文件内容
05-20
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值