Ⅰ QT :QString 的getOpenFileName 方法打開文件時路徑時 漢字部分顯示亂碼
fileName=fileDialog->selectedFiles()[0];
code = QTextCodec:: codecForName("gb18030");
std::string strbuffer;
strbuffer = code->fromUnicode(fileName).data();
同時要加上頭文件#include <QTextCodec>。
qt中有自帶的中文字元編碼方式。
Ⅱ c++出學者的提問
程序解析:
1、windows.h是每一個Windows程序都需要的頭文件。
2、WinMain函數是所有Windows C程序的入口,類似於DOS C中的main函數。
3、MessageBox是一個Win32 API函數(API,Application Programming Interface 應用程序介面),其作用是彈出一個對話框,顯示消息的內容。該函數的第一個參數是用來指定父窗口句柄,即對話框所在的窗口句柄。第二個參數是用來顯示消息的內容(你可以修改成你想顯示的內殲櫻容)。第三個參數是 對話框標的標題,如本例的「我的第一個Windows程序」,第四個參數是指定對話框中顯示的按鈕,試一試,將MB_OK修改成MB_OKCANCEL,運行一下程序會出現什麼結果,再試一試修改成MB_RETRYCANCEL
二、Windows 程序簡介
(1)Windows C程序的組成:
1.C程序源文件,擴展名為.c或.cpp
2.頭文件,擴展名為.h
3.資源文件,擴展名為.rc
(2)源程序的組成結構
Windows C程序有相對固定的基本結構,一般有入口函數WinMain和窗口函數。
1、WinMain函數
是所有Windows C程序的入口,類似於DOS C的main函數,其功能是完成一系列的定義和初始化工作,並產生消息循環。消息循環是整個程序運行的核心。
WinMain函數有三個基本的組成部分:函數說明、初始化和消息循環
a、WinMain函數的說明:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
參數說明:
hInstance 應用程序當前實例句柄
hPrevInstance 前一個實例句柄,在32位系統中該參數永遠是NULL
szCmdLine 程序運行時的命令行參數
iCmdShow 程序運行時的顯示方式,如最大化、最小化、隱藏顯示等。
b、初始化
初始化包括窗口類的定義、念友注冊、創建窗口實例和顯示窗口四部分。
這是固定格式,所有的Windows程序基本一樣,記住即可,具體參見下面的程序實例的注釋。
2、窗口函數
窗口函數定義了Windows C程序對接受到的不同消息的響應,其中包含了應用程序對各種可能接收到的消息的處理過程,是消息處理分支控制語句的集合。通常窗口函數是有一個或多個switch語句組成。每一條case語句對應一種消息,當應用程序接收到一個消息時,就會執行相應case 語句下的程序模塊來完成相應的功能。
窗口函數說明:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
參數仔改槐說明:
hwnd 窗口句柄
message 代表所處理消息的消息值
wParam 消息的附加參數,是message的進一步信息
lParam 消息的附加參數,是message的進一步信息
一般用法:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
switch (message)
{
case 常數1:
...
case 常數2:
...
...
case WM_DESTROY:
PostQuitMessage (0) ; //在消息隊列中插入一條「退出」消息
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam);//執行默認的消息處理
}
窗口函數的主體是消息處理語句,該語句是有一系列case語句組成。我們學習者自需要根據窗口可能收到的消息在case語句中編寫相應的處理程序即可。
1.記事本主程序
#include <windows.h>
#include "sample.h"
static char g_szClassName[] = "MyWindowClass";
static HINSTANCE g_hInst = NULL;
#define IDC_MAIN_TEXT 1001
BOOL LoadFile(HWND hEdit, LPSTR pszFileName)
{
HANDLE hFile;
BOOL bSuccess = FALSE;
hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, 0);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwFileSize;
dwFileSize = GetFileSize(hFile, NULL);
if(dwFileSize != 0xFFFFFFFF)
{
LPSTR pszFileText;
pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
if(pszFileText != NULL)
{
DWORD dwRead;
if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
{
pszFileText[dwFileSize] = 0;
if(SetWindowText(hEdit, pszFileText))
bSuccess = TRUE;
}
GlobalFree(pszFileText);
}
}
CloseHandle(hFile);
}
return bSuccess;
}
BOOL SaveFile(HWND hEdit, LPSTR pszFileName)
{
HANDLE hFile;
BOOL bSuccess = FALSE;
hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwTextLength;
dwTextLength = GetWindowTextLength(hEdit);
if(dwTextLength > 0)
{
LPSTR pszText;
pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
if(pszText != NULL)
{
if(GetWindowText(hEdit, pszText, dwTextLength + 1))
{
DWORD dwWritten;
if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
bSuccess = TRUE;
}
GlobalFree(pszText);
}
}
CloseHandle(hFile);
}
return bSuccess;
}
BOOL DoFileOpenSave(HWND hwnd, BOOL bSave)
{
OPENFILENAME ofn;
char szFileName[MAX_PATH];
ZeroMemory(&ofn, sizeof(ofn));
szFileName[0] = 0;
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = "文本文件 (*.txt)\0*.txt\0所有文件 (*.*)\0*.*\0\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrDefExt = "txt";
if(bSave)
{
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT;
if(GetSaveFileName(&ofn))
{
if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
{
MessageBox(hwnd, "保存文件失敗.", "錯誤信息",
MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}
}
}
else
{
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if(GetOpenFileName(&ofn))
{
if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
{
MessageBox(hwnd, "打開文件失敗.", "錯誤信息",
MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}
}
}
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_CREATE:
CreateWindow("EDIT", "",
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE |
ES_WANTRETURN,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
hwnd, (HMENU)IDC_MAIN_TEXT, g_hInst, NULL);
SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT,
(WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
break;
case WM_SIZE:
if(wParam != SIZE_MINIMIZED)
MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam),
HIWORD(lParam), TRUE);
break;
case WM_SETFOCUS:
SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case CM_FILE_OPEN:
DoFileOpenSave(hwnd, FALSE);
break;
case CM_FILE_SAVEAS:
DoFileOpenSave(hwnd, TRUE);
break;
case CM_FILE_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case CM_ABOUT:
MessageBox (NULL, "一個Windows C 記事本程序" , "關於...", 0);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX WndClass;
HWND hwnd;
MSG Msg;
g_hInst = hInstance;
WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style = 0;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = g_hInst;
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
WndClass.lpszMenuName = "MAINMENU";
WndClass.lpszClassName = g_szClassName;
WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&WndClass))
{
MessageBox(0, "注冊窗口失敗", "錯誤信息",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"一個記事本程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
NULL, NULL, g_hInst, NULL);
if(hwnd == NULL)
{
MessageBox(0, "創建窗口失敗", "錯誤信息",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
2.記事本頭文件 sample.h
#define CM_FILE_SAVEAS 9072
#define CM_FILE_EXIT 9071
#define CM_FILE_OPEN 9070
#define CM_ABOUT 9069
3.記事本資源文件
#include "sample.h"
A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "sample.ico"
MAINMENU MENU
{
POPUP "文件(&F)"
{
MENUITEM "打開(&O)...", CM_FILE_OPEN
MENUITEM "另存為(&S)...", CM_FILE_SAVEAS
MENUITEM SEPARATOR
MENUITEM "關閉", CM_FILE_EXIT
}
POPUP "幫助(&H)"
{
MENUITEM "關於(&A)", CM_ABOUT
}
}
一點經驗
所有Windows 程序的基本結構都與上面的實例相同或相近(說明:有的程序是將窗口類和窗機窗口封裝成函數後調用,其實質是一樣的),記住一個例子,編寫其他程序時,在其上面修改即可。
一點建議:由於Windows 編程精大博深,初學者想把什麼都搞明白是不可能的,要學會一點「不求甚解」 ,這里說的「不求甚解」並不是指不認真學習。初學者最怕鑽牛角尖:一個問題不明白,就在那裡卡住,非解決它不可——這種方法是不可取的。
首先,它會嚴重打擊你的自信心,使你喪失繼續學習下去的興趣;
其次,這樣浪費了許多時間。因此學習時要給自己留一些「不懂」的餘地。例如第一遍讀書時要允許自己似懂非懂,用規定的時間(例如兩個星期)把它看完,然後開始第二遍學習。開始時許多不明白的東西,下次就容易理解多了。
Ⅲ VC++菜鳥問題 拖拽文件到文本框獲取文件路徑簡單問題
//DLG.cpp:
#include"drag.h"
#include"fileedit.h"//添加這一行
#include"DLG.h"//要添加在這一行之前
在兩個對話框類的cpp文件中,包含自定義類的頭文件,注意要保證在對話框類頭文件之前。
//dragDlg.cpp:
#include"stdafx.h"
#include"drag.h"
#include"fileedit.h"//同理
#include"dragDlg.h"
Ⅳ Visual C++中GetOpenFileName與CFileDialog函數的區別
GetOpenFileName是一個弊卜Windows api函數,CFileDialog是MFC中的一個類,封畝絕裝了迅卜姿對前者的調用
Ⅳ OPENFILENAME 的用法
不知道你現在是學到哪滑高里,我就詳細點解答吧。首先,OPENFILENAME在頭文件是沒有的,所以只有自己創建。
openFileName(char* pathName,char* textContent){
CFile file(pathName,CFile::modeRead); //以只讀方式打開
file.Read(textContent,file.GetLenght()); //讀取
textContent[file.GetLenght()]='\0'; //臘讓數讀取的文本內容後加0有利於後面的輸輪首出
file.Close(); //關閉文件
}
int main(){
char a[]="C:\test.txt";
char* outPut;
openFileName(a,outPut);
cout<<outPut;
}
以上用的是CFile類,也可以用文件流的FILE類,代碼差不多
Ⅵ C++ 讀別人的程序,製作了下面的頭文件,包含在主程序當中,但是我讀不懂啊,好多不認識,求大神給解釋!
前三行注釋,沒用
#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
就是這個(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)沒有定義的話,下面定義一下
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
這一段的意思是如果
_MSC_VER > 1000這個條件滿足
就執行#pragma once
#pragma once的作用防止頭文件重復包肢祥辯含
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
#include <process.h> /* _getpid() */
#include <shellapi.h> /* ShellExecute() */
這一段要用到的是window系統內的函數,所以先聲明,後面的幾個.h文件是調用的是window系統中的函數宴棗
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <stdio.h> /* sprintf() */
#include <oledlg.h> /* OPENFILENAME */
這一段類似,是用到C語言中(編譯器中)的函數,下面的.h是調用那些函數
// Local Header Files
// TODO: reference additional headers your program requires here
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
這一段也是沒用的東西,注釋
最後就是定義結束了
#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
反正你只要看到/* */和// 就是注釋,沒起任何作用
頭文件的作用在編譯器中都會有說明,或者網路一下都可以歷缺找到,個人建議去編譯去中看