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




4:在CBmpButton的頭文件中聲明保存按鈕在熱點和非熱點時顯示的圖片資源、自定義聲明SetHBitmap()函數用來設置按鈕顯示的圖片資源。 
5:在CBmpButton的頭文件中聲明WM_MOUSEMOVE事件處理函數OnMouseMove捕捉鼠標的位置—當鼠標在按鈕上時顯示熱點圖片,否則顯示非熱點圖片。    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保存按鈕在熱點時顯示的圖片資源 HBITMAP m_Hbitmap2; //m_Hbitmap2保存按鈕在非熱點時顯示的圖片資源 // Attributes public: // Operations public: void SetHBitmap(HBITMAP m_Hbitmap1,HBITMAP m_Hbitmap2) ; //用來保存按鈕顯示的圖片資源 // 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()函數中的代碼 void CBmpButton::SetHBitmap(HBITMAP m_hbmap1,HBITMAP m_hbmap2) { m_Hbitmap1=m_hbmap1; //將圖片資源保存到變量中 m_Hbitmap2=m_hbmap2; //將圖片資源保存到變量中 } 8:寫OnMouseMove()函數代碼 void CBmpButton::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CButton::OnMouseMove(nFlags, point); //獲取鼠標移動的坐標位置 CRect rect; GetClientRect(&rect); //獲取按鈕的矩形區域 if(rect.PtInRect(point)) //判斷鼠標移動的坐標位置是否在按鈕的矩形區域當中 { SetCapture(); SetBitmap(m_Hbitmap1); } else { ReleaseCapture(); SetBitmap(m_Hbitmap2); } } 9:設置按鈕屬性   為按鈕關聯變量  10:在包含按鈕的窗口類的初始化窗口函數(OnInitDialog()) BOOL CLogin::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here //當初始化窗口時,先載入的圖片 m_test.SetBitmap(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_HOU))); //當鼠標移動到按鈕范圍內時變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:鼠標無法抓屏鼠標直接畫出   
例如:等待的是一個CEvent event; event.SetEvent();
WaitForSingleObject 當指定的對象處于有信號狀態或者等待時間結束的狀態時,此函數返回。 DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 參數: hHandle:指定對象或事件的句柄; dwMilliseconds: 等待時間,以毫妙為單位,當超過等待時間時,此函數將返回。如果該參數設置為0,則該函數立即返回,如果設置為INFINITE,則該函數直到有信號才返回。 返回值: 如果此函數成功,該函數的返回之標識了引起該函數返回的事件。返回值如下: WAIT_ABANDONED(0x00000080L) 指定的對象是一個互斥對象,該對象沒有被擁有該對象的線程在線程結束前釋放。互斥對象的所有權被同意授予調用該函數的線程。互斥對象被設置成為無信號狀態。 WAIT_OBJECT_0 (0x00000000L) 指定的對象出有有信號狀態。 WAIT_TIMEOUT (0x00000102L) 超過等待時間,指定的對象處于無信號狀態 如果失敗,返回 WAIT_FAILED; 備注: 此函數檢查指定的對象或事件的狀態,如果該對象處于無信號狀態,則調用線程處于等待狀態,此時該線程不消耗CPU時間, 該函數可以等待如下對象: Change notification Console input Event Job Memory resource notification Mutex Process Semaphore Thread Waitable timer
CreateThread()函數在調用進程的地址空間上創建一個線程,以執行指定的函數;返回值為所創建線程的句柄。 ExitThread()函數用于結束本線程。 SuspendThread()函數用于掛起指定的線程。 ResumeThread()函數遞減指定線程的掛起計數,掛起計數為0時,線程恢復執行。
SuspendThread是掛起指定的線程,不同于Sleep只能掛起其所在的線程并在時間間隔超過后自動回復,而SuspendThread掛起的線程則需要使用ResumeThread回復。 SuspendThread函數原型如下: DWORD WINAPI SuspendThread( HANDLE hThread); 參數: hThead:輸入參數,需要掛起的文件句柄。 返回值: 如果返回-1(0xFFFFFFFF),表示失敗;如果返回整數,表示線程已經被掛起過得次數。 ResumeThread可以恢復被SuspendThread掛起的線程的執行。 ResumeThread函數原型: DWORD WINAPI ResumeThread( HANDLE hThread); CWinThread 例如: *p1=AfxBeginThread(thread1event,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);//創建并掛起 p1->ResumeThread();//執行線程thread1event p1->SuspendThread();//掛起線程thread1event
void CMulThreadDlg::OnBnClickedButtonTheadsametime() { // TODO: 在此添加控件通知處理程序代碼 CWinThread *p1=AfxBeginThread(thread1event,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); // 線程1 優先級與主線程共同 掛起線程直到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:指定對象或事件的句柄; dwMilliseconds: 等待時間,以毫妙為單位,當超過等待時間時,此函數將返回。如果該參數設置為0,則該函數立即返回,如果設置為INFINITE,則該函數直到有信號才返回。 */ eve1->GetDlgItem(IDC_STATIC1)->SetWindowText("線程1打開"); Sleep(5000); eve1->GetDlgItem(IDC_STATIC1)->SetWindowText("線程1關閉"); 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關閉"); 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 );//用于創建工作者線程 返回值: 一個指向新線程的線程對象的指針 pfnThreadProc : 線程的入口函數,聲明一定要如下: UINT MyThreadFunction( LPVOID pParam ),不能設置為NULL; pParam : 傳遞入線程的參數,注意它的類型為:LPVOID,所以我們可以傳遞一個結構體入線程. nPriority : 線程的優先級,一般設置為 0 .讓它和主線程具有共同的優先級. nStackSize : 指定新創建的線程的棧的大小.如果為 0,新創建的線程具有和主線程一樣的大小的棧 dwCreateFlags : 指定創建線程以后,線程有怎么樣的標志.可以指定兩個值: CREATE_SUSPENDED : 線程創建以后,會處于掛起狀態,直到調用:ResumeThread 0 : 創建線程后就開始運行. lpSecurityAttrs : 指向一個 SECURITY_ATTRIBUTES 的結構體,用它來標志新創建線程的安全性.如果為 NULL , 那么新創建的線程就具有和主線程一樣的安全性. 如果要在線程內結束線程,可以在線程內調用 AfxEndThread. 結束線程的兩種方式 當你在后臺用線程來打印一些圖形時.有時在打印一部分后,你希望可以停下來,那么此如何讓線程停止呢.
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申請申空間 //使用完GetBuffer后,必須使用ReleaseBuffer以更新對象內部數據,否則會發生無法預料的結果。 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"); */
掌握文本文件讀寫的方法 了解二進制文件的讀寫方法
C++文件流: fstream // 文件流 ifstream // 輸入文件流 ofstream // 輸出文件流
//創建一個文本文件并寫入信息 //同向屏幕上輸出信息一樣將信息輸出至文件 #include<iomanip.h> #include<fstream.h> void main() { ofstream f1("d:\\me.txt"); //打開文件用于寫,若文件不存在就創建它 if(!f1)return; //打開文件失敗則結束運行 f1<<setw(20)<<"姓名:"<<"廉東方"<<endl; //使用插入運算符寫文件內容 f1<<setw(20)<<"家庭地址:"<<"河南鄭州"<<endl; f1.close(); //關閉文件 } 運行后打開文件d:\me.txt,其內容如下: 姓名:廉東方 家庭地址:河南鄭州
文件操作: 打開文件 文件名 注意路徑名中的斜杠要雙寫,如: "D:\\MyFiles\\ReadMe.txt" 文件打開方式選項: ios::in = 0x01, //供讀,文件不存在則創建(ifstream默認的打開方式) ios::out = 0x02, //供寫,文件不存在則創建,若文件已存在則清空原內容(ofstream默認的打開方式) ios::ate = 0x04, //文件打開時,指針在文件最后。可改變指針的位置,常和in、out聯合使用 ios::app = 0x08, //供寫,文件不存在則創建,若文件已存在則在原文件內容后寫入新的內容,指針位置總在最后 ios::trunc = 0x10, //在讀寫前先將文件長度截斷為0(默認) ios::nocreate = 0x20, //文件不存在時產生錯誤,常和in或app聯合使用 ios::noreplace = 0x40, //文件存在時產生錯誤,常和out聯合使用 ios::binary = 0x80 //二進制格式文件 文件保護方式選擇項: filebuf::openprot; //默認的兼容共享方式 filebuf::sh_none; //獨占,不共享 filebuf::sh_read; //讀共享 filebuf::sh_write; //寫共享 打開文件的方法 調用構造函數時指定文件名和打開模式 ifstream f("d:\\12.txt",ios::nocreate); //默認以 ios::in 的方式打開文件,文件不存在時操作失敗 ofstream f("d:\\12.txt"); //默認以 ios::out的方式打開文件 fstream f("d:\\12.dat",ios::in|ios::out|ios::binary); //以讀寫方式打開二進制文件 使用Open成員函數 fstream f; f.open("d:\\12.txt",ios::out); //利用同一對象對多個文件進行操作時要用到open函數 檢查是否成功打開 成功: if(f){...} //對ifstream、ofstream對象可用,fstream對象不可用。 if(f.good()){...} 失敗: if(!f){...} // !運算符已經重載 if(f.fail()){...} 讀寫操作 使用<<,>>運算符 只能進行文本文件的讀寫操作,用于二進制文件可能會產生錯誤。 使用函數成員 get、put、read、write等 經常和read配合使用的函數是gcount(),用來獲得實際讀取的字節數。 讀寫二進制文件注意事項 打開方式中必須指定ios::binary,否則讀寫會出錯 用read\write進行讀寫操作,而不能使用插入、提取運算符進行操作,否則會出錯。 使用eof()函數檢測文件是否讀結束,使用gcount()獲得實際讀取的字節數 關閉文件 使用成員函數close,如: f.close(); 利用析構函數 對象生命期結束時會檢查文件是否關閉,對沒有關閉的文件進行關閉操作。 隨機讀寫文件 通過移動文件讀寫指針,可在文件指定位置進行讀寫。 seekg(絕對位置); //絕對移動, //輸入流操作 seekg(相對位置,參照位置); //相對操作 tellg(); //返回當前指針位置 seekp(絕對位置); //絕對移動, //輸出流操作 seekp(相對位置,參照位置); //相對操作 tellp(); //返回當前指針位置 參照位置: ios::beg = 0 //相對于文件頭 ios::cur = 1 //相對于當前位置 ios::end = 2 //相對于文件尾 讀寫文本文件的示例 //為能夠正確讀出寫入文件的各數據,各數據間最好要有分隔 #include<fstream.h> void main() { fstream f("d:\\try.txt",ios::out); f<<1234<<' '<<3.14<<'A'<<"How are you"; //寫入數據 f.close(); f.open("d:\\try.txt",ios::in); int i; double d; char c; char s[20]; f>>i>>d>>c; //讀取數據 f.getline(s,20); cout<<i<<endl; //顯示各數據 cout<<d<<endl; cout<<c<<endl; cout<<s<<endl; f.close(); } 運行結果: 1234 3.14 A How are you Press any key to continue 顯示文本文件的內容 //使用get()一次讀一個字符--------------------------------方案一 #include<fstream.h> void main() { ifstream fin("d:\\簡介.txt",ios::nocreate); if(!fin){ cout<<"File open error!\n"; return; } char c; while((c=fin.get())!=EOF)cout<<c; //注意結束條件的判斷 fin.close(); } //使用get(char *,int n,char delim='\n')一次讀多個字符----方案二 //巧妙利用文本文件中不會有字符'\0'的特點進行讀取 #include<fstream.h> void main() { ifstream fin("d:\\簡介.txt",ios::nocreate); if(!fin){ cout<<"File open error!\n"; return; } char c[80]; while(fin.get(c,80,'\0')!=NULL)cout<<c; //注意結束條件的判斷 fin.close(); } //使用read(char *,int n)讀文件---------------------------方案三 #include<fstream.h> void main() { ifstream fin("d:\\簡介.txt",ios::nocreate); if(!fin){ cout<<"File open error!\n"; return; } char c[80]; while(!fin.eof()) //判斷文件是否讀結束 { fin.read(c,80); cout.write(c,fin.gcount()); } fin.close(); } 拷貝文件 //二進制文件操作示例 #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序中的位于被置位的窗口前的窗口句柄。該參數必須為一個窗口句柄,或下列值之一: HWND_BOTTOM:將窗口置于Z序的底部。如果參數hWnd標識了一個頂層窗口,則窗口失去頂級位置,并且被置在其他窗口的底部。 HWND_NOTOPMOST:將窗口置于所有非頂層窗口之上(即在所有頂層窗口之后)。如果窗口已經是非頂層窗口則該標志不起作用。 HWND_TOP:將窗口置于Z序的頂部。 HWND_TOPMOST:將窗口置于所有非頂層窗口之上。即使窗口未被激活窗口也將保持頂級位置。 查看該參數的使用方法,請看說明部分。 x:以客戶坐標指定窗口新位置的左邊界。 Y:以客戶坐標指定窗口新位置的頂邊界。 cx:以像素指定窗口的新的寬度。 cy:以像素指定窗口的新的高度。 uFlags:窗口尺寸和定位的標志。該參數可以是下列值的組合: SWP_ASNCWINDOWPOS:如果調用進程不擁有窗口,系統會向擁有窗口的線程發出需求。這就防止調用線程在其他線程處理需求的時候發生死鎖。 SWP_DEFERERASE:防止產生WM_SYNCPAINT消息。 SWP_DRAWFRAME:在窗口周圍畫一個邊框(定義在窗口類描述中)。 SWP_FRAMECHANGED:給窗口發送WM_NCCALCSIZE消息,即使窗口尺寸沒有改變也會發送該消息。如果未指定這個標志,只有在改變了窗口尺寸時才發送WM_NCCALCSIZE。 SWP_HIDEWINDOW;隱藏窗口。 SWP_NOACTIVATE:不激活窗口。如果未設置標志,則窗口被激活,并被設置到其他最高級窗口或非最高級組的頂部(根據參數hWndlnsertAfter設置)。 SWP_NOCOPYBITS:清除客戶區的所有內容。如果未設置該標志,客戶區的有效內容被保存并且在窗口尺寸更新和重定位后拷貝回客戶區。 SWP_NOMOVE:維持當前位置(忽略X和Y參數)。 SWP_NOOWNERZORDER:不改變z序中的所有者窗口的位置。 SWP_NOREDRAW:不重畫改變的內容。如果設置了這個標志,則不發生任何重畫動作。適用于客戶區和非客戶區(包括標題欄和滾動條)和任何由于窗回移動而露出的父窗口的所有部分。如果設置了這個標志,應用程序必須明確地使窗口無效并區重畫窗口的任何部分和父窗口需要重畫的部分。 SWP_NOREPOSITION;與SWP_NOOWNERZORDER標志相同。 SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。 SWP_NOSIZE:維持當前尺寸(忽略cx和Cy參數)。 SWP_NOZORDER:維持當前Z序(忽略hWndlnsertAfter參數)。 SWP_SHOWWINDOW:顯示窗口。 返回值:如果函數成功,返回值為非零;如果函數失敗,返回值為零。若想獲得更多錯誤消息,請調用GetLastError函數。
ShowWindow() ShowWindow(SW_HIDE) BOOL ShowWindow(HWND hWnd,int nCmdShow ); hWnd:指窗口句柄。 nCmdShow:指定窗口如何顯示。如果發送應用程序的程序提供了STARTUPINFO結構,則應用程序第一次調用ShowWindow時該參數被忽略。否則,在第一次調用ShowWindow函數時,該值應為在函數WinMain中nCmdShow參數。在隨后的調用中,該參數可以為下列值之一: SW_FORCEMINIMIZE:在WindowNT5.0中最小化窗口,即使擁有窗口的線程被掛起也會最小化。在從其他線程最小化窗口時才使用這個參數。 SW_HIDE:隱藏窗口并激活其他窗口。 SW_MAXIMIZE:最大化指定的窗口。 SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一個頂層窗口。 SW_RESTORE:激活并顯示窗口。如果窗口最小化或最大化,則系統將窗口恢復到原來的尺寸和位置。在恢復最小化窗口時,應用程序應該指定這個標志。 SW_SHOW:在窗口原來的位置以原來的尺寸激活和顯示窗口。 SW_SHOWDEFAULT:依據在STARTUPINFO結構中指定的SW_FLAG標志設定顯示狀態,STARTUPINFO 結構是由啟動應用程序的程序傳遞給CreateProcess函數的。 SW_SHOWMAXIMIZED:激活窗口并將其最大化。 SW_SHOWMINIMIZED:激活窗口并將其最小化。 SW_SHOWMINNOACTIVE:窗口最小化,激活窗口仍然維持激活狀態。 SW_SHOWNA:以窗口原來的狀態顯示窗口。激活窗口仍然維持激活狀態。 SW_SHOWNOACTIVATE:以窗口最近一次的大小和狀態顯示窗口。激活窗口仍然維持激活狀態。 SW_SHOWNORMAL:激活并顯示一個窗口。如果窗口被最小化或最大化,系統將其恢復到原來的尺寸和大小。應用程序在第一次顯示窗口的時候應該指定此標志。
Create() Create(IDD_DIALOG_ZOOM,NULL); ModifyStyle() ModifyStyle(0,WS_SIZEBOX); BOOL ModifyStyle(DWORD dwRemove,DWORD dwAdd,UINT nFlags=0); 參數含義: dwRemove 指定修改時要刪除的窗風格。 dwAdd 指定修改時將要增加的窗口風格。 nFlags 該參數將被傳給SetWindowPos,否則為0,如果SetWindowPos不被調用的話,一般該參數默認值 返回值: 如果該函數成功調用返回一個非0值,否則返回0; 備注 如果nFlags不為0, ModifyStyle將調用Windows API 函數SetWindowPos并且結合nFlags和以下四個預先布置好的標志重畫該窗口。 SWP_NOSIZE 保持當前大小。 SWP_NOMOVE 保持當前位置.。 SWP_NOZORDER 保持當前的Z次序。 SWP_NOACTIVATE 不激活該窗口。 用法: 1、修改控件的原有屬性用 ModifyStyle(1,WS_DISABLED);(實際測試時只要是>=0的整形數就行) 2、改回來的話要用ModifyStyle(WS_DISABLED,1);(實際測試時只要是>=0的整形數就行) 如果把參數想像成布爾值的話就使用1這個整形數,要除去第控件的屬性就讓第一個參數dwRemove為真,修改回來就讓第二個參數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() |
|