VC对话框控件属性的修改
如何实现控件随对话框大小变化而自动调整大小和位置
如何实现控件随对话框大小变化而自动调整大小和位置VC++ 2009-12-28 20:27:42 阅读461 评论0字号:大中小订阅1. 处理对话框的WM_SIZE,然后用MoveWindow或者SetWindowPos来把对话框上面的控件重新调整新位置和大小。
2. 基本的做法就是响应WM_SIZE消息,并按照窗口大小比例来调整控件的位置和大小,控件的大小最好设置成窗口的百分之几,这样的话,就可以根据窗口的大小随时调整了。
3. 每次OnSize 即可获得一个CRect,然后根据这个CRect来确定这些控件的位置和大小,使用函数MoveWindow 或SetWindowpos实现。
4.1)通过下面两个函数获取的是显示屏幕的大小【屏幕的分辨率】(不包括任务栏等区域):int nFullWidth=GetSystemMetrics( SM_CXFULLSCREEN ); //屏幕宽度int nFullHeight=GetSystemMetrics( SM_CYFULLSCREEN ); //屏幕高度2)这两个函数获取的是真正屏幕的大小【屏幕的分辨率】(包括任务栏等区域):int cx = GetSystemMetrics( SM_CXSCREEN );int cy = GetSystemMetrics( SM_CYSCREEN );如:用前两个函数获取的大小可能是1024*687 ,而用下边两个获取的就是1024*768。
5. 在OnSize() 中调用:GetClientRect() 和GetWindowRect() 函数可获取窗口大小,但需注意得到的是设备坐标,如果需要画图什么的还需要转换成逻辑坐标。
6. 字体大小随窗口变化而自动变化,比如说始终使字的高度始终占窗口的1/3。
使用:1). 在Creat中将nHeight设成窗口长度或者宽度的一定比值就行了(最好在onsize函数中设置);2). 使用WM_FONTCHANGE 消息。
VC中修改字体
VC中设置对话框中控件的字体1.新建一个基本对话框的工程,建立几个基本的控件:按钮,静态文本,分组框,文本框。
如图1。
2.在对话框类的OnInitDialog()中修改字体属性,其中要用到CWnd类中的CreateFont和SetFont函数。
CreateFont函数功能:该函数创建一种有特殊性的逻辑字体,此逻辑字体可以在后面被任何设备选择。
函数原型:HFONT CreateFont(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD fdwltalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, LPCTSTR lpszFace);nHeight:指定字体的字符单元或字符的逻辑单位高度,字符的高度值(也被称为em高度)是指字符单元高度值减去内部标头值。
0:字体映射器转换在选择匹配时用一个缺省的高度值。
nWidth:指定所要求字体的字符的逻辑单位的平均宽度。
如果此值为0,字体映射器选择一个closest match值,closest match值是由比较当前设备的特征系数与可使用字体的数字化特征系数之差的绝对值而确定的。
nEscapement:指定移位向量和设备X轴之间的一个角度,以十分之一度为单位。
移位向量平行于正文行的基线。
nOrientation:指定每个字符的基线和设备X轴之间的角度。
FnWeight:在0到1000之间指定字体的权值,如400表示标准体,700表示黑(粗)体,如果此值为0,则使用缺省的权值。
为方便定义,可使用如下值:FW_DONTCARE:0;FW_THIN;100;FW_EXTRALIGHT;200;FW_ULTRALIGHT;200;FW_LIGHT;300;FW_NORMAL:400;FW_REGULAR;400;FW_MEDIUM;500;FW_SEMIBOLD;600;FW_DEMIBOLD;600;FW_BOLD:700;FW_EXTRABOLD;800;FW_ULTRABOLD;800;FW_HEA VY;900;FW_BLACK;900。
VCMFC中的CComboBox控件使用详解
VCMFC中的CComboBox控件使用详解VC/MFC中的CComboBox控件使用详解CComboBox控件详解CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list).CComboBox控件的常用设置属性说明:type属性:里面一共有三个选项.就是其三种形式, 我们常用的是后两种形态,其区别就是Dropdown的编辑区为可编辑控件,而droplist 为静态控件.Data属性:当程序初始化的时候,下拉列表将显示其属性里面的内容,内容用分号分隔.其属性只支持后2中形式,Sort 属性:对添加到下拉列表框中的数据自动进行排序,如果你不想他改变你的显示序列,把他设置成False.控件是一个窗口.其基类是为CWnd.所以CComboBox也可以使用CWnd的一些函数,它自己的函数有30几种.我写了一个示范程序,演示了一些常用的函数,你可以参考其代码看到其功能.注:m_cbox 为CComboBox控件的关联变量,m_end为EDIT控件的关联变量1.GetCount() 函数:用以获得列表框中的选项数目. int GetCount() const;(此乃函数原型,我会列在每条的后面) 下面的例子是程序中各个按钮里面的代码int i;CString str;i=m_cbox.GetCount();str.Format ("%d",i);m_end="一共有"+str+"个数据";UpdateData(FALSE);2.GetCurSel() 函数:用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,如果没有选择任何选项将会返回-1 Int GetCurSel() constint i;CString str;i=m_cbox.GetCurSel ();str.Format ("%d",i+1);if (i==-1) m_end="你什么都没有选";else m_end="你选的是第"+str+"项";UpdateData(FALSE);3.SetCurSel函数:选取列表框中的一个选项,索引从0开始,-1为什么都不选.当你需要把列表框中已经选取的内容清空时就可以使用这个函数;if(m_i<3) m_cbox.SetCurSel (m_i++);//m_i为int型变量用以计数else {m_cbox.SetCurSel (-1);m_i=0;}4.SetEditSel函数:设置编辑区中蓝色选中字段的长度, BOOL SetEditSel( intnStartChar,int nEndChar ); nStartChar是起始的位置,当设置为-1时为不选择任何字段,nEndChar是结束位置.还有一个对应的函数GetEditSel是取得其位置,在此不详解.m_cbox.SetEditSel (3,5);//在编辑框中打入一串数字在按此按钮就能看到效果//其作用就是选中第3到第5个字符作为热点5.Clear() Cut() Paste() Copy() 这四个函数我放在一起说,因为他们都是针对编辑框中选定的文字进行编辑的函数,很多初学者很不明白这4个函数,使用这些函数没有作用,其实不然,这些函数对于在编辑框中的内容不进行处理,他真正处理的是你用鼠标选中的内容,对于Clear()函数很多书中解释都是有误的,很多书中对他的解释是清除当前选中的文本,我认为这样的解释是有歧异的,真正的解释是把你刚选中的文本释放掉,也就是不选,而不是把选中的删除,真正的删除选中的文本的函数是Cut(),Copy()是复制选中的文本,Paste()是粘贴到光标处.其演示就不写在程序中,有兴趣的朋友可以自己试试.6.LimitText()函数.其作用是限制在编辑框中键入的文本长度,BOOL LimitText(int nMaxChars); 当nMaxChars为0时,不是不能输入,而是长度最大化为65535字节7.GetLBText()函数.其原型为void GetLBText( int nIndex, CString&rString ).nIndex为列表框中数据的索引值,rString 为字符串,其作用就是把索引号为nIndex的数据放到rString变量中.与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为nIndex中数据的长度m_cbox.GetLBT ext (2,m_end); // GetLBText按钮UpdateData(0);CString str; //GetLBTextLen按钮int i=m_cbox.GetLBTextLen (2);str.Format ("%d",i);m_end=str;UpdateData(FALSE);8.AddString() DeleteString() InsertString() ResetContent() 四个函数放在一起,他们都是针对下拉列表框的处理函数, AddString(LPCTSTR lpszString) 是在列表框的尾巴添加一条数据,参数为字符串. DeleteString(UINT nIndex)为删除指定索引为nIndex的数据. InsertString(int nIndex, LPCTSTR lpszString)在索引nIndex处插入IpszString的内容. ResetContent()是清除列表框中所有的内容.9.SetDroppedWidth(UINT nWidth) 函数.用于设定下拉列表框的最小宽度,当下拉列表框中的数据很长不能完全显示时,我们可以使用这个函数把列表框的宽度设置的大些.同样GetDroppedWidth()是返回列表框的宽度.以下为总结了各大论坛中对CCombBox控件使用的问题.并给出了正解.1.关于CComboBox在对话框中没有下拉项目的问题答: 资源编辑器中对话框中CComboBox组件的垂直范围拉大了下,就看见字体了,看到那个向下的黑箭头了吗,点他下拉,嘿嘿就这么简单.2.请问怎样能让CCombobox记住用户的输入.下次使用时还有答: 要记住用户的输入必须用到文件读写,或者把内容添加到注册表中,我会在以后给出解决办法.3. CCOMBOBOX如何使它只读,不能编辑答: 看了本文的介绍也许你现在知道了, CCOMBOBOX有三种类型的,选择你需要的吧!4. 我要让界面一显示,就能在Combo框中显示默认的数据答: 你要在OnInitDialog里面加上我上面所提到的SetCurSel()函数就行了.5. 如何把选好的内容赋给变量答: 先给CCOMBOBOX设置一个CString关联变量,再添加事件处理函数CBN_ Selchange.使用UpdateData(FALSE)就行了.6. 在CComboBox组合框中,条目的对齐方式是左对齐,能设置为对中或者右对齐吗?答: 没有直接的方法,你必须自己对齐, 比如最大长度是10int i;String.Format("%10d", i);CComboBox->AddStringVC combobox 使用大全 ---------------------------------------------------一、如何添加/删除Combo Box内容1. 在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。
VC6.0中控件及按钮的设置和使用
VC6.0中控件及按钮的设置和使用VC学习笔记1:按钮的使能与禁止用ClassWizard的Member Variables为按钮定义变量,如:m_Button1;则m_Button1.EnableWindow(true); 使按钮处于允许状态m_Button1.EnableWindow(false); 使按钮被禁止,并变灰显示VC学习笔记2:控件的隐藏与显示用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件。
例1:CWnd *pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号pWnd->ShowWindow( SW_HIDE ); //隐藏控件例2:CWnd *pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号pWnd->ShowWindow( SW_SHOW ); //显示控件以上方法常用于动态生成控件,虽说用控件的Create函数可以动态生成控件,但这种控件很不好控制,所以用隐藏、显示方法不失为一种替代手段。
VC学习笔记3:改变控件的大小和位置用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。
void MoveWindow(int x,int y,int nWidth,int nHeight);void MoveWindow(LPCRECT lpRect);第一种用法需给出控件新的坐标和宽度、高度;第二种用法给出存放位置的CRect对象;例:CWnd *pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT1为控件ID号pWnd->MoveWindow( CRect(0,0,100,100) ); //在窗口左上角显示一个宽100、高100的编辑控件SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);第一个参数我不会用,一般设为NULL;x、y控件位置;cx、cy控件宽度和高度;nFlags常用取值:SWP_NOZORDER:忽略第一个参数;SWP_NOMOVE:忽略x、y,维持位置不变;SWP_NOSIZE:忽略cx、cy,维持大小不变;例:CWnd *pWnd;pWnd = GetDlgItem( IDC_BUTTON1 ); //获取控件指针,IDC_BUTTON1为控件ID号pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE ); //把按钮移到窗口的(50,80)处pWnd = GetDlgItem( IDC_EDIT1 );pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE ); //把编辑控件的大小设为(100,80),位置不变pWnd = GetDlgItem( IDC_EDIT1 );pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER ) ; //编辑控件的大小和位置都改变以上方法也适用于各种窗口。
VC中使用TABControl控件
VC中使用TABControl控件VC中使用TAB Control控件假如我现在有个SDI程序,View是Form View,想在上面放个Tab Control,包含两个Page。
现在让我们来看看应该怎样处理。
首先当然要增加一个Tab Control资源,然后利用Class Wizard,在View中增加一个Control变量。
接着建立两个对话框资源,别忘了把Style改为Child,Border 改为None。
然后就可以在上面加其他控件了。
接着利用Class Wizard,分别为这两个对话框建立两个类,比如CPage1和CPage2。
然后在View类头文件中,加入这两个对话框对象。
同时增加一个变量int m_CurSelTab,用了表明是哪个Page即将被切换。
为了避免用户在切换Tab时,程序对Tab Index的枚举,可以利用数组来做这个事情。
在View的初始化函数中需要把CPage1、CPage2和Tab Control关联起来,并保存页面地址,设置初始页面,等等。
void CTab_testView::OnInitialUpdate(){CFormView::OnInitialUpdate(); GetParent()-RecalcLayout(); ResizeParentToFit();//为Tab Control增加两个页面m_tab.InsertItem(0, _T(“First"));m_tab.InsertItem(1, _T("Second")); //创建两个对话框m_page2.Create(IDD___, m_tab); //设定在Tab内显示的范围CRect rc;m_tab.GetClientRect(rc);rc.top += 20;rc.bottom -= 8;rc.left += 8;rc.right -= 8;m_page1.MoveWindow(rc);m_page2.MoveWindow(rc);//把对话框对象指针保存起来pDialog = m_page1;pDialog = m_page2;//显示初始页面pDialog-ShowWindow(SW_SHOW);pDialog-ShowWindow(SW_HIDE);//保存当前选择m_CurSelTab = 0;}这里面需要注意的是,我用了一个CDialog指针数组来进行保存,数组的大小是Tab Control页面的个数,数组下标对应着每个页面的索引(这样方便快速存取)。
VC控件随窗口大小变化而变化的方法
VC控件随窗口大小变化而变化的方法在VC中,控件随窗口大小变化而变化的方法有多种实现方式。
下面将介绍一种比较常用的方法。
方法一:使用控件的锚点属性3.根据需要,可以调整锚点的位置和大小。
4. 在对话框的OnSize函数中添加控件调整的代码。
示例代码如下:```void CMyDialog::OnSize(UINT nType, int cx, int cy)CDialogEx::OnSize(nType, cx, cy);//获取对话框的客户区大小CRect rect;GetClientRect(&rect);//调整控件的大小和位置m_btnOK.SetWindowPos(NULL, rect.right - 100, rect.bottom - 100, 0, 0, SWP_NOZORDER , SWP_NOSIZE);```在这个示例代码中,m_btnOK是一个按钮控件的变量。
调用SetWindowPos函数可以设置控件的位置和大小。
rect.right和rect.bottom分别表示对话框客户区的右边界和底边界的坐标。
在此示例中,按钮的右下角离对话框的右下角保持了100个像素的距离。
需要注意的是,OnSize函数中必须调用基类的OnSize函数,以确保窗口的基本布局正常。
总结:使用锚点属性和OnSize函数可以实现控件随窗口大小变化而变化。
通过设置锚点的位置和大小,再在OnSize函数中根据对话框的大小调整控件的大小和位置,可以适应不同窗口大小的需求。
这种方法是比较简单、快速实现的方式,特别适用于需要调整的控件数量较少的情况。
除了使用锚点属性和OnSize函数外,还可以使用其他方式实现控件随窗口大小变化,比如使用MoveWindow函数或者使用布局管理器等。
在实际开发中,需要根据具体情况选择合适的方法。
VC++MFC基础教程
dcb.Parity=NOPARITY; //无奇偶校验位 dcb.StopBits=TWOSTOPBITS; //两个停止位 SetCommState(hCom,&dcb);
m_cComm.put_OutBufferSize(512); //设置输出缓冲区 m_cComm.put_Settings(TEXT("9600,n,8,1"));//波特率,无校验,个数
据位,个停止位
if(!m_cComm.get_PortOpen())
{
m_cComm.put_PortOpen(TRUE); //打开串口
B)修改控件属性
修改上面的示例编辑框属性: ID——IDC_EDIT_RECV;
Multiline——True; Want Return——True; Vertical Scroll——True; Auto VScroll——True;
修改下面的示例编辑框属性: ID——IDC_EDIT_SEND; Multiline——True; Vertical Scroll——True;
1.3、API 串口编程
按照步骤一新建 Serial 工程,这里不赘述了。
A)添加 API 串口初始化代码
1、在 SerialDlg.cpp 文件中添加全局变量:
HANDLE hCom; //全局变量,串口句柄 // CSerialDlg 对话框
2、在 SerialDlg.cpp 文件中的 OnInitDialog()函数添加如下代码:
AfxMessageBox("写串口失败!"); }
C++ VC登录对话框
图3.19 “Adding a Class”对话框
单击“OK”按钮,将弹出如图3.20所示的New Class对话框。其中,Name框 是用来输入用户定义的类名,注意要以“C”字母打头,以保持与Visual C++标 识符命名规则一致。File Name框用来指定类的源代码文件名,单击“Change” 按钮可改变默认的源文件名称及其在磁盘中的位置。Base class和Dialog ID内 容是由系统自动设置的,一般无须修改。从Base class框的内容可以看出,用户 对话框类是从基类CDialog派生而来的。
程序文本、界面编辑区
编译信息显示区
图3.3 VC++ 6.0 编程平台
2.建立管理系统工程 选择“文件”→“新建”菜单,在弹出的“新建”对话框中选择“工程” (Project)标签,这时显示出一系列的应用程序项目类型;选择MFC AppWizard (exe)的项目类型(该类型用于创建可执行的Windows应用程序即MFC应用程序, 不同于控制台方式的“Win32 Console Application”),并在“工程”(Project) 中输入项目名XSCJTEST(为与后文叙述一致,请读者在编程时尽量使用本书定义的 名称),在“位置”(Location)处选择或输入工程保存的位置,如图3.4所示。
3.基于资源的程序设计 .
Windows应用程序常常包含众多图形元素,例如光标、菜单、工具 栏、位图、对话框等。每一个这样的资源都用相应的标识符来区分,而 且Windows内部也有预定义的资源,例如在Ex_HelloWin中,LoadIcon 和LoadCursor函数将系统内部的IDI_APPLICATION(应用程序图标) 和IDC_ARROW(箭头光标)作为创建窗口的窗口图标和鼠标指针。
VC++控件 VC++TAB控件使用 VC6.0Tab control
在对话框中加入属性页作者:黄晨量下载本文全部源代码当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置。
本文针对这种方法来讨论几种可能实现的方案。
方案一本方案的例子请见源代码打包文件中的Property1部分在对话框上放置一个Tab Control的控件,再在对话框上放置所需的控件(本例放置了2个按钮,试图在每个标签中显示一个)。
然后利用Class Wizard来为Tab Control控件创建一个控件变量,该变量是CTabCtrl类的,再为其他控件也创建相应的控件类。
在主对话框的初始函数中CProperty1Dlg::OnInitDialog()加入如下代码://本例插入两个标签,实际运用中可通过循环插入所需个数的标签,运行后默认第一个标签被选中m_tab.InsertItem( 0, _T("Tab1") );m_tab.InsertItem( 1, _T("Tab2") );//将不是第一个标签的控件隐藏掉,只留下你要的控件m_button2.ShowWindow( SW_HIDE );再利用ClassWizard处理Tab Control的TCN_SELCHANGE 的消息。
在消息处理函数中,利用CWnd::ShowWindow来使相应的控件显示和隐藏。
void CProperty1Dlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult){//GetCurSel返回当前被选中的标签的索引号(以0为基础算起)int sel = m_tab.GetCurSel();switch(sel){case 0:m_button1.ShowWindow( SW_SHOW );m_button2.ShowWindow( SW_HIDE );break;case 1:m_button2.ShowWindow( SW_SHOW );m_button1.ShowWindow( SW_HIDE );break;}*pResult = 0;}这样做以后就可以使界面上的控件在不同的标签中显示了,但是这个方案也有很多弊病。
VC中Tab Control控件使用方法
VC中Tab Control控件使用方法下面我们来看一下使用步骤。
1. 新建一个MFC工程,取名xyTabControl,选择Dialog based,然后Finish。
2. 删除对话框上默认添加的三个控件。
添加Tab Control控件并在Property属性中设置ID为IDC_TAB1,添加变量m_tabctrl,类型为CTabCtrl。
3. 在对话框的初始化函数OnInitDialog里面添加如下代码:m_tabctrl.InsertItem(0,"memo0"); //添加参数一选项卡m_tabctrl.InsertItem(1,"memo1"); //添加参数二选项卡4.在对话框资源里面添加两个对话框资源, ID分别命名为IDD_PARA1, IDD_PARA2。
字体为宋体, 字号为9, style为Child, Border为None, 调整高度宽度到适中尺寸。
再分别为其添加对应的基于CDialog类CPara1, CPara2。
5. 在CxyTabControlDlg类中添加两个成员变量m_para1, m_para2, 分别是两个子对话框的实例. 代码如下:CPara2 m_para2;CPara1 m_para1;6. 布置IDD_PARA1和IDD_PARA2对话框如下图:7. 在IDD_xyTabControl_DIALOG对话框的初始化函数OnInitDialog里面添加如下代码://关联对话框,并且将IDC_TABTEST控件设为父窗口m_para1.Create(IDD_PARA1,GetDlgItem(IDC_TAB1));m_para2.Create(IDD_PARA2,GetDlgItem(IDC_TAB1));//获得IDC_TABTEST客户区大小CRect rs;m_tabctrl.GetClientRect(&rs);//调整子对话框在父窗口中的位置rs.top += 20;rs.bottom -= 20;rs.left += 1;rs.right -= 2;//设置子对话框尺寸并移动到指定位置m_para1.MoveWindow(&rs);m_para2.MoveWindow(&rs);//分别设置隐藏和显示m_para1.ShowWindow(1);m_para2.ShowWindow(0);//设置默认的选项卡m_tabctrl.SetCurSel(0);8. 添加Tab Control控件的TCN_SELCHANGE事件响应函数OnSelchangeTabtest(NMHDR* pNMHDR, LRESULT* pResult) ,函数体代码如下:int CurSel = m_tabctrl.GetCurSel();switch(CurSel){case 0:m_para1.ShowWindow(true);m_para2.ShowWindow(false);break;case 1:m_para1.ShowWindow(false);m_para2.ShowWindow(true);break;default:;*pResult = 0;}9.好了,完成,这个小程序很简单,效果如下图:。
vc复选框及相关控件使用
5.复选框单选框下面以一个具体的例子演示复选框和单选框的用法。
(1)利用应用程序向导新建一个基于对话框的程序Ex040105b。
(2)在对话框上加一个静态文本框和两个单选框,标题分别是“性别”、“男”、“女”,第一个单选框选中群组(Group)属性,按下Ctrl+T组合键测试一下,是否只能选“男”或“女”。
(3)利用类向导,为第一个单选框增加一个整型的成员变量m_iSex。
(4)增加1个静态文本框和3个复选框,标题分别是“个人爱好”、“中国象棋”、“上网聊天”和“电脑游戏”。
(5)双击“确定”按钮增加响应函数,具体代码如下:void CEx040105bDlg::OnOK(){CDialog::OnOK();CString strMess ;if(0 == m_iSex)strMess = "你是帅哥\n";else if(1 == m_iSex)strMess = "你是美女\n";elsestrMess = "性别未知\n";//复选框也可以关联变量,如果关联的变量值为true表示被选中,此处用另外一种方法。
strMess += "---------------\n你的受好\n";CButton * pBtn = NULL ;pBtn = (CButton * )GetDlgItem(IDC_CHECK1);if(NULL != pBtn && pBtn->GetCheck())strMess += "中国象棋\n";pBtn = (CButton * )GetDlgItem(IDC_CHECK2);if(NULL != pBtn && pBtn->GetCheck())strMess += "上网聊天\n";pBtn = (CButton * )GetDlgItem(IDC_CHECK3);if(NULL != pBtn && pBtn->GetCheck())strMess += "电脑游戏\n";AfxMessageBox(strMess);}(6)为了美观,可以加一个群组控件,并把对话框的标题改成“个人信息”,按Ctrl + F5组合键创建并运行Ex040105b.exe,效果如图4-9所示。
VC-MFC对话框控件随窗口自动调整大小
作者:**************一般情况下,我们新建的对话框,里面的“确定”和:取消”按钮,在对话框最大化得时候,不会一起变大的,而是保持原来的大小。
而MFC默认不支持控件大小按比例缩放功能最简单的情况:当我们点击最大化按钮的时候,对话框会最大化,但是控件“确定”和“取消”不会跟着变大。
如果我们在对话框上面有多少控件,那么会很丑,而且很不实用,最大化本来就是想看的更清楚嘛。
我们可以采取下面的措施:对话框也是窗口,最大化是对窗口大小的改变,而在windows message handle中有个WM_SIZE的消息,该消息在窗口大小发生变化的时候会产生。
那么我们可以根据这个消息,在窗口大小发生变化的时候,利用MoveWindow()函数来重新设置各个控件的大小。
在网上查了一些资料,都不方便使用,还需要自己写好多代码。
在这里我封装了一个简单的类,可以实现这个功能:用法是,1、在对话框类头文件中添加此类的对象CItemResize m_itemSize;2、在窗口初始化函数OnInitDialog中填写需要改变大小的对应控件的ID号:m_itemSize.AddItemRect(IDOK, this);m_itemSize.AddItemRect(IDC_LIST1, this);此处的ID替换成对话框上实际的ID。
3、在OnSize函数中调用:m_itemSize.ResizeItem();功能实现完毕类代码代码如下:头文件:ItemResize.h#ifndef ITEMRESIZE_H#define ITMERESIZE_H/************************************************************************/ /* 作者:***************/ /************************************************************************/#include<stdio.h>#include<vector>using namespace std;typedef struct_RESIZEINFO{UINT nID;CWnd* pParent;float fLeft;float fRight;float fTop;float fBottom;}RESIZEINFO;class CItemResize{CRect m_rectDlg;//在窗口创建时,添加需要自动按比例调整大小的控件ID。
VC编程技术点滴(对话框)
VC编程技术点滴(二)定义一个简单的对话框(2009-05-12 10:00:11)标签:vc自定义对话框it分类:VC学习点滴一、定义对话框资源继续上一节使用的程序例子。
如下图所示,在程序资源视图中添加一个自定义的对话框:对话框比较简单,只是添加了一个编辑框控件和一个显示提示文字的静态文本控件,另外的OK按钮和Cancel按钮是系统自动添加的。
二、定义对话框类有了对话框资源,还要定义一个与之关联的对话框类才可以使用。
如下图所示定义对话框类:有了对话框类,为了使其它对象(如CSysMenuView对象)可以获取对话框中的控件信息,需要为对话框类添加一个公共成员变量,以保存编辑框的输入值。
这里定义一个字符串变量name,如下图所示:获取对话框中编辑控件输入值的方法有多种,下图是通过定义编辑框控件的关联变量(控件的成员变量有两种类型,一种是值变量,保存用户输入;一种是控件变量,代表当前控件对象)m_Name来获取输入值:也可以实验一下定义一个编辑框的控件变量m_Edit,如下图所示:为控件添加成员变量后,系统自动生成以下代码://MyDialog.h......class MyDialog : public CDialog{// Constructionpublic:CString name;//前面定义的MyDialog类的公共成员变量,用于在对话框以外获取数据信息MyDialog(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(MyDialog)enum { IDD = IDD_DIALOG1 };CEdit m_Edit;CString m_Name;//}}AFX_DATA......//MyDialog.cpp......MyDialog::MyDialog(CWnd* pParent ): CDialog(MyDialog::IDD, pParent){//{{AFX_DATA_INIT(MyDialog)m_Name = _T("");//在构造函数中初始化控件成员变量//}}AFX_DATA_INIT}//对话框数据交换函数void MyDialog::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(MyDialog)//关联编辑控件及其成员变量DDX_Control(pDX, IDC_EDIT1, m_Edit);DDX_Text(pDX, IDC_EDIT1, m_Name);//}}AFX_DATA_MAP}......下面为对话框的OK按钮添加消息处理函数。
vc6.0中更改对话框背景色和字体颜色
vc6.0中更改对话框背景⾊和字体颜⾊⽅法⼀:设置所有窗⼝的颜⾊MFC程序修改对话框的背景和⽂字颜⾊最简单的⽅法就是调⽤SetDialogBkColor函数,SetDialogBkColor是CWinApp类的成员函数,以下是该函数的原型:void CWinApp::SetDialogBkColor(COLORREF clrCtlBk, COLORREF clrCtlText);请注意,SetDialogBkColor函数并不是对Windows的某个API的封装,他是MFC框架的⼀部分,所以不使⽤MFC的程序也就不能享受这种⽅便。
这个函数的使⽤很简单,在程序的CWinApp派⽣类的InitInstance函数中,添加⼀⾏代码就⾏了,写在domodal()的上⼀句:SetDialogBkColor(RGB(188,197,230),RGB(13,125,188));注:前⼀个为背景⾊,后⼀个为字体颜⾊。
⽅法⼆:设置当前窗⼝改变对话框的背景颜⾊的原理很简单,就是响应WM_ERASEBKGND消息,⽤⾃定义的颜⾊填充对话框的客户区背景,代替对话框窗⼝默认的背景填充动作。
改变控件和字体的颜⾊同理,是响应WM_CTLCOLOR这⼀消息。
具体操作,⽅法如下:⾸先://消息映射BEGIN_MESSAGE_MAP(CHelloDlg, CDialog)//{{AFX_MSG_MAP(CHelloDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_CTLCOLOR() //字体颜⾊ON_WM_ERASEBKGND() //背景⾊ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPEND_MESSAGE_MAP()其次:定义两个函数afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);第三:重载OnEraseBkgnd和OnCtlColor其中预先定义:protected:CBrush m_brBkgnd;//设置对话框背景⾊⽅法⼀:可以实现(但有点问题)BOOL CHelloDlg::OnEraseBkgnd(CDC* pDC){CRect rect;GetClientRect(&rect);m_brBkgnd.CreateSolidBrush(RGB(183,213,213)); //背景⾊pDC->FillRect(&rect,&m_brBkgnd);return TRUE;}⽅法⼆:可⾏BOOL CClientDlg::OnEraseBkgnd(CDC* pDC){CBrush back(RGB(220,215,254));CBrush* pold=pDC->SelectObject(&back);CRect rect;pDC->GetClipBox (&rect);pDC->PatBlt (rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);pDC->SelectObject(pold);return TRUE;}⽅法三:也可⾏BOOL CHelloDlg::OnEraseBkgnd(CDC* pDC){CBrush MyBrush;MyBrush.CreateSolidBrush(RGB(0,255,0));CBrush *pOldBrush=pDC->SelectObject(&MyBrush);CRect Rect;GetClientRect(&Rect);pDC->Rectangle(&Rect);pDC->SelectObject(pOldBrush);return TRUE;}//设置对话框中控件的字体颜⾊HBRUSH CHelloDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if(pWnd->GetDlgCtrlID() == IDC_EDIT_MULLINE) //多⾏edit控件{pDC->SetTextColor(RGB(13,125,188)); //设置字体颜⾊return hbr;}else{pDC->SetBkMode(TRANSPARENT);pDC->SetTextColor(RGB(255,125,188));return (HBRUSH)m_brBkgnd; //因为CBrush类实现了HBRUSH类型转换操作符 }}。
VC改变窗口大小和样式
改变窗口的外观和大小改变窗口的外观和大小需要在窗口创建以前改变。
所以我们可以在CMainFrame的PreCreateWindow中改变CREATESTRUCT 结构体的值就行了。
E.G.BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)改变窗口的大小-> cs.cx = 300; cs.cy = 200;改变窗口的显示位置坐标是 cs.x 和 cs.y这里常用的一个函数是::GetSysMetrics(SM_CXSCREEN);::GetSysMetrics(SM_CYSCREEN);用来取得屏幕的大小。
要改变窗口标题栏的字符串:cs.lpszName = "Seven"; 会发现标题栏不会改变窗口的标题栏的上的字符串。
改变单文档应用程序的标题栏的字符串参考MSDN windowstyles/Frame-window styles 下面有一个Changing the styles of a window create by MFC./ The SDI Case默认的情况是WS_OVERLAPPEDWINDOW and FWS_ADDTOTITLE styles FWS_ADDTOTITLE is add the document title to the window’s caption.去掉FWS_ADDTOTITLE 就可以更改窗口标题栏字符串。
cs.style &= ~FWS_ADDTOTITLE;cs.lpszName = "Seven";如果我们需要改变背景,画刷,光标等等时候。
我们可以在:PreCreateWindow中创建窗口类,WNDCLASS wndClass;把这个类里的值改变成自己想要的内容就可以了。
E.G.wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;wndClass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);wndClass.hCursor = LoadCursor(NULL, IDC_WAIT);wndClass.hIcon = LoadIcon(NULL, IDI_WARNING);wndClass.hInstance = AfxGetInstanceHandle();获取应用程序的实例句柄可用AfxGetInstanceHandle函数,这个函数是一个全局的函数,前面有一个AFX表示是一个应用程序框架类函数,哪里都可用。
C技巧:VC中对话框上显示信息的方法
VC实现对话框上信息的显⽰ 利⽤ VC的AppWizard,可以很容易地实现⼯具条和菜单项的ToolTip,或在状态条上显⽰帮助信息,但要在对话框的控件上显⽰ToolTip和在状态条上显⽰控件信息并不容易实现。
现在,我们⽤VC中的WM_SETCURSOR 与TTN_NEEDTEXT消息就可达到⽬的。
具体操作如下: ⼀、利⽤ VC的 MFC AppWizard ⽣成⼀个 SDI 或 MDI 的应⽤程序 ⼆、编辑对话框控件的字符串资源 例如:IDC_dbBUTTON1 = “This is 肖天鹏的第⼀⾃制按钮天鹏\", 其中字符串“This is肖天鹏的第⼀⾃制按钮“将在⿏标移到控件上时显⽰在状态条上,字符串“天鹏\"将作为 ToolTip 显⽰。
三、建⽴消息映射 在对话框的头⽂件 (*.H) 中 加⼊以下代码: protected: void SetStatusText(UINT nID=0); //{{AFX_MSG(CFileOp1) afx_msg void OnDestroy(); afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); //}}AFX_MSG afx_msg BOOL OnTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult ); DECLARE_MESSAGE_MAP() 在对话框的实现⽂件 (*.CPP) 中加⼊以下代码: BEGIN_MESSAGE_MAP(CFileOp1, CDialog) //{{AFX_MSG_MAP(CFileOp1) ON_WM_DESTROY() ON_WM_SETCURSOR() //}}AFX_MSG_MAP ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnTipNotvify) END_MESSAGE_MAP() 四、编辑消息处理函数 BOOL CFileOp1::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {// TODO: Add your message handler code here and/or call default if(pWnd==this) SetStatusText(); else {TOOLTIPTEXT m_psttt; m_psttt.hdr.hwndFrom=m_hWnd; m_psttt.hdr.idFrom=pWnd->GetDlgCtrlID(); m_psttt.hdr.code=TTN_NEEDTEXT; m_psttt.uFlags= TTF_IDISHWND; SetStatusText(pWnd->GetDlgCtrlID()); this->SendMessage(WM_NOTIFY,m_psttt.hdr.idFrom,(LPARAM)&m_psttt); } return CDialog::OnSetCursor(pWnd, nHitTest, message);} void CFileOp1::OnDestroy() {SetStatusText(); CDialog::OnDestroy();} void CFileOp1::SetStatusText(UINT nID) {if(nID==0) nID=AFX_IDS_IDLEMESSAGE; CWnd *pWnd=AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR); if(pWnd) {AfxGetMainWnd()->SendMessage(WM_SETMESS AGESTRING ,nID); pWnd->SendMessage(WM_IDLEUPDATECMDUI); pWnd->UpdateWindow();}} BOOL CFileOp1::OnTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult ) { TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; UINT nID =pNMHDR->idFrom; if (pTTT->uFlags & TTF_IDISHWND) { nID = ::GetDlgCtrlID((HWND)nID); if (nID) { TCHAR szFullText[256]; CString StrTipText; AfxLoadString(nID,szFullText); AfxExtractSubString(StrTipText,szFullText,1,′′); if(!StrTipText.IsEmpty()) strcpy(pTTT->lpszText,StrTipText); pTTT->hinst = AfxGetResourceHandle(); return(TRUE); } } return(FALSE);} 五、将该对话框作为⼀个 SDI 或 MDI应⽤程序的主框架的⼦窗⼝,⽣成这样⼀个对话框后,当你把⿏标移到某个控件 (必须有相应的字符串资源 )上时,就会出现该控件的 ToolTip和状态条信息。
VC++ 改变控件字体大小颜色的方法
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
//change the color of dialog
if(nCtlColor==CTLCOLOR_DLG)
很多人都觉得自己的程序的界面不那么美观,往往VC默认产生的对话框比较单调,因此很多人往往找到很多其它的控件对对话框进行美化修饰,例如给静态控件设置字体,设置背景颜色等等,其实这些完全可以由VC自己的WM_CTLCOLOR消息来完成!
WM_CTLCOLOR消息,使你可以告诉Windows在画各种控件的背景时用什么刷子。在Windows要画控件的时候,它发送WM_CTLCOLOR给控件的父窗口。这是你改变控件背景的好机会。
CFont font;
font.CreatePointFont(100, _T("宋体"));//改变大小
m_wndEditBox.SetFont(&font);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////改变字体颜色////////////////////////////////////////////////////////////////
首先在自己需要设置界面的对话框上点击右键-->在右侧属性栏中加入WM_CTLCOLOR消息-->自动生成OnCtlColor
VC中自动改变控件位置和大小的对话框类
VC中自动改变控件位置和大小的对话框类在用VC开发应用程序时,经常会要做一些可以改变大小的对话框,而这个时候就要求对话框上的控件会随着对话框大小的改变而改变自己的位置和大小。
如果控件比较少,那可以在对话框的O nSize()事件里面添加代码,通过计算来调整各个控件的位置和大小;但是,如果对话框上的控件比较多的话,那这将是一件非常痛苦的事情!要是程序中又有很多可以改变大小的对话框,那一个一个的OnSize()写下来,那会使程序员崩溃的!为了解决这个问题,我写了一个自动改变控件位置和大小的对话框类ClxDialog。
从这个类继承的对话框类,只要在OnInitDialog()里对控件做一些简单的设置,对话框上的控件就会随着对话框大小的改变而改变自己的位置和大小(当然,别忘了把对话框的Border属性改为Resizing)。
为了保存控件信息,我定义了一个结构:typedef struct _dlgControlTag{int iId; // 控件IDint iFlag; // 标志,表示怎样改变控件的位置或者大小int iPercent; // 改变值占对话框改变值的百分比} DLGCTLINFO, *PDLGCTLINFO;这里要对结构中的iFlag和iPercent进行一些解释。
其中iFlag是下面的枚举值:enum{MOVEX = 0, // 控件在X方向(左右)移动MOVEY, // 控件在Y方向(上下)移动MOVEXY, // 控件在X方向和Y方向同时移动ELASTICX, // 控件在X方向(宽度)改变大小ELASTICY, // 控件在Y方向改(高度)改变大小ELASTICXY // 控件在X方向和Y方向同时改变大小};iPercent表示改变值占对话框改变值的百分比。
例如,一个控件的iPercent值为100,i Flag值为MOVEX,那么当对话框的宽度改变100个单位的时候,这个控件就在X方向移动100个单位;又如,一个控件的iPercent值为100,iFlag值为ELASTICXY,那么当对话框的宽度和高度分别改变100个单位的时候,控件的高度和宽度也相应的改变100个单位。
在VC++中定制CFileDialog
在VC++中定制CFileDialogMFC为我们提供了OFileDialog的简单易用,但毕竟“千篇一律,没有性格”,在实际应用中往往需要具有个性特色的用户界面和个性化的文件对话框。
要定制文件对话框,就必须获得对文件对话框中各个控件的控制。
本文将通过一个简单的例子介绍控制文件对话框中控件的方法。
把文件对话框的高度比一般情况扩大150个像素,并修改它的标题。
通过classwizard生成一个CFileDialog的派生类CCoolFileDialog,然后编辑CoolFileDialog.cpp中处理WM_INITDIALOG的OnInitDialog函数。
在indnde.CPP的开头必须加入#CoolFileDialog<dlgs.h>BOOL CoolFileDialog::OnInitDialog()//iExtraSize将按照你所要的确定对话框的最终尺寸const UINT iExtraSize=150;//要控制的文件对话框中的控件的个数const UINT nControls=8;//获得指向父对话框的指针CWnd*wndDlg=GetParent();//获得对话框的尺寸RECT Rect;wndDlg->GetWindowRect(&Rect);//修改对话框的尺寸wndDlg->GetWindowRect(&Rect);//修改对话框的尺寸wndDlg->SetWindowPos(NULL,0,0,Rect.right-Rect.left,Rect.bottom-Rect.top+iExtraSize,SWP_NOMOVE);//控件的ID在<dlgs.h>中定义UINT Controls[nControls]={stc3,stc2,//两个label控件edt1,cmb1,//edit控件和//drop-down box控件IDOK,IDCANCEL,chx1,//check按钮lst1//list控件};//获得对文件对话框中各个控件的控制,并把它们移到新的位置for (int i=0;i<nControls ; i++){CWnd *wndCtrl =wndDlg->GetDlgItem(Controls[i]); wndCtrl->GetWindowRect(&Rect);wndDlg->ScreenToClient(&Rect);//根据对话框的新的尺寸移动各控件。
编 辑 框
VC++程序设计基础
参数ch表示设定的口令字符。
(3)选择文本 。通过调用成员函数Cedit∷SetSel来实现。这个函数 确定了编辑框内文本的选择范围,与该函数相对应的还有 Cedit∷GetSel和Cedit∷ReplaceSel,它们分别用来获取编辑控件 中前一选择的开始和结束的位置以及替换被选择的文本。
(4)设置编辑框的页面边距。通过调用成员函数Cedit∷SetMargins 来实现,这个函数的原型如下:
操作过程:
(1)利用AppWizard建立MFC(exe)基于对话框的应用程序 框架,工程名为:编辑框应用举例。其它默认。
(2)对话框建立后删除默认的控件。如图给对话框添加控件, 控件的对象、ID、标题、连接的变量及类型如下表所示。
(3)修改编辑框IDC_EDIT1、IDC_EDIT2的特性,如下图所示。 (4)编辑消息处理函数。
VC++程序设计基础
编辑框
编辑控件(Edit)是一个让用户从键盘输入和编辑文本的 矩形窗口,用户可通过它,很方便地输入各种文本、数 字或者口令,也可使用它来编辑和修改简单的文本文件 内容。
1.编辑控件的属性和风格:如下图所示。
编辑控件的属性对话框中各项的含义 如下表所示。
2.编辑框的基本操作
(1)文本、数字的设置和读取。用户需要使用DDV和DDX 技术 。方法是使用ClassWizard的Member Variables,在 Contro1 IDs列表中,双击所要关联的控件ID,即可弹出 Add Member Variable对话框。在Control IDs列表中出现 刚才添加的内容,而在对话框的下方则要求用户输入变量 的范围,如下图所示。
void SetMargins(UINT nleft,UINT nRight); 参数nLeft和nRight分别用来指定左、右边距的像素宽度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【作者按】本文主要针对初学者在使用对话框赋值时的一些问题而写。
如果你对对话框的使用已经很熟练,请跳过本文。
【针对现象】许多初学者,常常写出这样的程序来修改对话框中某个按钮的标题:
其中m_Btn的定义为CButton m_Btn;
这段程序运行后会报错,debug一下,错误会指向一个断言语句
ASSERT(::IsWindow(m_hWnd));报告窗口指针为空。
看一下m_hWnd,等于0x00000000.其实就是m_Btn这个CButton对象的句柄为空。
【原因分析】出现这种错误的原因,显然是m_Btn这个窗口对象还没有创建造成的。
我们看一下CMyDialog dlg这个构造函数,看一看MSDN对CDialog构造函数的说明。
其实它只是简单的创建了一个对话框实例。
这里我这样理解,就是对话框是一个容器,而对话框上的各个控件是容器中包含的对象。
对话框的构造函数只是构造了一个容器,而并没有创建容器中的各个对象。
我想这里大家就应该明白为什么m_Btn的句柄为空了。
那对话框中的控件在什么时候被创建的呢?我个人没有仔细的研究过,但从个人使用的经验看,应该在DoModal函数和对话框的Create函数中创建的。
因为使用一个模式对话框时,m_Btn.SetWindowText("MyButton")语句在OnInitDialog函数中执行没有问题。
所以应该在DoModal中创建的。
至于DoModal中是如何创建的,欢迎各位高手给与讲解。
而对于非模式对话框,以下的程序运行没有问题:
可见控件的创建应该在Create函数中。
[解决办法]那么,如果非要实现这样的功能怎么办呢?笔者的解决办法是在对话框类中增加成员变量,比如m_sBtnTitle。
数据的传递有以下三种方法:
1。
增加Set函数,比如SetBtnTitle(CString str);
调用程序如下:
2。
将m_sBtnTitle定义成公有类型。
那么dlg.m_sBtnTitle = "MyButton";就可以了。
3。
修改或者重载一个新的构造函数,比如:
最后,在对话框类的初始化函数增加m_Btn.SetWindowText(m_sBtnTitle);即可。
还有一些网友提供的方法是定义全局变量。
当然,首先肯定全局变量是可以完成此功能的。
不过笔者并不赞同用全局变量的方法。
对于面向对象的编程和设计来说,全局变量应该尽量少使用,因为全局变量将增加模块之间的耦合度,与面向对象的思想是有违背的。
正如goto 语句,好用但尽量少用。
在这里笔者并不是反对用全局变量,而是要看情况而用。
笔者曾经开发过一个日本项目,粗略计算一下,全局变量不下于1000个,这样的程序的维护难度可想而知。
希望此文能够帮助初学者在VC之路上少走一些歪路,尽快融入VC开发大军。