|
(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() |
|