|
(1) 練習(xí)使用MFC對(duì)話框程序,練習(xí)使用控件:按扭,編輯框,下拉框,列表框,菜單,響應(yīng)鼠標(biāo)左鍵單擊按下/彈出,響應(yīng)鼠標(biāo)右鍵單擊。定時(shí)器和進(jìn)度條的練習(xí)使用。 (2) 練習(xí)把自己的MFC對(duì)話框程序增加全屏功能(1024*768及1024*768以上分辨率的處理),還有界面貼圖美化的練習(xí)。
在MFC的button控件上貼圖: 1、在資源管理器中添加一個(gè)button控件,該控件的ID為IDC_BUTTON1。 2、在button的屬性中,將其中的Owner Draw設(shè)置為TRUE。(設(shè)置為用戶自繪控件)。 3、在該對(duì)話框的代碼中的頭文件中添加CBitmapButton 類對(duì)象 m_BitmapButton。 4、在窗口的初始化函數(shù)中,為該類的對(duì)象添加圖片,m_BitmapButton.LoadBitmaps(IDB_BITMAP1); 5、將該類與當(dāng)前擁有控件的窗口綁定起來(lái),m_BitmapButton.SubclassDlgItem(IDC_BUTTON1,this); 6、將控件的大小轉(zhuǎn)換到和圖片大小一樣,m_BitmapButton.SizeToContent(); 按鍵在熱點(diǎn)效果時(shí)顯示不同的圖片1:新建一個(gè)類。 
2:Base class 選擇CButton(繼承CButton類) 
3:插入圖片用于熱點(diǎn)和非熱點(diǎn)圖片資源。 




4:在CBmpButton的頭文件中聲明保存按鈕在熱點(diǎn)和非熱點(diǎn)時(shí)顯示的圖片資源、自定義聲明SetHBitmap()函數(shù)用來(lái)設(shè)置按鈕顯示的圖片資源。 
5:在CBmpButton的頭文件中聲明WM_MOUSEMOVE事件處理函數(shù)OnMouseMove捕捉鼠標(biāo)的位置—當(dāng)鼠標(biāo)在按鈕上時(shí)顯示熱點(diǎn)圖片,否則顯示非熱點(diǎn)圖片。    6: CBmpButton的頭文件為 #if !defined(AFX_BMPBUTTON_H__F5347CC7_F08E_47AB_A1D2_AEAFF74DA65C__INCLUDED_) #define AFX_BMPBUTTON_H__F5347CC7_F08E_47AB_A1D2_AEAFF74DA65C__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // BmpButton.h : header file // ///////////////////////////////////////////////////////////////////////////// // CBmpButton window class CBmpButton : public CButton { // Construction public: CBmpButton(); HBITMAP m_Hbitmap1; //m_Hbitmap1保存按鈕在熱點(diǎn)時(shí)顯示的圖片資源 HBITMAP m_Hbitmap2; //m_Hbitmap2保存按鈕在非熱點(diǎn)時(shí)顯示的圖片資源 // Attributes public: // Operations public: void SetHBitmap(HBITMAP m_Hbitmap1,HBITMAP m_Hbitmap2) ; //用來(lái)保存按鈕顯示的圖片資源 // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CBmpButton) //}}AFX_VIRTUAL // Implementation public: virtual ~CBmpButton(); // Generated message map functions protected: //{{AFX_MSG(CBmpButton) afx_msg void OnMouseMove(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_BMPBUTTON_H__F5347CC7_F08E_47AB_A1D2_AEAFF74DA65C__INCLUDED_) 7:寫SetHBitmap()函數(shù)中的代碼 void CBmpButton::SetHBitmap(HBITMAP m_hbmap1,HBITMAP m_hbmap2) { m_Hbitmap1=m_hbmap1; //將圖片資源保存到變量中 m_Hbitmap2=m_hbmap2; //將圖片資源保存到變量中 } 8:寫OnMouseMove()函數(shù)代碼 void CBmpButton::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CButton::OnMouseMove(nFlags, point); //獲取鼠標(biāo)移動(dòng)的坐標(biāo)位置 CRect rect; GetClientRect(&rect); //獲取按鈕的矩形區(qū)域 if(rect.PtInRect(point)) //判斷鼠標(biāo)移動(dòng)的坐標(biāo)位置是否在按鈕的矩形區(qū)域當(dāng)中 { SetCapture(); SetBitmap(m_Hbitmap1); } else { ReleaseCapture(); SetBitmap(m_Hbitmap2); } } 9:設(shè)置按鈕屬性   為按鈕關(guān)聯(lián)變量  10:在包含按鈕的窗口類的初始化窗口函數(shù)(OnInitDialog()) BOOL CLogin::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here //當(dāng)初始化窗口時(shí),先載入的圖片 m_test.SetBitmap(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_HOU))); //當(dāng)鼠標(biāo)移動(dòng)到按鈕范圍內(nèi)時(shí)變IDB_QIAN,移出按鈕范圍后還原IDB_HOU m_test.SetHBitmap(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_QIAN)), LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_HOU))); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } 11:鼠標(biāo)無(wú)法抓屏鼠標(biāo)直接畫出   
例如:等待的是一個(gè)CEvent event; event.SetEvent();
WaitForSingleObject 當(dāng)指定的對(duì)象處于有信號(hào)狀態(tài)或者等待時(shí)間結(jié)束的狀態(tài)時(shí),此函數(shù)返回。 DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 參數(shù): hHandle:指定對(duì)象或事件的句柄; dwMilliseconds: 等待時(shí)間,以毫妙為單位,當(dāng)超過(guò)等待時(shí)間時(shí),此函數(shù)將返回。如果該參數(shù)設(shè)置為0,則該函數(shù)立即返回,如果設(shè)置為INFINITE,則該函數(shù)直到有信號(hào)才返回。 返回值: 如果此函數(shù)成功,該函數(shù)的返回之標(biāo)識(shí)了引起該函數(shù)返回的事件。返回值如下: WAIT_ABANDONED(0x00000080L) 指定的對(duì)象是一個(gè)互斥對(duì)象,該對(duì)象沒(méi)有被擁有該對(duì)象的線程在線程結(jié)束前釋放。互斥對(duì)象的所有權(quán)被同意授予調(diào)用該函數(shù)的線程。互斥對(duì)象被設(shè)置成為無(wú)信號(hào)狀態(tài)。 WAIT_OBJECT_0 (0x00000000L) 指定的對(duì)象出有有信號(hào)狀態(tài)。 WAIT_TIMEOUT (0x00000102L) 超過(guò)等待時(shí)間,指定的對(duì)象處于無(wú)信號(hào)狀態(tài) 如果失敗,返回 WAIT_FAILED; 備注: 此函數(shù)檢查指定的對(duì)象或事件的狀態(tài),如果該對(duì)象處于無(wú)信號(hào)狀態(tài),則調(diào)用線程處于等待狀態(tài),此時(shí)該線程不消耗CPU時(shí)間, 該函數(shù)可以等待如下對(duì)象: Change notification Console input Event Job Memory resource notification Mutex Process Semaphore Thread Waitable timer
CreateThread()函數(shù)在調(diào)用進(jìn)程的地址空間上創(chuàng)建一個(gè)線程,以執(zhí)行指定的函數(shù);返回值為所創(chuàng)建線程的句柄。 ExitThread()函數(shù)用于結(jié)束本線程。 SuspendThread()函數(shù)用于掛起指定的線程。 ResumeThread()函數(shù)遞減指定線程的掛起計(jì)數(shù),掛起計(jì)數(shù)為0時(shí),線程恢復(fù)執(zhí)行。
SuspendThread是掛起指定的線程,不同于Sleep只能掛起其所在的線程并在時(shí)間間隔超過(guò)后自動(dòng)回復(fù),而SuspendThread掛起的線程則需要使用ResumeThread回復(fù)。 SuspendThread函數(shù)原型如下: DWORD WINAPI SuspendThread( HANDLE hThread); 參數(shù): hThead:輸入?yún)?shù),需要掛起的文件句柄。 返回值: 如果返回-1(0xFFFFFFFF),表示失敗;如果返回整數(shù),表示線程已經(jīng)被掛起過(guò)得次數(shù)。 ResumeThread可以恢復(fù)被SuspendThread掛起的線程的執(zhí)行。 ResumeThread函數(shù)原型: DWORD WINAPI ResumeThread( HANDLE hThread); CWinThread 例如: *p1=AfxBeginThread(thread1event,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);//創(chuàng)建并掛起 p1->ResumeThread();//執(zhí)行線程thread1event p1->SuspendThread();//掛起線程thread1event
void CMulThreadDlg::OnBnClickedButtonTheadsametime() { // TODO: 在此添加控件通知處理程序代碼 CWinThread *p1=AfxBeginThread(thread1event,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); // 線程1 優(yōu)先級(jí)與主線程共同 掛起線程直到RusumeThread p1->ResumeThread(); eventto.SetEvent();//CEvent eventto CWinThread *p2=AfxBeginThread(thread2event,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); p2->ResumeThread(); } UINT thread1event( LPVOID pParam ) { CMulThreadDlg *eve1=(CMulThreadDlg *)pParam; while (1) { WaitForSingleObject(eventto.m_hObject,INFINITE); /* hHandle:指定對(duì)象或事件的句柄; dwMilliseconds: 等待時(shí)間,以毫妙為單位,當(dāng)超過(guò)等待時(shí)間時(shí),此函數(shù)將返回。如果該參數(shù)設(shè)置為0,則該函數(shù)立即返回,如果設(shè)置為INFINITE,則該函數(shù)直到有信號(hào)才返回。 */ eve1->GetDlgItem(IDC_STATIC1)->SetWindowText("線程1打開"); Sleep(5000); eve1->GetDlgItem(IDC_STATIC1)->SetWindowText("線程1關(guān)閉"); eventto.SetEvent(); if (1==m_stop1) { m_stop1=0; break; } } return 0; } UINT thread2event( LPVOID pParam ) { CMulThreadDlg *eve2=(CMulThreadDlg *)pParam; while(1) { WaitForSingleObject(eventto.m_hObject,INFINITE); eve2->GetDlgItem(IDC_STATIC2)->SetWindowText("線程2打開"); Sleep(4000); eve2->GetDlgItem(IDC_STATIC2)->SetWindowText("線程2關(guān)閉"); eventto.SetEvent(); if (1==m_stop2) { m_stop2=0; break; } } return 0; } void CMulThreadDlg::OnBnClickedButtonClosethread() { // TODO: 在此添加控件通知處理程序代碼 m_stop1=1; m_stop2=1; }
工作者線程的AfxBeginThread的原型如下: CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID lParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );//用于創(chuàng)建工作者線程 返回值: 一個(gè)指向新線程的線程對(duì)象的指針 pfnThreadProc : 線程的入口函數(shù),聲明一定要如下: UINT MyThreadFunction( LPVOID pParam ),不能設(shè)置為NULL; pParam : 傳遞入線程的參數(shù),注意它的類型為:LPVOID,所以我們可以傳遞一個(gè)結(jié)構(gòu)體入線程. nPriority : 線程的優(yōu)先級(jí),一般設(shè)置為 0 .讓它和主線程具有共同的優(yōu)先級(jí). nStackSize : 指定新創(chuàng)建的線程的棧的大小.如果為 0,新創(chuàng)建的線程具有和主線程一樣的大小的棧 dwCreateFlags : 指定創(chuàng)建線程以后,線程有怎么樣的標(biāo)志.可以指定兩個(gè)值: CREATE_SUSPENDED : 線程創(chuàng)建以后,會(huì)處于掛起狀態(tài),直到調(diào)用:ResumeThread 0 : 創(chuàng)建線程后就開始運(yùn)行. lpSecurityAttrs : 指向一個(gè) SECURITY_ATTRIBUTES 的結(jié)構(gòu)體,用它來(lái)標(biāo)志新創(chuàng)建線程的安全性.如果為 NULL , 那么新創(chuàng)建的線程就具有和主線程一樣的安全性. 如果要在線程內(nèi)結(jié)束線程,可以在線程內(nèi)調(diào)用 AfxEndThread. 結(jié)束線程的兩種方式 當(dāng)你在后臺(tái)用線程來(lái)打印一些圖形時(shí).有時(shí)在打印一部分后,你希望可以停下來(lái),那么此如何讓線程停止呢.
void CReadWriteIniDlg::OnBnClickedButtonWrite() { // TODO: 在此添加控件通知處理程序代碼 strName="小米"; Age=2; strAge.Format("%d",Age); BOOL bl; bl=WritePrivateProfileString("information","Name",strName,"E:\\盛勝\\ini\\config.ini"); //::WritePrivateProfileString("information","Name","AK","E:\\盛勝\\ini\\config.ini"); bl=FALSE; bl=WritePrivateProfileString("information","Age",strAge,"E:\\盛勝\\ini\\config.ini"); } void CReadWriteIniDlg::OnBnClickedButtonRead() { // TODO: 在此添加控件通知處理程序代碼 CString strNameR,strAgeR; GetPrivateProfileString("information","Name","default",strNameR.GetBuffer(MAX_PATH),MAX_PATH,"E:\\盛勝\\ini\\config.ini"); GetPrivateProfileString("information","Age","default",strAgeR.GetBuffer(MAX_PATH),MAX_PATH,"E:\\盛勝\\ini\\config.ini"); //GetBuffer申請(qǐng)申空間 //使用完GetBuffer后,必須使用ReleaseBuffer以更新對(duì)象內(nèi)部數(shù)據(jù),否則會(huì)發(fā)生無(wú)法預(yù)料的結(jié)果。 strNameR.ReleaseBuffer(); strAgeR.ReleaseBuffer(); CString strinfo; strinfo.Format("information\n%s\n%s",strNameR,strAgeR); GetDlgItem(IDC_STATIC_READ)->SetWindowText(strinfo); } /* GetPrivateProfileString( __in_opt LPCSTR lpAppName, __in_opt LPCSTR lpKeyName, __in_opt LPCSTR lpDefault, __out_ecount_part_opt(nSize, return + 1) LPSTR lpReturnedString, __in DWORD nSize, __in_opt LPCSTR lpFileName ); 例子:GetPrivateProfileString("information","Name","default",strNameR.GetBuffer(MAX_PATH),MAX_PATH,"E:\\盛勝\\ini\\config.ini"); */ /* WritePrivateProfileString( __in_opt LPCSTR lpAppName, __in_opt LPCSTR lpKeyName, __in_opt LPCSTR lpString, __in_opt LPCSTR lpFileName );. 例子:WritePrivateProfileString("information","Name",strName,"E:\\盛勝\\ini\\config.ini"); */
掌握文本文件讀寫的方法 了解二進(jìn)制文件的讀寫方法
C++文件流: fstream // 文件流 ifstream // 輸入文件流 ofstream // 輸出文件流
//創(chuàng)建一個(gè)文本文件并寫入信息 //同向屏幕上輸出信息一樣將信息輸出至文件 #include<iomanip.h> #include<fstream.h> void main() { ofstream f1("d:\\me.txt"); //打開文件用于寫,若文件不存在就創(chuàng)建它 if(!f1)return; //打開文件失敗則結(jié)束運(yùn)行 f1<<setw(20)<<"姓名:"<<"廉東方"<<endl; //使用插入運(yùn)算符寫文件內(nèi)容 f1<<setw(20)<<"家庭地址:"<<"河南鄭州"<<endl; f1.close(); //關(guān)閉文件 } 運(yùn)行后打開文件d:\me.txt,其內(nèi)容如下: 姓名:廉東方 家庭地址:河南鄭州
文件操作: 打開文件 文件名 注意路徑名中的斜杠要雙寫,如: "D:\\MyFiles\\ReadMe.txt" 文件打開方式選項(xiàng): ios::in = 0x01, //供讀,文件不存在則創(chuàng)建(ifstream默認(rèn)的打開方式) ios::out = 0x02, //供寫,文件不存在則創(chuàng)建,若文件已存在則清空原內(nèi)容(ofstream默認(rèn)的打開方式) ios::ate = 0x04, //文件打開時(shí),指針在文件最后。可改變指針的位置,常和in、out聯(lián)合使用 ios::app = 0x08, //供寫,文件不存在則創(chuàng)建,若文件已存在則在原文件內(nèi)容后寫入新的內(nèi)容,指針位置總在最后 ios::trunc = 0x10, //在讀寫前先將文件長(zhǎng)度截?cái)酁?(默認(rèn)) ios::nocreate = 0x20, //文件不存在時(shí)產(chǎn)生錯(cuò)誤,常和in或app聯(lián)合使用 ios::noreplace = 0x40, //文件存在時(shí)產(chǎn)生錯(cuò)誤,常和out聯(lián)合使用 ios::binary = 0x80 //二進(jìn)制格式文件 文件保護(hù)方式選擇項(xiàng): filebuf::openprot; //默認(rèn)的兼容共享方式 filebuf::sh_none; //獨(dú)占,不共享 filebuf::sh_read; //讀共享 filebuf::sh_write; //寫共享 打開文件的方法 調(diào)用構(gòu)造函數(shù)時(shí)指定文件名和打開模式 ifstream f("d:\\12.txt",ios::nocreate); //默認(rèn)以 ios::in 的方式打開文件,文件不存在時(shí)操作失敗 ofstream f("d:\\12.txt"); //默認(rèn)以 ios::out的方式打開文件 fstream f("d:\\12.dat",ios::in|ios::out|ios::binary); //以讀寫方式打開二進(jìn)制文件 使用Open成員函數(shù) fstream f; f.open("d:\\12.txt",ios::out); //利用同一對(duì)象對(duì)多個(gè)文件進(jìn)行操作時(shí)要用到open函數(shù) 檢查是否成功打開 成功: if(f){...} //對(duì)ifstream、ofstream對(duì)象可用,fstream對(duì)象不可用。 if(f.good()){...} 失敗: if(!f){...} // !運(yùn)算符已經(jīng)重載 if(f.fail()){...} 讀寫操作 使用<<,>>運(yùn)算符 只能進(jìn)行文本文件的讀寫操作,用于二進(jìn)制文件可能會(huì)產(chǎn)生錯(cuò)誤。 使用函數(shù)成員 get、put、read、write等 經(jīng)常和read配合使用的函數(shù)是gcount(),用來(lái)獲得實(shí)際讀取的字節(jié)數(shù)。 讀寫二進(jìn)制文件注意事項(xiàng) 打開方式中必須指定ios::binary,否則讀寫會(huì)出錯(cuò) 用read\write進(jìn)行讀寫操作,而不能使用插入、提取運(yùn)算符進(jìn)行操作,否則會(huì)出錯(cuò)。 使用eof()函數(shù)檢測(cè)文件是否讀結(jié)束,使用gcount()獲得實(shí)際讀取的字節(jié)數(shù) 關(guān)閉文件 使用成員函數(shù)close,如: f.close(); 利用析構(gòu)函數(shù) 對(duì)象生命期結(jié)束時(shí)會(huì)檢查文件是否關(guān)閉,對(duì)沒(méi)有關(guān)閉的文件進(jìn)行關(guān)閉操作。 隨機(jī)讀寫文件 通過(guò)移動(dòng)文件讀寫指針,可在文件指定位置進(jìn)行讀寫。 seekg(絕對(duì)位置); //絕對(duì)移動(dòng), //輸入流操作 seekg(相對(duì)位置,參照位置); //相對(duì)操作 tellg(); //返回當(dāng)前指針位置 seekp(絕對(duì)位置); //絕對(duì)移動(dòng), //輸出流操作 seekp(相對(duì)位置,參照位置); //相對(duì)操作 tellp(); //返回當(dāng)前指針位置 參照位置: ios::beg = 0 //相對(duì)于文件頭 ios::cur = 1 //相對(duì)于當(dāng)前位置 ios::end = 2 //相對(duì)于文件尾 讀寫文本文件的示例 //為能夠正確讀出寫入文件的各數(shù)據(jù),各數(shù)據(jù)間最好要有分隔 #include<fstream.h> void main() { fstream f("d:\\try.txt",ios::out); f<<1234<<' '<<3.14<<'A'<<"How are you"; //寫入數(shù)據(jù) f.close(); f.open("d:\\try.txt",ios::in); int i; double d; char c; char s[20]; f>>i>>d>>c; //讀取數(shù)據(jù) f.getline(s,20); cout<<i<<endl; //顯示各數(shù)據(jù) cout<<d<<endl; cout<<c<<endl; cout<<s<<endl; f.close(); } 運(yùn)行結(jié)果: 1234 3.14 A How are you Press any key to continue 顯示文本文件的內(nèi)容 //使用get()一次讀一個(gè)字符--------------------------------方案一 #include<fstream.h> void main() { ifstream fin("d:\\簡(jiǎn)介.txt",ios::nocreate); if(!fin){ cout<<"File open error!\n"; return; } char c; while((c=fin.get())!=EOF)cout<<c; //注意結(jié)束條件的判斷 fin.close(); } //使用get(char *,int n,char delim='\n')一次讀多個(gè)字符----方案二 //巧妙利用文本文件中不會(huì)有字符'\0'的特點(diǎn)進(jìn)行讀取 #include<fstream.h> void main() { ifstream fin("d:\\簡(jiǎn)介.txt",ios::nocreate); if(!fin){ cout<<"File open error!\n"; return; } char c[80]; while(fin.get(c,80,'\0')!=NULL)cout<<c; //注意結(jié)束條件的判斷 fin.close(); } //使用read(char *,int n)讀文件---------------------------方案三 #include<fstream.h> void main() { ifstream fin("d:\\簡(jiǎn)介.txt",ios::nocreate); if(!fin){ cout<<"File open error!\n"; return; } char c[80]; while(!fin.eof()) //判斷文件是否讀結(jié)束 { fin.read(c,80); cout.write(c,fin.gcount()); } fin.close(); } 拷貝文件 //二進(jìn)制文件操作示例 #include<fstream.h> void main() { ifstream fin("C:\\1.exe",ios::nocreate|ios::binary); if(!fin){ cout<<"File open error!\n"; return; } ofstream fout("C:\\2.exe",ios::binary); char c[1024]; while(!fin.eof()) { fin.read(c,1024); fout.write(c,fin.gcount()); } fin.close(); fout.close(); cout<<"Copy over!\n"; }
CString str; int num; m_***.GetWindowText(str); num=atoi(str);
SetWindowPos() SetWindowPos(NULL,100,240,0,0,SWP_NOSIZE); BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int x, int y,int cx, int cy, UINT nFlags); hWnd:窗口句柄。 hWndlnsertAfter:在z序中的位于被置位的窗口前的窗口句柄。該參數(shù)必須為一個(gè)窗口句柄,或下列值之一: HWND_BOTTOM:將窗口置于Z序的底部。如果參數(shù)hWnd標(biāo)識(shí)了一個(gè)頂層窗口,則窗口失去頂級(jí)位置,并且被置在其他窗口的底部。 HWND_NOTOPMOST:將窗口置于所有非頂層窗口之上(即在所有頂層窗口之后)。如果窗口已經(jīng)是非頂層窗口則該標(biāo)志不起作用。 HWND_TOP:將窗口置于Z序的頂部。 HWND_TOPMOST:將窗口置于所有非頂層窗口之上。即使窗口未被激活窗口也將保持頂級(jí)位置。 查看該參數(shù)的使用方法,請(qǐng)看說(shuō)明部分。 x:以客戶坐標(biāo)指定窗口新位置的左邊界。 Y:以客戶坐標(biāo)指定窗口新位置的頂邊界。 cx:以像素指定窗口的新的寬度。 cy:以像素指定窗口的新的高度。 uFlags:窗口尺寸和定位的標(biāo)志。該參數(shù)可以是下列值的組合: SWP_ASNCWINDOWPOS:如果調(diào)用進(jìn)程不擁有窗口,系統(tǒng)會(huì)向擁有窗口的線程發(fā)出需求。這就防止調(diào)用線程在其他線程處理需求的時(shí)候發(fā)生死鎖。 SWP_DEFERERASE:防止產(chǎn)生WM_SYNCPAINT消息。 SWP_DRAWFRAME:在窗口周圍畫一個(gè)邊框(定義在窗口類描述中)。 SWP_FRAMECHANGED:給窗口發(fā)送WM_NCCALCSIZE消息,即使窗口尺寸沒(méi)有改變也會(huì)發(fā)送該消息。如果未指定這個(gè)標(biāo)志,只有在改變了窗口尺寸時(shí)才發(fā)送WM_NCCALCSIZE。 SWP_HIDEWINDOW;隱藏窗口。 SWP_NOACTIVATE:不激活窗口。如果未設(shè)置標(biāo)志,則窗口被激活,并被設(shè)置到其他最高級(jí)窗口或非最高級(jí)組的頂部(根據(jù)參數(shù)hWndlnsertAfter設(shè)置)。 SWP_NOCOPYBITS:清除客戶區(qū)的所有內(nèi)容。如果未設(shè)置該標(biāo)志,客戶區(qū)的有效內(nèi)容被保存并且在窗口尺寸更新和重定位后拷貝回客戶區(qū)。 SWP_NOMOVE:維持當(dāng)前位置(忽略X和Y參數(shù))。 SWP_NOOWNERZORDER:不改變z序中的所有者窗口的位置。 SWP_NOREDRAW:不重畫改變的內(nèi)容。如果設(shè)置了這個(gè)標(biāo)志,則不發(fā)生任何重畫動(dòng)作。適用于客戶區(qū)和非客戶區(qū)(包括標(biāo)題欄和滾動(dòng)條)和任何由于窗回移動(dòng)而露出的父窗口的所有部分。如果設(shè)置了這個(gè)標(biāo)志,應(yīng)用程序必須明確地使窗口無(wú)效并區(qū)重畫窗口的任何部分和父窗口需要重畫的部分。 SWP_NOREPOSITION;與SWP_NOOWNERZORDER標(biāo)志相同。 SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。 SWP_NOSIZE:維持當(dāng)前尺寸(忽略cx和Cy參數(shù))。 SWP_NOZORDER:維持當(dāng)前Z序(忽略hWndlnsertAfter參數(shù))。 SWP_SHOWWINDOW:顯示窗口。 返回值:如果函數(shù)成功,返回值為非零;如果函數(shù)失敗,返回值為零。若想獲得更多錯(cuò)誤消息,請(qǐng)調(diào)用GetLastError函數(shù)。
ShowWindow() ShowWindow(SW_HIDE) BOOL ShowWindow(HWND hWnd,int nCmdShow ); hWnd:指窗口句柄。 nCmdShow:指定窗口如何顯示。如果發(fā)送應(yīng)用程序的程序提供了STARTUPINFO結(jié)構(gòu),則應(yīng)用程序第一次調(diào)用ShowWindow時(shí)該參數(shù)被忽略。否則,在第一次調(diào)用ShowWindow函數(shù)時(shí),該值應(yīng)為在函數(shù)WinMain中nCmdShow參數(shù)。在隨后的調(diào)用中,該參數(shù)可以為下列值之一: SW_FORCEMINIMIZE:在WindowNT5.0中最小化窗口,即使擁有窗口的線程被掛起也會(huì)最小化。在從其他線程最小化窗口時(shí)才使用這個(gè)參數(shù)。 SW_HIDE:隱藏窗口并激活其他窗口。 SW_MAXIMIZE:最大化指定的窗口。 SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一個(gè)頂層窗口。 SW_RESTORE:激活并顯示窗口。如果窗口最小化或最大化,則系統(tǒng)將窗口恢復(fù)到原來(lái)的尺寸和位置。在恢復(fù)最小化窗口時(shí),應(yīng)用程序應(yīng)該指定這個(gè)標(biāo)志。 SW_SHOW:在窗口原來(lái)的位置以原來(lái)的尺寸激活和顯示窗口。 SW_SHOWDEFAULT:依據(jù)在STARTUPINFO結(jié)構(gòu)中指定的SW_FLAG標(biāo)志設(shè)定顯示狀態(tài),STARTUPINFO 結(jié)構(gòu)是由啟動(dòng)應(yīng)用程序的程序傳遞給CreateProcess函數(shù)的。 SW_SHOWMAXIMIZED:激活窗口并將其最大化。 SW_SHOWMINIMIZED:激活窗口并將其最小化。 SW_SHOWMINNOACTIVE:窗口最小化,激活窗口仍然維持激活狀態(tài)。 SW_SHOWNA:以窗口原來(lái)的狀態(tài)顯示窗口。激活窗口仍然維持激活狀態(tài)。 SW_SHOWNOACTIVATE:以窗口最近一次的大小和狀態(tài)顯示窗口。激活窗口仍然維持激活狀態(tài)。 SW_SHOWNORMAL:激活并顯示一個(gè)窗口。如果窗口被最小化或最大化,系統(tǒng)將其恢復(fù)到原來(lái)的尺寸和大小。應(yīng)用程序在第一次顯示窗口的時(shí)候應(yīng)該指定此標(biāo)志。
Create() Create(IDD_DIALOG_ZOOM,NULL); ModifyStyle() ModifyStyle(0,WS_SIZEBOX); BOOL ModifyStyle(DWORD dwRemove,DWORD dwAdd,UINT nFlags=0); 參數(shù)含義: dwRemove 指定修改時(shí)要?jiǎng)h除的窗風(fēng)格。 dwAdd 指定修改時(shí)將要增加的窗口風(fēng)格。 nFlags 該參數(shù)將被傳給SetWindowPos,否則為0,如果SetWindowPos不被調(diào)用的話,一般該參數(shù)默認(rèn)值 返回值: 如果該函數(shù)成功調(diào)用返回一個(gè)非0值,否則返回0; 備注 如果nFlags不為0, ModifyStyle將調(diào)用Windows API 函數(shù)SetWindowPos并且結(jié)合nFlags和以下四個(gè)預(yù)先布置好的標(biāo)志重畫該窗口。 SWP_NOSIZE 保持當(dāng)前大小。 SWP_NOMOVE 保持當(dāng)前位置.。 SWP_NOZORDER 保持當(dāng)前的Z次序。 SWP_NOACTIVATE 不激活該窗口。 用法: 1、修改控件的原有屬性用 ModifyStyle(1,WS_DISABLED);(實(shí)際測(cè)試時(shí)只要是>=0的整形數(shù)就行) 2、改回來(lái)的話要用ModifyStyle(WS_DISABLED,1);(實(shí)際測(cè)試時(shí)只要是>=0的整形數(shù)就行) 如果把參數(shù)想像成布爾值的話就使用1這個(gè)整形數(shù),要除去第控件的屬性就讓第一個(gè)參數(shù)dwRemove為真,修改回來(lái)就讓第二個(gè)參數(shù)dwAdd為真.RedrawWindow() CWindow myWindow; myWindow.Attach(hWnd); BOOL bRedrawn = myWindow.RedrawWindow();
BOOL RedrawWindow(
LPCRECT lpRectUpdate = NULL,
HRGN hRgnUpdate = NULL,
UINT flags = RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE
); throw() |
|