**
MFC問題方法總結
**
1.在對話框中添加一張圖檔(bmp);
void CMFC090201Dlg::OnPaint()
{
CPaintDC dc(this); // 用于繪制的裝置上下文
CBitmap bmp;
if (!bmp.LoadBitmap(IDB_LIT))
return;
BITMAP bm;
bmp.GetBitmap(&bm);
CDC mdc;
mdc.CreateCompatibleDC(&dc);
mdc.SelectObject(&bmp);
dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&mdc,0,0,SRCCOPY);
}
2.MFC改變picture控件的大小和位置;
SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
- 第一個參數我不會用,一般設為NULL;
- x、y控件位置;cx、cy控件寬度和高度;
-
nFlags常用取值:
SWP_NOZORDER:忽略第一個參數;
SWP_NOMOVE:忽略x、y,維持位置不變;
SWP_NOSIZE:忽略cx、cy,維持大小不變;
CWnd *pWnd;
pWnd = GetDlgItem( IDC_picture ); //擷取控件指針,IDC_BUTTON1為控件ID号
pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE ); //把按鈕移到視窗的(50,80)處
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE ); //把編輯控件的大小設為(100,80),位置不變
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER ); //編輯控件的大小和位置都改變
以上方法也适用于各種視窗。
或者:
CRect rect;
GetDlgItem(IDC_DRAW_AREA)->GetWindowRect(&rect); //IDC_WAVE_DRAW為Picture Control的ID
ScreenToClient(&rect);
GetDlgItem(IDC_DRAW_AREA)->MoveWindow(rect.left, rect.top, 800, 450, true); //固定Picture Control控件的大小
3.擷取picture控件的長和寬;
CRect rect;
CWnd *pWnd = GetDlgItem(IDC_picture);//IDC_picture為picture控件ID
pWnd->GetClientRect(&rc);//rc為控件的大小。
int x=rect.Height();
int y=rect.Width()。
4.在picture控件添加icon,屬性改為icon,在OnInitDialog()函數下面:
CStatic pStatic = (CStatic)GetDlgItem(IDC_STATIC); //IDC_STATIC picture控件的Id
m_hIconLed = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_OFF));
pStatic->SetIcon(m_hIconLed);
5.建立MFC單文檔工程:
項目類型選MFC标準,去掉初始狀态欄,去掉使用視窗停靠工具欄,粗架構表示可以用滑鼠改變視窗大小;
為菜單按鈕添加消息處理函數,先将標明的按鈕屬性Popup改為False,系統會自動給這個按鈕添加ID,然後右鍵按鈕可以添加消息處理函數。
如果想單機按鈕彈出對話框,要建立對話框和類,然後按鈕的消息處理函數消息類型為COMMAND,類清單為選View類型的類;
6.雙緩沖繪圖:
CDC MyDC;
CBitmap bmp;
CRect rect;
CDC *dc = m_picDraw.GetDC(); //獲得picture控件DC
m_picDraw.GetClientRect(&rect); //picture控件位圖
MyDC.CreateCompatibleDC(dc); //依附視窗DC pDC建立相容記憶體DC MyDC
bmp.CreateCompatibleBitmap(dc, rect.Width(), rect.Height()); //建立記憶體相容位圖
MyDC.SelectObject(&bmp); //把記憶體位圖選進記憶體DC中用來儲存在記憶體DC中繪制的圖形 //待了解
MyDC.FillSolidRect(rect, RGB(255, 255, 255)); //背景填充白色,否則可能為黑色
MyDC.FillSolidRect(rect, dc->GetBkColor());
…添加畫圖代碼…
dc->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &MyDC, 0, 0, SRCCOPY);
bmp.DeleteObject();
MyDC.DeleteDC();
ReleaseDC(dc);
7.擷取目前對話框DC,畫直線:
CDC *pDC=GetDC();
pDC->MoveTo( 270, 560 ); pDC->LineTo( 280, 560 );
ReleaseDC(pDC);
8.MFC在對話框上添加訓示燈:(icon圖示)
1.先在資源視圖中添加icon圖示,再在.h檔案中添加兩個HICON變量;
HICON m_hlcon_open;
HICON m_hlcon_close;
2.在OnInitDialog()函數内添加:
m_hlcon_open = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1));
m_hlcon_close = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON2));
3.在相應的按鈕函數體内添加(也可以用定時器實作閃爍):
m_icon_light.SetIcon(m_hlcon_open); 或 m_icon_light.SetIcon(m_hlcon_close);
(m_icon_light為picture控件的變量,IDI_ICON1、IDI_ICON2為訓示燈icon圖示)
9.在Button控件上添加BMP圖檔:
1.先在資源視圖中添加BMP圖檔,再在.h檔案中添加兩個HBITMAP變量;
HBITMAP m_HB_bmp1;
HBITMAP m_HB_bmp2;
2.在OnInitDialog()函數内添加:
m_HB_bmp1 = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
m_HB_bmp2 = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP2));
3.在相應的按鈕函數體内添加
m_set.SetBitmap(m_HB_bmp1); 或 m_set.SetBitmap(m_HB_bmp2);
(m_set是CButton類型的控制變量,需要将Button的屬性Bitmap改成True)
10.MFC在按鈕上添加圖示和文字共同顯示:
在程式檔案中添加CButtonST檔案(BtnST.h、BtnST.cpp、BCMenu.h、BCMenu.cpp);
在對話框頭檔案中添加#include “BtnST.h”,再添加成員變量 CButtonST m_btn;
在OnInitDialog()函數内添加内添加:
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
// m_btn.SetAlign(CButtonST::ST_ALIGN_VERT); //确定圖示和文字的位置
// m_btn.SetFlat(FALSE); //去掉顯示平面按鈕
// m_btn.DrawTransparent(TRUE); //無邊框顯示
11.GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE); //設定控件内容不能改
GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE); //設定控件内容能改
12.MFC設定對話框中控件上文字的字型、大小和顔色:
1.在對話框頭檔案中添加一個CFont類型的私有成員變量:
CFont m_font; // 改變字型和大小
CBrush m_brush; // 改變背景顔色
2.在源檔案的構造函數中添加初始化變量的代碼:
m_font.CreatePointFont(200,L"楷體");
m_brush.CreateSolidBrush(RGB(0,0,255));
3.添加對話框消息WM_CTLCOLOR的響應函數OnCtlColor(),在函數體内添加代碼:
if (pWnd->GetDlgCtrlID() == IDC_STATIC_Message)
{
pDC->SelectObject(&m_font);
}
if (pWnd->GetDlgCtrlID() == IDC_STATIC_Message) //設定字型顔色
{
pDC->SetTextColor(RGB(0,128,255));
// pDC->SetBkMode(TRANSPARENT); //背景透明
}
13.MFC建立檔案:
A. 第一種方法:
1.在頭檔案中添加:
#include //C++輸出流,為了建立檔案
#include
using namespace std;
2.在源程式中添加:
CString m_strPath; //擷取目前exe可執行程式的路徑
int nPos;
GetModuleFileName(NULL, m_strPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
m_strPath.ReleaseBuffer();
nPos = m_strPath.ReverseFind(_T(’\’));
m_strPath = m_strPath.Left(nPos);
CString filepath,filename; //在該路徑下建立Config.h檔案
filename = "\\Config.h";
filepath = m_strPath + filename;
ofstream fout(filepath);
fout<<"輸出内容"<<endl;
附加:(解決CString類型無法輸出到檔案中的問題)
std::string str1 = CStringA(m_edit_CG_PW);
fout << str1.c_str() << endl;
B.第二種方法:
fout.open("./bin.txt"); //目前目錄下生成bin.txt // ../bin.txt 上級目錄下生成bin.txt
14.建立顔色對話框類
CColorDialog dlg; //類中結構體變量成員m_cc中的rgbResult變量用于儲存使用者選擇的顔色
建立字型對話框類
CFontDialog dlg; //類中結構體變量成員m_cf中的lfFaceName變量用于存放字型的名稱
15.檔案對話框的建立
1.選擇某路徑下的檔案(檔案)
void CExample17Dlg::OnBnClickedOpenButton()
{
// TODO: Add your control notification handler code here
// 設定過濾器
TCHAR szFilter[] = _T(“文本檔案(.txt)|.txt|所有檔案(.)|.||”);
// 構造打開檔案對話框
CFileDialog fileDlg(TRUE, _T(“txt”), NULL, 0, szFilter, this);
CString strFilePath;
// 顯示打開檔案對話框
if (IDOK == fileDlg.DoModal())
{
// 如果點選了檔案對話框上的“打開”按鈕,則将選擇的檔案路徑顯示到編輯框裡
strFilePath = fileDlg.GetPathName();
SetDlgItemText(IDC_OPEN_EDIT, strFilePath);
}
}
2.選擇路徑,用于儲存檔案(路徑)
void CExample17Dlg::OnBnClickedSaveButton()
{
// TODO: Add your control notification handler code here
// 設定過濾器
TCHAR szFilter[] = _T("文本檔案(*.txt)|*.txt|Word檔案(*.doc)|*.doc|所有檔案(*.*)|*.*||");
// 構造儲存檔案對話框
CFileDialog fileDlg(FALSE, _T("doc"), _T("my"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);
CString strFilePath;
// 顯示儲存檔案對話框
if (IDOK == fileDlg.DoModal())
{
// 如果點選了檔案對話框上的“儲存”按鈕,則将選擇的檔案路徑顯示到編輯框裡
strFilePath = fileDlg.GetPathName();
SetDlgItemText(IDC_SAVE_EDIT, strFilePath);
}
}
16.MFC Edit控件設定右側滑條:
Multiline -> True; //表示該控件支援多行
Want Return -> Ture; //表示該控件支援換行輸入
Auto HScroll -> False; //當使用者在行尾鍵入一個字元時,正文将自動向右滾動10 個字元,當使用者按Enter鍵時,正文總是滾向左邊
Auto VScroll -> True; //當使用者在最後一個可見行按Enter鍵時,正文向上滾動一頁
Vertical Scroll -> True; //表示該控件具有垂直滾動條
20.MFC 建立子程序、線程:
1.建立子程序(Process):
STARTUPINFO sui;
PROCESS_INFORMATION pi;
ZeroMemory(&sui,sizeof(STARTUPINFO));
sui.cb = sizeof(STARTUPINFO);
sui.wShowWindow = SW_SHOW; //隐藏指令行視窗
sui.dwFlags = STARTF_USESHOWWINDOW; //啟動标志,顯示視窗
char lpPath[] = “calc”;
BOOL bret = CreateProcess(NULL ,lpPath, NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi); //第一個參數需要寫可執行程式的路徑和程式名或第二個參數寫指令欄的輸入指令
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
2.建立線程(Thread):
HANDLE hThread;
hThread = CreateThread(NULL,0,FunProc,NULL,0,NULL); //第三個參數指向應用程式定義的函數指針,由新線程執行,表明新線程的起始位址
CloseHandle(hThead);
17.MFC 打開外部.exe的四種方法
1.通過建立子程序的方式(如上述例20);
2.WinExec()函數,使用方法如下:
WinExec(“Notepad.exe”, SW_SHOW); // 打開記事本
WinExec(“D:\Program Files\Test\Test.exe”,SW_SHOWMAXIMIZED); // 以最大化的方式打開Test.exe
注:隻能用于打開exe檔案。
3.ShellExecute()函數,使用方法如下:
ShellExecute(NULL,“open”,“C:\Test.txt”,NULL,NULL, SW_SHOWNORMAL); // 打開C:\Test.txt 檔案
ShellExecute(NULL, “open”, “http://www.google.com/”, NULL, NULL, SW_SHOWNORMAL); // 打開網頁www.google.com
ShellExecute(NULL,“explore”, “D:\C++”,NULL,NULL,SW_SHOWNORMAL); // 打開目錄D:\C++
ShellExecute(NULL,“print”,“C:\Test.txt”,NULL,NULL , SW_HIDE); // 列印檔案C:\Test.txt
ShellExecute不支援定向輸出,操作指令有(open、print、edit、explore、find等)。
4.ShellExecuteEx()函數;
18.Inno Setup打包程式:
https://jingyan.baidu.com/article/36d6ed1f50ecfc1bcf4883aa.html
19.控件設定:
1.設定控件為不可標明狀态:
GetDlgItem(IDC_EDIT)->EnableWindow(FALSE); 或 m_edit.EnableWindow(FALSE);
2.設定Radio Button為非選中狀态:
m_check.SetCheck(0);
3.設定控件文本内容:
m_SendCtrl.SetWindowText(“hello”); 或者 SetDlgItemText(IDC_EDIT, “hello”);
擷取控件文本内容:
CString temp;
m_OpenCloseCtrl.GetWindowText(temp);
4.設定Combo Box的值:
m_combo.SetCurSel(0);
擷取目前值:
int index=m_combo.GetCurSel();
插入值:
m_combo.AddString(“1000”);
5.設定控件在視窗的固定位置:
CWnd *pWnd;
pWnd = GetDlgItem(IDC_STATIC_CTRL_PIC); pWnd->SetWindowPos(NULL, 282, 48, 771, 512, SWP_NOZORDER);
6.視窗加載位圖:
dc.BitBlt(20, 450, bm.bmWidth, bm.bmHeight, &mdc, 0, 0, SRCCOPY);
或
dc.StretchBlt(22, 450, 192, 110, &mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
7.設定編輯框中内容為空:
m_edit.SetWindowText(""); 或 SetDlgItemText(IDC_EDIT, NULL);
20.MFC字元處理:
1.CString::ReverseFind() 和 Find(),查找字元,傳回值為字元的索引,索引從左往右且從0開始;
例:CString s( “abcab” );
ASSERT( s.ReverseFind( ‘b’ ) == 4 ); // ReverseFind() 是從右往左查找 ,ps:左邊的例子找到的’b’是從左往右的第二個
ASSERT( s.Find( ‘b’ ) == 1 ); // Find() 是從左往右查找
2.CString::Left(int nCount) —傳回字元串前nCount個字元的字元串
例:CString str(_T(“Shop,工廠中的房間”));
str = str.Left(4);
結果:str=“Shop”;
3.CString::Right(int nCount) —傳回字元串後nCount個字元的字元串
例:CString str(_T(“Shop,工廠中的房間”));
str = str.Right(2);
結果:str=“工廠中的房間”;
4.substr() —擷取字元串中指定長度位置的字元
例:string s(“12345asdf”);
string a=s.substr(0,5); //獲得字元串s中 從第0位開始的長度為5的字元串 //預設時的長度為從開始位置到尾
結果:a=12345
5.Cstring::GetLength() —傳回的是字元個數(不包括結尾的空字元)。
CString 本身就是TCHAR的封裝,是以你定義了UNICODE那麼他就占兩個位元組,否則就是一個位元組。
按照MSDN的說嗎,在選用MBCS多位元組字元串編碼時,該方法會得到正确的位元組數。此時沒有問題。
但是在Unicode編碼下,一旦出現中文字元,該方法就會少統計。(出現一個中文可能按兩個位元組算)
例:https://www.cnblogs.com/ransn/p/8016564.html
21.CString函數:
連結:https://blog.csdn.net/shufac/article/details/20737799
1.void MakeReverse( ); —颠倒字元串的順序
例:csStr=“ABCDEF中文123456”;
csStr.MakeReverse();
結果:654321文中FEDCBA
2.void MakeUpper( ); —将小寫字母轉換為大寫字母
例:csStr=“abcdef中文123456”;
csStr.MakeUpper();
結果:ABCDEF中文123456
3.void MakeLower( ); —将大寫字母轉換成小寫字母
例:csStr=“ABCDEF中文123456”;
csStr.MakeLower();
結果:abcdef中文123456
4.int Compare( LPCTSTR lpsz ) const; —區分大小寫比較兩個字元串,相等時傳回0,大于時傳回1,小于時傳回-1
例:csStr=“abcdef中文123456”;
csStr2=“ABCDEF中文123456”; //結果:-1
5.int CompareNoCase( LPCTSTR lpsz ) const; —不區分大小寫比較兩個字元串,相等時傳回0,大于時傳回1,小于時傳回-1
例:csStr=“abcdef中文123456”;
csStr2=“ABCDEF中文123456”; //結果:1
6.int Delete( int nIndex, int nCount = 1 ) —删除字元,删除從下标nIndex開始的nCount個字元
例:csStr=“ABCDEF”;
csStr.Delete(2,3); //結果:ABF
7.int Insert( int nIndex, TCHAR ch ) —在下标為nIndex的位置,插入字元或字元串。傳回插入後對象的長度
int Insert( int nIndex, LPCTSTR pstr )
例:csStr=“abc”; csStr=“abc”;
csStr.Insert(2,‘x’); //結果:abxc csStr.insert(2,“xyz”); //結果:abxyzc
8.int Remove( TCHAR ch ); —移除對象内的指定字元,傳回移除的數目
例:csStr=“aabbaacc”;
csStr.Remove(‘a’); //結果:bbcc
9.int Replace( TCHAR chOld, TCHAR chNew ); —替換字元或者字元串
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
例:csStr=“abcdef”; csStr=“abcdef”;
csStr.Replace(‘a’,‘x’); //結果:xbcdef csStr.Replace(“abc”,“xyz”); //結果:xyzdef
10.void TrimLeft( ); void TrimLeft( TCHAR chTarget );
如果沒有參數,從左删除字元(\n\t空格等),至到遇到一個非此類字元。
或從左删除字元,被删的字元與chTarget或lpszTargets比對,一直删到第一個不比對的字元為止
11.void TrimRight( ); void TrimRight( TCHAR chTarget ); void TrimRight( LPCTSTR lpszTargets );
12.void Empty( ); —清空
13.void SetAt( int nIndex, TCHAR ch ); —給下标為nIndex的字元重新指派
例:csStr=“abcdef”;
csStr.SetAt(2,‘x’); //結果:abxdef
22.MFC字元類型轉換:
1.CString.Format用法:
Format用于轉換的格式字元:%c 單個字元、%d 十進制整數(int)、%ld 十進制整數(long)、%f 十進制浮點數(float)、%lf 十進制浮點數(double)、
%o 八進制數、%s 字元串、%u 無符号十進制數、%x 十六進制數
例:CString str;
str.Format(_T("%02X"), m_int); //把整型數轉換成十六進制字元兩位輸出,155->9B
2.strtol()字元串轉長整型函數:
例:int m = (int)strtol(str, &m_1, 16); //把str轉換成16進制整數
3.itoa();将整型值轉換為字元串;
4.atoi();将字元串轉換成整型值;
23.MFC Create()函數:
BOOL Create(
LPCTSTR lpszClassName, //類名,如果為NULL,使用預定義的預設CFrameWnd屬性
LPCTSTR lpszWindowName, // 視窗标題
DWORD dwStyle = WS_OVERLAPPEDWINDOW, //視窗風格 WS_VISIBLE->窗體可見
const RECT& rect = rectDefault, //視窗大小
CWnd* pParentWnd = NULL, //指定父視窗
LPCTSTR lpszMenuName = NULL, //菜單
DWORD dwExStyle = 0, //視窗擴充風格
CCreateContext* pContext = NULL); //多文檔與單文檔視窗時使用