mfc剪切板函数
mfc剪切板函数总结
mfc剪切板函数总结
篇一:
MFC中对剪切板的各种操作 MFC中对剪切板的各种操作 201X-10-30 21:02:14 标签:
C++ 拷贝与粘贴文本 下边的源代码演示了如何将文本(包含在CString对象“surce”中)拷贝到剪贴板上。 CString surce; //put yur text in surce if(penClipbard) { HGLBAL clipbuffer; char * buffer; EmptyClipbard; clipbuffer = GlbalAllc(GMEM_DDESHARE, surce.GetLength+1); buffer = (char*)GlbalLck(clipbuffer); strcpy(buffer, LPCSTR(surce)); GlbalUnlck(clipbuffer); SetClipbardData(CF_TEXT,clipbuffer); ClseClipbard; } 反过来,下面的代码是用来实现从剪贴板上取得文本的。 char * buffer = NULL; //pen the clipbard CString frmClipbard; if ( penClipbard ) { HANDLE hData = GetClipbardData( CF_TEXT ); char * buffer = (char*)GlbalLck( hData ); frmClipbard = buffer; GlbalUnlck( hData ); ClseClipbard; }
-------------------------------------------------------------------------------- 拷贝与粘贴MF(enhanced)数据 你想在你的程序中往剪贴板上“画”以及向剪贴板读取图形吗,请放心,这个――不难~示范代码如下,其实现的是往剪贴板上写一 enhanced metafile。 if ( penClipbard ) { EmptyClipbard; //create the metafile DC CMetaFileDC * cDC = ne CMetaFileDC; cDC- CreateEnhanced(GetDC,NULL,NULL, the_name //call dra rutine here that makes GDI calls int cDC //clse meta CMetafileDC and get its handle HENHMETAFILE handle = cDC- ClseEnhanced; //place it n the clipbard SetClipbardData(CF_ENHMETAFILE,handle); ClseClipbard; //delete the dc delete cDC; } 好啦,该演示反过来怎么做的代码了。我们从剪贴板上取得metafile并将其画到自己的应用程序的客户区DC(设备上下文)上(仅仅是个试验而已,实
际上你可能更想将它拷贝一份儿)。 if ( penClipbard ) { //Get the clipbard data HENHMETAFILE handle =
(HENHMETAFILE)GetClipbardData(CF_ENHMETAFILE); //play it int a DC (ur n DC in this example) CClientDC dc(this); CRect client(0,0,200,200); dc.PlayMetaFile(handle,client); //clse the clipbard ClseClipbard; }
-------------------------------------------------------------------------------- 拷贝与粘贴一张位图(BitMap) 拷贝和粘贴位图可是需要一些微妙的处理的,不过基本的思想还是一样。请看下面的代码。 if ( penClipbard ) { EmptyClipbard; //create sme data CBitmap * junk = ne CBitmap; CClientDC cdc(this); CDC dc; dc.CreateCmpatibleDC( cdc); CRect client(0,0,200,200); junk- CreateCmpatibleBitmap( cdc,client.idth,client.Height); dc.Selectbject(junk); //call dra rutine here that makes GDI calls DraImage( dc,CString( Bitmap )); //put the data n the clipbard SetClipbardData(CF_BITMAP,junk- m_hbject); ClseClipbard; //cpy has been made n clipbard s e can delete delete junk; } 如下示例代码是从剪贴板上取得一张位图,将它粘贴到客户区DC中。 if ( penClipbard ) { //Get the clipbard data HBITMAP handle = (HBITMAP)GetClipbardData(CF_BITMAP); CBitmap * bm = CBitmap::FrmHandle(handle); CClientDC cdc(this); CDC dc; dc.CreateCmpatibleDC( cdc); dc.Selectbject(bm);
cdc.BitBlt(0,0,200,200, dc,0,0,SRCCPY); ClseClipbard; } -------------------------------------------------------------------------------- 建立并使用你自己定做的数据格式 如果你要拷贝、粘贴其它格式的数据,可以用 RegisterClipbardFrmat API函数先将此格式注册,然后就可以“为所欲为”了。这简直是太有用了,尤其是在我们自己的应用程序中拷贝资料。假设我们有下面的结构:
struct MyFrmatData { lng val1; int val2; }; 想将此结构的数据拷贝到剪贴板上。可以这样实现:
UINT frmat = RegisterClipbardFrmat( MY_CUSTM_FRMAT if(penClipbard) { //make sme dummy data MyFrmatData data; data.val1 = 100; data.val2 = 200; //allcate sme glbal memry HGLBAL clipbuffer; EmptyClipbard; clipbuffer = GlbalAllc(GMEM_DDESHARE, sizef(MyFrmatData)); MyFrmatData * buffer = (MyFrmatData*)GlbalLck(clipbuffer); //put the data int that memry *buffer = data; //Put it n the clipbard GlbalUnlck(clipbuffer); SetClipbardData(frmat,clipbuffer); ClseClipbard; } 想把它从剪贴板上读下来的话,也容易:
//第二次调用时,此格式已经注册过了,读下来就行了 UINT frmat = RegisterClipbardFrmat( MY_CUSTM_FRMAT MyFrmatData data; if ( penClipbard ) { //get the buffer HANDLE hData = GetClipbardData(frmat); MyFrmatData * buffer = (MyFrmatData *)GlbalLck( hData ); //留一份儿当地拷贝 data = *buffer; GlbalUnlck( hData ); ClseClipbard; } 取得剪贴板变化通知(Getting ntified f clipbard changes)
篇二:
mfc 剪贴板操作 mfc 剪贴板操作 本文主要介绍了VC++语句语言/MFC中如下内容的剪贴板操作:
1、文本内容的操作
2、MF数据的操作
3、位图的操作
4、设置应用自定义各式
5、感知剪贴板内容的改变
6、自动将数据粘贴到另一应用程式窗口
一、文本内容的操作 下面的代码示范了怎能将文本内容复制到剪贴板(Unicde编码的先转化为ASCII):
CString surce; //文本内容保存在surce变量中
if( penClipbard ) { HGLBAL clipbuffer; char * buffer; EmptyClipbard; clipbuffer = GlbalAllc(GMEM_DDESHARE, surce.GetLength+1); buffer = (char*)GlbalLck(clipbuffer); strcpy(buffer, LPCSTR(surce)); GlbalUnlck(clipbuffer); SetClipbard数据(CF_TEXT,clipbuffer); ClseClipbard; } 下面的代码呈现了怎能从剪贴板上获得文本内容:
char * buffer = NULL; //打开剪贴板 CString frmClipbard; if ( penClipbard ) { HANDLE h数据 = GetClipbard数据(CF_TEXT); char * buffer = (char*)GlbalLck(h数据); frmClipbard = buffer; GlbalUnlck(h数据); ClseClipbard; }
二、MF数据的操作 在剪贴板上读写图象数据是非比寻常有用的功能,并且呈现起来也很简单。下面的代码呈现了怎能将扩展图元文档复制到剪贴板:
if(penClipbard); { EmptyClipbard; //创建图元文档DC CMetaFileDC * cDC = ne CMetaFileDC; cDC-
CreateEnhanced(GetDC,NULL,NULL, the_name //调用绘图例程 //关闭CMetafileDC并获得它的句柄 HENHMETAFILE handle = cDC- ClseEnhanced; //复制到剪贴板 SetClipBard数据
(CF_ENHMETAFILE,handle); ClseClipbard; //删除dc delete cDC; } 下面的代码演示了从剪贴板获得图元文档并将其绘制到client DC上:
if(penClipbard) { //获得剪贴板数据 HENMETAFILE handle = (HENMETAFILE)GetClipbard数据(CF_ENHMETAFILE); //呈现 CClientDC dc(this); CRect client(0,0,200,200);
dc.PlayMetaFile(handle,client); //关闭剪贴板 ClseClipbard; }
三、位图的操作 位图的操作稍微复杂一点,下面那个例子呈现了怎能在剪贴板保存位图:
if(penClipbard) { EmptyClipbard; CBitmap * junk = ne CBitmap; CClientDC cdc(this); CDC dc; dc.CreateCmpatibleDC( cdc); CRect client(0,0,200,200); junk-
CreateCmpatibleBitmap( cdc,client.idth,client.Height);
dc.Selectbject(junk); DraImage( dc,CString( Bitmap )); //复制数据到剪贴板 SetClipbard数据(CF_BITMAP,junk- m_hbject); ClseClipbard; delete junk; } 下面的代码呈现了怎能从剪贴板上获得位图数据:
if(penClipbard) { //获得剪贴板数据 HBITMAP handle = (HBITMAP)GetClipbard数据(CF_BITMAP); CBitmap * bm = CBitmap::FrmHandle(handle); CClientDC cdc(this); CDC dc; dc.CreateCmpatibleDC( cdc); dc.Selectbject(bm); cdc.BitBlt(0,0,200,200, dc,0,0,SRCCPY); ClseClipbard; }
四、设置并应用自定义各式 应用RegisterClipbardFrmat参数,没出国疑问复制和粘贴任何你需求的数据TYPE。比如咱们有以下唯一的数据TYPE:
struct MyFrmat数据 { lng val1;
篇三:
MFC常用函数介绍 菜单结构
1. 一个菜单栏可以有若干个子菜单,而一个子菜单又可有若干个菜单项。 对于菜单栏的子菜单,由左至右从0开始索引。 对于特定的子菜单的菜单项,由上至下建立从0开始的索引。 访问子菜单和菜单项,均可通过其索引或标识进行。
2. 对于在窗口客户区右键弹出的菜单,如果弹出菜单归属Vie 类窗口,则菜单项只能响应Vie 和Dc 类消息点击。
3. 如果弹出菜单归属框架窗口,弹出菜单上的消息的路由遵循Vie -DC-MainFrame-APP的响应顺序 。 菜单的相关重要函数
1. CMenu* GetMenu( ) ; // 得到菜单指针
2. CMenu* GetSubMenu( ) ; // 得到子菜单指针,也就是弹出菜单指针
3. UINT CheckMenuItem( ); // 将菜单项加上或去掉?(对号)标记 a.如果第一个参数是ID号, 第二个参数必须是MF_BYCMMAND | MF_CHECKED的组合 b.如果第一个参数是索引号, 第二个参数必须是MF_BYPSITIN | MF_CHECKED的组合
4. BL SetDefaultItem; // 设置缺省菜单,也就是将菜单项粗体显示 a.如果第一个参数是索引号,第二个参数必须是true b.如果第一个参数是ID号,第二个参数必须是false *注 : 一个子菜单最多只能有一个缺省菜单项
5. BL SetMenuItemBitmaps( ); // 设置位图标记,标记大小为13*13像素 a.如果第一个参数是ID号,第二个参数必须是MF_BYCMMAND b.如果第一个参数是索引号,第二个参数必须是MF_BYPSITIN ,第三个参数是没有选中时的位图,第四个参数是标记时的位图
6. UINT EnableMenuItem; //使菜单项有效,无效,或变灰 a.如果第一个参数是ID号,第二个参数必须是MF_BYCMMAND 和有效,无效,或变灰 的组合 b.如果第一个参数是索引号,第二个参数必须是MF_BYPSITIN 和有效,无 效,或变灰 的组合 *注 :
若让此函数生效,必须在mainfrm构造函数中添加:
m_bAutMenuEnable =false, 此时,其他变灰的菜单项也就恢复为不变灰状态了,会有副作用的
7. BL SetMenu( CMenu* pMenu ); //在当前窗口上设置新菜单或移除菜单。 如果参数为0,则是移除菜单。 自己创建菜单{CMenu menu;menu.LadMenu(IDR_MENU1); SetMenu( menu);menu.Detach;}
8. HMENU Detach( ); // 如果将CMenu 对象设置为局部对象,使用Detach 从menu对象中分离窗口菜单句柄,从而当menu对象析构的时候窗口菜单资源不随之销毁 菜单的相关操作的实现
a.添加对号标记: 方法 一:
GetMenu- GetSubMenu(0)- CheckMenuItem(0,MF_BYPSITIN | MF_CHECKED ); //通过索引 方法
二:
GetMenu- GetSubMenu(0)-
CheckMenuItem(ID_FILE_NE,MF_BYCMMAND | MF_CHECKED ); //通过ID b.设置缺省菜单项:
每个子菜单最多只能有一个缺省菜单项 方法一:
GetMenu- GetSubMenu(0)- SetDefaultItem(1,true); //通过索引 方法二:
GetMenu( )- GetSubMenu(0)-
SetDefaultItem(ID_FILE_PEN,false); //通过ID c.添加图形标记:
方法一:
通过ID CBitmap bitmap; //必须设置为全局对象 bitmap.LadBitmap(IDB_BITMAP1); GetMenu( )- GetSubMenu(0)- SetMenuItemBitmaps(ID_FILE_NE,MF_BYCMMAND, bitmap, bitmap); 方法二:
通过索引 CBitmap bitmap; //必须设置为全局对象 bitmap.LadBitmap(IDB_BITMAP1); GetMenu( )- GetSubMenu(0)- SetMenuItemBitmaps(0,MF_BYPSITIN , bitmap, bitmap); d.使菜单无效,变灰 //必须在构造函数中添加:
m_bAutMenuEnable = false; GetMenu( )- GetSubMenu(0)- EnableMenuItem(ID_FILE_PEN,MF_BYCMMAND | MF_DISABLED | MF_GRAYED); e.移除菜单 SetMenu(0); f.添加菜单 CMenu menu; menu.LadMenu(IDR_MAINFRAME); SetMenu( menu); menu.Detach; 图形标记大小 系统获得位图标记的大小:
CString str; str.Frmat(
x=%d,y=%d ,GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK)); MessageBx(str); 命令更新机制 菜单的UPDATE_CMMAND_UI消息响应 { pCmdUI- Enable(false); // true和false 来设置能否使用或变灰 pCmdUI- SetCheck(true); // true和false 来设置标记 pCmdUI- SetText(“cut”); //改变菜单项文本内容 } 动态创建菜单 先定义几个常量:
#define IDM_MENU0 0 #define IDM_MENU1 1 #define IDM_MENU2 2 #define IDM_MENU3 3 #define IDM_ITEM0 10 #define IDM_ITEM1 11 #define IDM_ITEM2 12 #define IDM_ITEM3 13 #define IDM_ITEM4
14 #define IDM_ITEM5 15 #define IDM_ITEM6 16 // 在最后一个菜单项后面添加菜单项 BL AppendMenu ( UINT nFlags, UINT nIDNeItem = 0, LPCTSTR lpszNeItem = NULL); BL AppendMenu ( UINT nFlags, UINT nIDNeItem, cnst CBitmap* pBmp ); // 插入菜单项 BL InsertMenu( UINT nPsitin, UINT nFlags, UINT nIDNeItem = 0, LPCTSTR lpszNeItem = NULL ); BL InsertMenu( UINT nPsitin, UINT nFlags, UINT nIDNeItem, cnst CBitmap* pBmp ); // 移除菜单项 BL RemveMenu( UINT nPsitin, UINT nFlags ); // 删除菜单项 BL DeleteMenu( UINT nPsitin, UINT nFlags ); 一 、创建非Ppup类型菜单,不使用资源。
(一)创建非下拉菜单。 1。在窗口类的nCreate函数里创建CMenu对象。如果是创建运用程序主框架窗口 的话,也可以在InitInstance函数里。 2。声明一个CMenu对象:CMenu MyMenu; 3。调用
MyMenu.CreateMenu或MyMenu.LadMenu 4。调用若干次
MyMenu.AppendMenu或MyMenu.InsertMenu,每调用一次创建一 个菜单项。 5。调用MyMneu.SetMenu将菜单Attach到窗口上。 6。调用MyMenu.Detach。 例子:
int CMynd::nCreate( LPCREATESTRUCT lpCreateStruct ) { CMenu MyMenu; MyMenu.CreateMenu;
MyMenu.AppendMenu(MF_STRING,IDM_MENU0, 文件
MyMenu.AppendMenu(MF_STRING,IDM_MENU1, 编辑
MyMenu.AppendMenu(MF_STRING,IDM_MENU2, 查看
MyMenu.AppendMenu(MF_STRING,IDM_MENU3, 帮助
MyMenu.InsertMenu(IDM_MENU2,MF_BYCMMAND,IDM_ITEM0, 有关 this- SetMenu( MyMenu); MyMenu.Detach; return 0; }//各个函数的细节就不讲解了,看联机帮助是最好的。 这个方法是先把菜单创建好后再贴到窗口上去,然后用Detach使菜单和MyMenu对象脱离关系,因为MyMenu对象马上就要超出作用域了,这一步是必须的。
(二)创建下拉菜单,不使用资源。 这种菜单当鼠标移动到菜单条目上面点击时不是去执行某段程序,而是弹出 一个下拉菜单。这需要用前面的方法创建两个菜单。第一个是鼠标未点击时看到 的那个
菜单,另一个就是扮演下拉菜单的菜单。例子:
int CMynd::nCreate( LPCREATESTRUCT lpCreateStruct ) { CMenu MyMenu0,MyMenu1; //下面这几条创建下拉菜单篇四:
MFC函数用法 DefindPrc
............................................................................................................................ 1
PstQuitMessage ......................................................................................................................... 2
BeginPaint ...................................................................................................................................... 2
Textut ........................................................................................................................................... 3
EndPaint ......................................................................................................................................... 4
InvalidateRect ............................................................................................................................... 4
sprintf .............................................................................................................................................. 5
GetindText .......................................................................................................................... 12
Createind ............................................................................................................................. 12
ndprc ....................................................................................................................................... 17
inMain ........................................................................................................................................ 18
LadIcn ....................................................................................................................................... 19
LadCursr .................................................................................................................................. 20
GetStckbject ........................................................................................................................... 20
RegisterClass .............................................................................................................................. 22
MessageBx ................................................................................................................................ 22
Shind ............................................................................................................................... 26 Shind
............................................................................................................................... 27 Updateind
............................................................................................................................ 28
GetMessage ................................................
................................................................................. 29
TranslateMessage ...................................................................................................................... 30
DispatchMessage ....................................................................................................................... 31 DefindPrc 函数功能:
该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理。调用DefindPrc函数时使用窗口过程接收的相同参数。 函数原型:
LRESULT DefindPrc(HND hnd,UINT Msg,PARAM Param,LPARAM IParam); 参数:
hnd:
指向接收消息的窗口过程的句柄。 Msg:
指定消息类型。 Param:
指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。
IParam:
指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。
返回值:
返回值就是消息处理结果,它与发送的消息有关。 备注: 对于inds CE;如果Msg为M_SETTEXT那么返回0。 当DefindPrc处理M_DESTRY消息时,它不自动调用PstQutMessage。 速查:
inds NT
3.1以上版本;inds:
95以上版本:
inds CE以上版本;头文件;inuser.h;库文件:
user3
2.lib;Unicde:
在inds NT环境中以Unicde和ANSI版本实现。 PstQuitMessage 函数功能:
该函数向系统
明有个线程有终止请求。通常用来响应M_DESTRY消息。 函数原型:
VID PstQuitMessage(int nExitCde); 参数:
pExitCde:
指定应用程序退出代码。此值被用作消息M_QUIT的Param参数。 返回值:
无。 备注:
PstQuitMessage寄送一个M_QUIT消息给线程的消息队列并立即返回;此函数向系统表明有个线程请求在随后的某一时间终止。 当线程从消息队列里取得M_QUIT消息时,应当退出消息循环并将控制返回给系统。返回给系统的退出值必须是消息M_QUIT的Param参数。 速查:
inds NT:
3.1及以上版本;inds:
95及以上版本;inds CE:
1.0及以上版本;头文件:
inuser.h;输入库:
user32,lib:
Uhicde:
在ihds NT环境下以Unicde和ANSI方式实现。 BeginPaint BeginPaint函数准备指定的窗口来重绘并将绘画相关的信息放到一个PAINTSTRUCT结构中。 HDC BeginPaint( HND hnd, // 窗口的HANDLE LPPAINTSTRUCT lpPaint // 绘画信息 ); 参数:
hnd:[输入]被重绘的窗口HANDLE lpPaint:[输出]指向一个用来接收绘画信息的PAINTSTRUCT结构 返回值:
如果函数成功,返回值是指定窗口的显示设备内容HANDLE 如果函数失败,返回值是NULL,指示没有得到显示设备内容 inds NT/201X/XP: 使用GetLastErrr得到更多的错误信息。 备注:
BeginPaint函数自动设置显示设备内容的剪切区域而排除任何
更新区域外的区域更新区域通过InalidateRect或InalidateRgn函数和系统的改变大小、移动、创建、滚动或其他的影响客户区操作来设置的。如果更新区域被标记为可擦除的,BeginPaint发送一个M_ERASEBKGND消息给窗口。 一个应用程序除了响应M_PAINT消息外,不应该调用BeginPaint。每次调用BeginPaint都应该有相应的EndPaint函数。 如果被绘画的客户区中有一个^符号,BeginPaint自动隐藏该符号,而保证它不被擦除。 如果窗口类有一个背景刷,BeginPaint使用这个刷子来擦除更新区域的背景。 例子代码:
你使用BeginPaint和EndPaint函数来准备和完成客户区的绘画。BeginPaint返回一个用来绘画的客户区的显示设备内容的HANDLE,EndPaint终止绘画请求,并释放设备内容。 Textut 函数功能:
该函数用当前选择字符、背景颜色和正文颜色将一个字符串写到指定位置。 函数原型:
BL Textut (HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString); 参数:
hdc:
设备环境句柄。 nXStart:
指定用于字符串对齐的基准点的逻辑X坐标。 nYStart:
指定用于字符串对齐的基准点的逻辑Y坐标。 lpString:
指向将被绘制字符串的指针。此字符串不必为以\0结束的,因为cbString中指定了字符串的长度。 cbString:
字符串的字符数。 返回值:
如果函数调用成功,返回值非零;如果函数调用失败,返回值是0。 inds NT:
若想获得更多错误信息,请调用GetLastErrr函数。 备注:
对基准点的解释依赖于当前字符对齐模式,一个应用程序可以调用GetTextAlign来获得该模式,调用SetTextAlign来更改该模式。 缺省地,此函数不能使用和修改当前位置,但一个应用程序可以在每次在指定设备环境中调用Textut之前,通过将参数fMde设为TA_UPDATECP值来调用SetTextAlign,以允许系统在调用Textut时修改当前位置,当上述标志设置时,系统会忽略随后调用Textut中的
nXStart和nYStart值。 当把函数Textut放入一个路径括号内时,系统为包含每一个字符并加上字符值的TrueType正文产生一个路径,产生的区域是字符框加上正文,而不是正文本身,可以在把Textut放入路径括号之前设置背景模式为透明的,这样就能得到由TrueType正文的轮廓封闭而成的区域。下面是说明这个过程的例程代码:
GetClientRect(hnd, BeginPath(hdc); Textut(hdc, r.left, r.tp, Defenestratin can be hazardus , 4); EndPath(hdc); SelectClipPath(hdc, RGN_AN D); FillRect(hdc, r, GetStckbject(GRAY_BRUSH))。 速查:
inds NT:
3.1及以上版本;inds:
95及以上版本;inds CE:
不支持;头文件:
ingdi.h;库文件:
gdi3
2.lib;Unicde:
在inds NT环境下实现为Unicde和ANSI两种版本。 EndPaint EndPaint函数标记指定窗口的绘画过程结束;这个函数在每次调用BeginPaint函数之后被请求,但仅仅在绘画完成以后。 BL EndPaint( HND hnd, // 窗口句柄 CNST PAINTSTRUCT *lpPaint // 绘制窗口的数据 ); 参数:
hnd:
[输入]已经被重画的窗口的HANDLE lpPaint:
[输入]指向一个PAINTSTRUCT结构,该结构包含了绘画信息,是BeginPaint函数返回的返回值:
返回值:
返回值始终是非0 备注:
PAINTSTRUCT 结构体包含了用于绘制窗口客户区的信息。 PAINTSTRUCT定义:
typedef struct tagPAINTSTRUCT { HDC hdc; BL fErase; RECT
rcPaint; BL fRestre; BL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT, *PPAINTSTRUCT; hdc是用于绘制的句柄,fErase如果为非零值则擦除背景,否则不擦除背景,rcPaint 通过制定左上角和右下角的坐标确定一个要绘制的矩形范围,该矩形单位相对于客户区左上角,后面三个参数都是系统预留的,编程一般用不到。 InvalidateRect 该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。 BL InvalidateRect( HND hnd, // handle f ind ith changed update regin CNST RECT *lpRect, // address f rectangle crdinates BL bErase // erase-backgrund flag ); 参数:
hnd:
要更新的客户区所在的窗体的句柄。如果为NULL,则系统将在函数返回前重新绘制所有的窗口, 然后发送 M_ERASEBKGND 和 M_NCPAINT 给窗口过程处理函数。 lpRect:
无效区域的矩形代表,它是一个结构体指针,存放着矩形的大小。如果为NULL,全部的窗口客户区域将被增加到更新区域中。 bErase:
指出无效矩形被标记为有效后,是否重绘该区域的背景。 返回值:
函数成功则返回非零值,否则返回零值。 说明:
被标记为无效矩形的区域直到M_PAINT消息被处理完之后才会消失,或者使用ValidateRect,ValidateRgn函数来使之有效。当应用程序的消息队列中为空时,并且窗体要更新的区域非空时,系统会发送一个M_PAINT消息到窗体。 需要:
inds NT/201X/XP/Vista: 包含inds NT
3.1以及之后版本。 inds 95/98/Me: 包含inds 95 以及之后版本。 Header: 声名在 inuser.h中; 包含在inds.h中。 Library: Use User3
2.lib. atf(将字串转换成浮点型数) 相关函数 ati,atl,strtd,strtl,strtul 表头文件 #include stdlib.h 定义函数 duble atf(cnst char *nptr); 函数说明 atf会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再
遇到非数字或字符串结束时( \0 )才结束转换,并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如12
3.456或123e-2。 返回值 返回转换后的浮点型数。 附加说明 atf与使用strtd(nptr,(char**)NULL)结果相同。 sprintf sprintf 将字串格式化。 在头文件 #include stdi.h 中 语法: string sprintf(string frmat, mixed [args]...); 传回值: 字串
1. 处理字符方向。-负号时表时从后向前处理。
2. 填空字元。 0 的话表示空格填 0;空格是内定值,表示空格就放着。
3. 字符总宽度。为最小宽度。
4. 精确度。指在小数点后的浮点数位数。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 转换字符篇五:
MFC小结笔记 对话框的nk函数,除了对应于初始化的确定按钮,还会在很多时候比如,, 对于dlg.Mdal都是存在返回值的,要对按下其中的按键这个消息进行处理 只需要用if(dlg.Mdal==IDK) { 函数体 } 对话框的nCancel函数自动对应了对话框的关闭按钮。 SetindText((LPCTSTR)m_indtext);更改对话框标题的方法。 m_cntrlrichedit.SetindText(strText);更改对话框内容的方法 编写快捷键的方法: 更好地办法是插入Acceleratr热键资源 添加成员prtected: ACCEL m_hAccel; 在nInitDialg中 m_hAccel = LadAcceleratrs(AfxGetResurceHandle,MAKEINTRESURCE(IDR_ACCELERATR1)); BL CNtepadDlg::PreTranslateMessage(MSG* pMsg) if (m_hAccelTable) { if (::TranslateAcceleratr(m_hnd, m_hAccelTable, pMsg)) { return(TRUE); } } return CDialg::PreTranslateMessage(pMsg); 法2 方法二:
1 声明热键消息处理函数原型 在.h中消息映射声明处(AFX_mSG字样之后)加入如下语句: LRESULT nHtKey(PARAM Param,LPARAM lParam);
2(消息与相应处理函数相关联 在.Cpp中加入消息映射宏,使消息
与相应处理函数发生关系, N_MESSAGE(M_HTKEY,nHtKey);
3(为方便以后的操作 预先在类中创建一个响应M_CREATE和M_DESTRY消息的函数 nCreate与nDestry的框架
4(向系统登记热键 在nCreate函数中加入如下代码以向系统登记热键,本例子的热键设为 Ctrl,Shift,A.
RegisterHtKey(m_hnd,1001,MD_CNTRL|MD_SHIFT, A
RegisterHtKey(m_hnd,1002,MD_CNTRL|MD_SHIFT, a
5(处理热键 在消息处理函数nHtKey中对热键进行处理,并可加入用户希望运行的程序代码 LRESULT C****::nHtKey(PARAM Param,LPARAM lParam) if(Param==1001||Param==1002) Cnd::SetFregrundind;//使得被激活窗口出现在前景 MessageBx( Hell! //用户可在此添加代码 return 0; 6(程序运行完毕后解除热键 在nDestry中通过UnRegisterHtKey解除热键登记,释放系统资源. UnRegisterHtKey(m_hnd,1001);
UnRegisterHtKey(m_hnd,1002); 7(编译并运行程序 法3(直接检测键盘按键的方法(不插入热键资源))仅用于快捷键比较少的情况 If(pMsg- message == M_KEYDN pMsg- Param ==’F’ isCTRLPressed) if ( pMsg- message == M_KEYDN ) { sitch( pMsg- Param ) { // case 0x41: //selete all 这是A对应的键值. //case 0x46: //ctrl+f case 0x56: //Ctrl + V: case 0x58: // CTRL+X cut case 0x43: // cpy case 0x5A: case 0x59: if ( ( GetKeyState( VK_CNTRL ) 0x80 ) ) // 这句话是处理当出现了CTRl+ VK_CNTRL按键时 { m_cntrlrichedit.SendMessage(pMsg- message, pMsg- Param, pMsg- lParam); return TRUE; } break; case 0x53: if ( ( GetKeyState( VK_CNTRL ) 0x80 ) )
CNtepadDlg::nMenuitem32773;break; case 0x46: //ctrl+f if ( ( GetKeyState( VK_CNTRL ) 0x80 ) )
CNtepadDlg::nMenuitem32778 ;break; case 0x52: if ( ( GetKeyState( VK_CNTRL ) 0x80 ) )
CNtepadDlg::nMenuitem32779 ;break; } }// return CDialg::PreTranslateMessage(pMsg); CabutDlg对话框的显示:
CAbutDlg cabutdlg;(自动关联你的资源) cabutdlg.DMdal; 在初始化的时候,系统其实已经将它自动创建的关于对话框资源和那一段代码关联在一起了, 原因是 CMenu* pSysMenu =
GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAbutMenu; strAbutMenu.LadString(IDAUTHR); if (!strAbutMenu.IsEmpty) { pSysMenu- AppendMenu(MF_SEPARATR); pSysMenu- AppendMenu(MF_STRING, IDM_ABUTBX, strAbutMenu); } } 并且在文件视图当中虽然看不到关于对话框的头文件定义,但其实是有的. 在那个关于对话框中,系统已经定义好了两个文本对话框,如果要修改关于对话框的内容,直接修改那个就可以了. MessageBx(NULL,TEXT( MessageBxText(内容) ), TEXT(“Title(标题) ),MB_K);MB_YESN等等,使用了这个之后,如果你需要在点击该消息框的按钮后执行某些操作,就需要对按键的消息进行处理;否则的话,点击按钮就直接退出该消息框,然后执行之后的代码 . Int ret=MessageBx( MessageBxText(内容) , “Title(标
题) ,MB_K|MB_ICNSTP); If(ret==IDK)//用这个来处理用户到底点击了什么按键 { } 同时显示图标和按键
MB_K,MB_IGNRE??,MB_ABRT??,MB_RETRYCANCEL;他们的返回值为IDK,IDIGNRE,IDABRT,IDRETRY; 能以模态形式弹出一个对话框标题位“Title”,内容为“MessageBxText”,具体内容可以设置。; 最后一个参数是用来设置图标的(弹出框的作用类别);MB_K是普通的,MB_ICNSTP MB_ICNQUSTIN是提问的;MB_ICNSTP是禁止的;MB_ICNARNING是警告的;
1. (Rich Edit控件的使用)Rich Edit需要添加变量m_RichEdit,类型位控制变量,通过调 用SetindText(自定义的CString变量)来实现把CString写到Rich Edit的框里面;显示对话框之前调用AfxInitRichEdit,可以放在CLianxiDlg主类的构造函数的开头,或者CLianxiDlg.app类的InitInstance(初始化函数开头),但不能放在CLianxiDlg主类的InitInstance的开头;(原因就是必须保证在主对话框定义对象之前调用这个函数,app类是先于基本类被调用的)
2. 在richedit控件中,去掉默认的NK和NCancel后,点击回车就木有反应了,但把richedit 的属性改为有返回值,就有反应了
3. CDialg::nInitDialg;这段代码是对对话框的初始化,其他的比如findandreplace程序 中对RichEdit的初始化赋值必须在对话框已经建立后才能调用
4. (静态文本控件的使用)静态文本,可以设置为不变的;也可以设置为只要点击该文本,就会 触发一个事件,进而改变静态文本中的内容.方式,添加cntrl型的对应变量,并且在单击函数上写上你想写的代码.CStaticDlg::nStatic1 { MessageBx( 事件发生~ m_static
1.SetindText( 您单击了我~好痛~ } 注意:所有静态文本的初始ID是一样的,所以如果要设置单击事件消息函数或者为其添加对应变量,必须重新设置ID. 注意:
为static添加对应变量时,由于编译器的原因,添加value型时只能在类向导中添加CString类型,但是如果要用其他类型,只需要到具体的代码处去修改,不过不能不通过类向导而直接到代码处添加,因为现在我还不能通过代码把一个变量和一个控件关联起来。 当然还有一种方式,就是用指针进行关联 CStatic*
static1=(CStatic*)GetDlgItem(IDC_STATIC3); CStatic* static2=(CStatic*)GetDlgItem(IDC_STATIC4); CStatic* static3=(CStatic*)GetDlgItem(IDC_STATIC5); UpdateData(TRUE); static1- SetindText(m_input);但是要求m_input必须是CString类型,而不 能向以上那样比较随意的用其他类型。 把其他类型转化为CString类型 int a=„„„„ CString str; str.Frmat( %d , a);
5. (编辑框控件的使用)又称为文本框,用于数据的输出.它本身的设置便是可以自由在编辑 框内输入,但是为了实现交互,得给编辑框定义CString类型的对应变量,再利用UpdateData(TRUE)是把编辑框的内容导入(是剪切型的吗,,,)到它的对应变量上
;UpdateData(FALSE)是把对应变量上的值导入到编辑框中进行显示 如果此时编辑框内已经有数据了,想要改写其中的数据,是不是一定
要用UpdateData(TRUE)把编辑框内的内容剪切到对应变量上,然后修改对应变量,最后再用UpdateData(false)把对应变量的内容写到编辑框内。
6. if(dlg.DMdal != IDK)指的是以模态方式打开成功时,只有执行 CDialg::nK;, 才会突破模态,继续运行下一行程序;执行 CDialg::nCancel;会直接退出模态,并且也不会运行接下来的程序.;如果以上2个函数都没有对调用,则将一直停留在模态阶段,不会进入下面的程序 “if(dlg.DMdal==IDK)”这个语句有两层意义,第
一是dlg.DMdal作用是弹出CPrtDlg对话框,第二层是
dlg.DMdal==IDK是你点击了对话框上的K按钮。就是说你同时做了上述两件事时就执行if语句后面的程序。 然而若选择 if(dlg.DMdal != IDK) { nK; },则是代表无论点击哪一个按键都会调用nK;(这段代码实现了在点击取消时能够退出所有窗口) 一般的在模态下点击取消只会退出模态窗口,究竟怎样才能退出所有窗口? 是不能直接退出所有窗口的.
9.静态文本框当初始框设置为空时的显示是不可见的,隐式的; 编辑框设置了只读属性时,在显示上还是可见的一条空白框,不会隐式
7. //编辑框是可以直接在里面输入数据 UpdateData(TRUE);//这个语句把在编辑框中的数据导入到编辑框对应的变量中 1
1.if(m_Name==“ruc” m_Passrd==“ruc”)//当密码正确,就关掉该对话框,返回IDK,回到主对话框的创建函数中,就不会关闭主对话框; { CDialg::nK;//因为自定义的对话框Lgin的自身没有定义nK和nCancel函数来关闭Lgin对话框和进入对话框。这两个函数的区别仅仅在于返回值不同,nK返回IDK,nCancel返回IDCancel 所以就可以调用基类的nK和nCancel函数去关掉该对话框 } if(dlg.DMdal != IDK)//执行Dmdal(相当于进入了一个子函数)的过程中只有在执行nK和nCancel的时候(因为只有它们才能关掉对话框)才会有返回值,才会跳出DMdal子函数 1
2.单选按钮 控制单选按钮只能选一个的方法,就是让这些按钮都对应同一个变量,只要这个变量的值变化了,就会相应的改变选项.
控制单选按钮只能选中一个的方法,要让他们Tabrder从左到右依次增加 分组(比如处理多道单选题) 设置控件的Tab rder 单击Layut菜单下的Tab rder命令,设置控件的TAB键顺序(Tab rder),保证单选钮的Tab rder连续。 以Tab rder为序,从Grup属性为真的控件开始(包括该控件),到下一个Grup属性为真的控件结束(不包括该控件),所有的这些控件将组成一个组。对于单选钮,同一组内同时只能有一个处于被选中状态。对于由资源编辑器生成的单选按钮控件,在默认情况由inds自动处理同组控件之间的互斥关系。 1
3.通过类向导新增的成员变量会自动在构造函数中进行初始化 1
4.组合框控件 结合了编辑框和列表框的特点,既可以进行输入,也可以在列表框组成部分选择一项 实质上组合框是一个编辑框、列表框和一个按钮的组合 组合框有:
简单组合框、下拉组合框和下拉列表框3种形式
1. AddString(text) //添加项目
2. GetCurSel//获取当前被选项目索引 GetLBText( nIndex, text)//把当前索引的项目保存在text中 为组合框添加项目 从编辑框中读取数据再添加到组合框中 CString text;