VC技巧A.docx
- 文档编号:5444231
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:64
- 大小:77.58KB
VC技巧A.docx
《VC技巧A.docx》由会员分享,可在线阅读,更多相关《VC技巧A.docx(64页珍藏版)》请在冰豆网上搜索。
VC技巧A
VC++使用技巧
张国晓
目录
1.全屏窗口4
1.1方法一(简单通用):
4
1.2方法二(稍复杂但功能多样):
4
2.Radio控件的用法7
3.JPG图片的显示9
3.1图片不失真9
3.1.1方法一(使用过)9
3.1.2方法二(转载)9
3.2图片失真11
3.2.1添加自定义JPG资源11
3.2.2增加一个函数11
3.2.3在OnInitDialog中增加以下代码:
12
3.2.4在OnPaint中增加以下代码:
12
4.屏蔽ESC键、回车键关闭对话框13
5.INI文件操作14
5.1方法一14
5.1.1新建INI文件操作的封装类14
5.1.2封装函数的使用14
5.1.3读写文件函数的使用16
5.2方法二16
5.2.1Ini.h头文件16
5.2.2Ini.cpp文件18
5.2.3CIni的使用27
5.2.4Ini文件内容28
6.按钮美化28
6.1图文按钮的实现CButtonST28
6.2简单的自定义按钮实现29
6.2.1MyButton.h文件29
6.2.2MyButton.cpp文件30
7.动态按钮的创建33
8.100多个动态按钮的消息处理34
8.1方法一(超级烦)34
8.1.1修改消息宏,循环增加消息到消息映射表34
8.1.2按钮的消息处理需要通过拦截消息来实现36
8.2方法二(超简单)37
9.菜单响应函数:
ON_COMMAND和ON_UPDATE_COMMAND_UI,ON_COMMAND_RANGE和ON_UPDATE_COMMAND_UI_RANGE37
一、ON_COMMAND37
二、ON_UPDATE_COMMAND_UI38
三、ON_COMMAND_RANGE38
四、ON_UPDATE_COMMAND_UI_RANGE38
举例说明:
38
1.全屏窗口
1.1方法一(简单通用):
CRectm_rcMain;
GetWindowRect(&m_rcMain);//restorethesrcscreen'ssize;
//deletetheshowingwindow'scaption
LONGstyle=GetWindowLong(m_hWnd,GWL_STYLE);
style&=~WS_CAPTION;
//setthewindow'sshowsytle
SetWindowLong(m_hWnd,GWL_STYLE,style);
//getthescreen'spixel
intscreenX=GetSystemMetrics(SM_CXSCREEN);
intscreenY=GetSystemMetrics(SM_CYSCREEN);
//showwindow
SetWindowPos(NULL,0,0,screenX,screenY,SWP_NOZORDER);
//隐藏鼠标图标
ShowCursor(FALSE);
1.2方法二(稍复杂但功能多样):
原文
全屏显示是一些应用软件必不可少的功能。
比如在用VC++编辑工程源文件或编辑对话框等资源时,选择菜单“ViewFullScreen”,即可进入全屏显示状态,按“Esc”键后会退出全屏显示状态。
在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。
下面将先讨论点击菜单项“ViewFullScreen”实现全屏显示的方法,再讲述按“Esc”键后如何退出全屏显示状态。
1)在CMainFrame类中,增加如下三个成员变量。
classCMainFrame:
publicCFrameWnd
{
private:
//自己添加的三个成员变量
WINDOWPLACEMENTm_OldWndPlacement;//用来保存原窗口位置
BOOLm_bFullScreen;//全屏显示标志
CRectm_FullScreenRect;//表示全屏显示时的窗口位置
protected:
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
}
2)在资源编辑器中编辑菜单IDR_MAINFRAME。
在“View”菜单栏下添加菜单项“FullScreen”。
在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“FullScreen”。
还可以在工具栏中添加新的工具图标,并使之与菜单项“FullScreen”相关联,即将其ID值也设置为ID_FULL_SCREEN。
3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的响应函数。
响应函数如下:
voidCMainFrame:
:
OnFullScreen()
{
GetWindowPlacement(&m_OldWndPlacement);
CRectWindowRect;
GetWindowRect(&WindowRect);
CRectClientRect;
RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect);
ClientToScreen(&ClientRect);
//获取屏幕的分辨率
intnFullWidth=GetSystemMetrics(SM_CXSCREEN);
intnFullHeight=GetSystemMetrics(SM_CYSCREEN);
//将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth,nFullHeight)区域,
//将(0,0)和(nFullWidth,nFullHeight)两个点外扩充原窗口和除控制条之外的客户区位置间的差值,就得到全屏显示的窗口位置
m_FullScreenRect.left=WindowRect.left-ClientRect.left;
m_FullScreenRect.top=WindowRect.top-ClientRect.top;
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight;
m_bFullScreen=TRUE;//设置全屏显示标志为TRUE
//进入全屏显示状态
WINDOWPLACEMENTwndpl;
wndpl.length=sizeof(WINDOWPLACEMENT);
wndpl.flags=0;
wndpl.showCmd=SW_SHOWNORMAL;
wndpl.rcNormalPosition=m_FullScreenRect;
SetWindowPlacement(&wndpl);
}
4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置信息。
voidCMainFrame:
:
OnGetMinMaxInfo(MINMAXINFOFAR*lpMMI)
{
if(m_bFullScreen)
{
lpMMI->ptMaxSize.x=m_FullScreenRect.Width();
lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
//最大的Track尺寸也要改变
lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();
}
CFrameWnd:
:
OnGetMinMaxInfo(lpMMI);
}
1)在ClassView中选中CMainFrame并单击鼠标右键,选择“AddMemberFunction…”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。
voidCMainFrame:
:
EndFullScreen()
{
if(m_bFullScreen)
{
//退出全屏显示,恢复原窗口显示
ShowWindow(SW_HIDE);
SetWindowPlacement(&m_OldWndPlacement);
}
}
2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后调用执行此函数。
由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响应函数OnKeyDown.判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullScreen,便可退出全屏显示状态。
voidCFullScreenView:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
if(nChar==VK_ESCAPE)//如果按的键为Esc键
{
//获取主框架窗口的指针
CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
//调用主窗口类的自定义函数EndFullScreen,便可退出全屏显示状态
pFrame->EndFullScreen();
}
CView:
:
OnKeyDown(nChar,nRepCnt,nFlags);
}
这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增色不少。
本文来自CSDN博客,转载请标明出处:
2.Radio控件的用法
2007-04-2920:
33
转自
先为对话框加上2个radiobutton,分别是Radio1和Radio2。
问题1:
如何让Radio1或者Radio2默认选上?
如何知道哪个被选上了?
关键是选上,“默认”只要放在OnInitDialog()即可。
三种方法可以让它选上,
第一种:
((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上
((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//不选上
((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck();返回1表示选上,0表示没选上
第二种:
关联一个congtrol型变量(子类化),好ctrl+W(即打开classwizard),点开MemberVariables,咦?
怎么没有IDC_RADIO1这个ID?
原来是没有分组。
因为radiobutton通常都是成组使用的,在一组里面是互斥的。
取消,回到对话框资源面板,右键Radio1查看属性把Group选上,那么,Radio1和Radio2就是一组了(怎么知道他们是一组的?
后面说)。
此时,就可以为Radio1增加一congtrol型变量m_ctrlRadio1了。
如下:
m_ctrlRadio1.SetCheck(TRUE);
同样可以使用GetCheck()获取状态。
第三种:
关联一个int型变量(同样需要先分组)m_nRadio1,打开对话框构造函数,你会发现有:
m_nRadio1=-1;m_nRadio1别赋值-1表示哪个都没有选上。
如果你把-1改成0,就会发现Radio1默认被选上了,依此类推,m_nRadio1的值为1就是第二个被选上了(这里同样有问题,哪个是第一个?
哪个是第二个?
)。
获取状态很简单,UpdateData(TRUE)后判断m_nRadio1的值即可。
问题2:
如何使用多组?
多组和一组是一样的使用,只要搞清楚哪个是哪一组的就行了。
再为对话框添加Radio3和Radio4。
很简单,先为这些RadioButton排个顺序(这个必须要做,比如你的一组控件有Radio1,Radio2,Radio3,就把它们的TAB顺序分别设为1,2,3,并将Radio1的Group属性设为True,这样,当选中Radio1的时候和它关联的变量就是0,当选中Radio2的时候和它关联的变量就是1,依此类推),就是排列他们的TABORDER。
在对话框资源面板上Ctrl+D,然后按你自己的理想顺序用鼠标逐个点击就可以了。
不妨假设Radio1、Radio2、Radio3、Radio4分别是1、2、3、4。
Radio1和Radio3都选上Group属性,那么,1、2是一组,3、4是另外一组,因为分组的原则是在选上Group属性的这一个开始直到碰到下一个选上Group属性的。
你不妨再Ctrl+D,令Radio1、Radio2、Radio3、Radio4分别是1、3、2、4,那么Radio1和Radio3是一组,如果m_nRadio1=1,此时是Radio3被选上而不是Radio2被选上。
分好了组就分别使用它们吧。
嗯,也许你还要为它们添加鼠标单击事件,非常简单。
单选按钮控件(RadioButton)的使用
关键词:
单选按钮控件使用方法
一、对单选按钮进行分组:
每组的第一个单选按钮设置属性:
Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto。
如:
Radio1、Radio2、Radio3为一组,Radio4、Radio5为一组
设定Radio1属性:
Group,Tabstop,Auto
设定Radio2属性:
Tabstop,Auto
设定Radio3属性:
Tabstop,Auto
设定Radio4属性:
Group,Tabstop,Auto
设定Radio5属性:
Tabstop,Auto
二、用ClassWizard为单选控件定义变量,每组只能定义一个。
如:
m_Radio1、m_Radio4。
三、用ClassWizard生成各单选按钮的单击消息函数,并加入内容:
voidCWEditView:
:
OnRadio1()
{
m_Radio1=0;//第一个单选按钮被选中
}
voidCWEditView:
:
OnRadio2()
{
m_Radio1=1;//第二个单选按钮被选中
}
voidCWEditView:
:
OnRadio3()
{
m_Radio1=2;//第三个单选按钮被选中
}
voidCWEditView:
:
OnRadio4()
{
m_Radio4=0;//第四个单选按钮被选中
}
voidCWEditView:
:
OnRadio5()
{
m_Radio4=1;//第五个单选按钮被选中
}
四、设置默认按钮:
在定义控件变量时,ClassWizard在构造函数中会把变量初值设为-1,只需把它改为其它值即可。
如:
//{{AFX_DATA_INIT(CUnitBlockTypeFlankPublicAdd)
m_Radio1=0;//初始时第一个单选按钮被选中
m_Radio4=0;//初始时第四个单选按钮被选中
//}}AFX_DATA_INIT
3.JPG图片的显示
3.1图片不失真
3.1.1方法一(使用过)
在头文件中定义OLE_YSIZE_HIMETRICm_height,m_width;//图片的高和宽
IPicture*m_ppicture;//图片对象指针
voidCTouchWindowDemoDlg:
:
DrawBackGound(CDC*pDC)
{
CRectrect;
this->GetWindowRect(rect);
CFilefile(".\\res\\3.jpg",CFile:
:
modeRead);
//获取文件长度
DWORDfilelen=file.GetLength();
//在堆上分配空间
HGLOBALhglobal=GlobalAlloc(GMEM_MOVEABLE,filelen);
LPVOIDpvdata=NULL;
//锁定堆空间,获取指向堆空间的指针
pvdata=GlobalLock(hglobal);//将文件数据读区到堆中
file.Read(pvdata,filelen);
IStream*stream;
GlobalUnlock(hglobal);
//在堆中创建流对象
CreateStreamOnHGlobal(hglobal,TRUE,&stream);
//利用流加载图像
OleLoadPicture(stream,filelen,TRUE,IID_IPicture,(LPVOID*)&m_ppicture);
m_ppicture->get_Width(&m_width);
m_ppicture->get_Height(&m_height);
m_ppicture->Render(*pDC,0,0,(int)(m_width/26.45),(int)(m_height/26.45),
0,m_height,m_width,-m_height,NULL);
}
3.1.2方法二(转载)
转自:
将JPG图片绘制在对话框背景上:
显示JPG图片的函数
voidCMyDlg:
:
ShowPicture(CDC*pDC,CStringm_strBRoute,intx,inty,intwidth,intheight)
{
HANDLEhFile=CreateFile(m_strBRoute,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
_ASSERTE(INVALID_HANDLE_VALUE!
=hFile);
//取得文件大小
DWORDdwFileSize=GetFileSize(hFile,NULL);
_ASSERTE(-1!
=dwFileSize);
LPVOIDpvData=NULL;
//根据文件大小分配内存
HGLOBALhGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);
_ASSERTE(NULL!
=hGlobal);
pvData=GlobalLock(hGlobal);
_ASSERTE(NULL!
=pvData);
DWORDdwBytesRead=0;
//读取文件并存入全局内存
BOOLbRead=ReadFile(hFile,pvData,dwFileSize,&dwBytesRead,NULL);
_ASSERTE(FALSE!
=bRead);
GlobalUnlock(hGlobal);
CloseHandle(hFile);
LPSTREAMpstm=NULL;
//通过全局内存创建IStream*的指针
HRESULThr=CreateStreamOnHGlobal(hGlobal,TRUE,&pstm);
_ASSERTE(SUCCEEDED(hr)&&pstm);
//通过图形文件创建IPicture对象
if(gpPicture)
gpPicture->Release();
hr=OleLoadPicture(pstm,dwFileSize,FALSE,IID_IPicture,(LPVOID*)&gpPicture);
_ASSERTE(SUCCEEDED(hr)&&gpPicture);
pstm->Release();
HDChdc;
hdc=pDC->GetSafeHdc();
if(gpPicture)
{
//取得图片的宽和高
longhmWidth;
longhmHeight;
gpPicture->get_Width(&hmWidth);
gpPicture->get_Height(&hmHeight);
//宽高转换为象素
intnWidth=MulDiv(hmWidth,GetDeviceCaps(hdc,LOGPIXELSX),HIMETRIC_INCH);
intnHeight=MulDiv(hmHeight,GetDeviceCaps(hdc,LOGPIXELSY),HIMETRIC_INCH);
RECTrc;
GetClientRect(&rc);/*取得客户区*/
gpPicture->Render(hdc,x,y,(int)height*hmWidth/hmHeight,height,0,hmHeight,hmWidth,-hmHeight,&rc);
/*显示图片*/
}
GlobalFree(hGlobal);
}
//在OnEraseBkgnd中
CRectrc;
GetClientRect(&rc);
ShowPicture(pDC,strJpgPath,rc.left,rc.top,rc.Width(),rc.Height());
3.2图片失真
3.2.1添加自定义JPG资源
导入JPG图片
3.2.2增加一个函数
HBITMAPCTouchWindowDemoDlg:
:
LoadImageFromID(UINTnIDRes)
{
try
{
HMODULEhInst=GetModuleHandle(NULL);
LPCTSTRlpRes=MAKEINTRESOURCE(nIDRes);
HRSRChRsrc=:
:
FindResource(hInst,lpRes,"JPG");
if(NULL==hRsrc)
returnNULL;
HGLOBALhGloba
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 技巧