vc对话框控件id冲突问题
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++ 课件 第05章 对话框和常用控件

5.2控件的创建和使用方法
5.2.1控件的创建方法 控件的创建方式有以下两种: 一种是在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指 定为对话框,这样做的好处是明显的,因为当应用程序启动该对话框时, Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清 除。 另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的Create 函数来创建。 [例Ex_SDIHello] 在上例Ex_SDIHello的基础上用子窗口方式创建控件。 (1)打开CMyDlg的头文件MyDlg.h,添加一个按钮类CButton指针变量: class CMyDlg : public CDialog { // Construction public: CMyDlg(CWnd* pParent = NULL); // standard constructor CButton *m_btnWnd; … }
5.1对话框的使用
在程序中使用对话框 (1)利用项目工作区的ClassView标签项,将Ex_SDIHello.cpp源文件打开; (2)在Ex_SDIHello.cpp源文件的前面加上包含类CMyDlg的头文件: #include "MyDlg.h" (3)在InitInstance函数体中的“return TRUE;”语句之前添加下列代码: CMyDlg dlg; dlg.DoModal(); DoModal是模态对话框最常用的函数,它负责对话框的显示和终止。 (4)编译并运行。在程序的一开始就出现用户自己设计的对话框,单击 [Button1]按钮将弹出“欢迎进入对话框的设计!”的消息对话框来。
5.1对话框的使用
5.1.2使用对话框编辑器
打开对话框编辑器
将项目工作区窗口切换到ResourceView页面,双击Dialog目录下任意一个对 话框ID。或者,选择“Insert”“Resource”菜单命令(或按快捷键Ctrl+R), 选择Dialog项,单击New。
vc6中radio button

VC6.0 控件Radio Button的使用使用方法:1.建立一个基于对话框的用用程序,在其中加入三个Radio Button,ID分别为:IDC_RADIO1,IDC_RADIO2,IDC_RADIO32.控件的初始化:在对话框类的OnInitDialog中加入代码:CheckRadioButton(IDC_RADIO1, //第一个参数为该组的第一个单选按钮的IDIDC_RADIO3, //第二个参数为该组的最后一个单选按钮的IDIDC_RADIO3); //第三个参数为该组中被选中的单选按钮的ID3.在加入一个Button控件,并为其写入Click事件代码:int iRadioButton;iRadioButton=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3);if(iRadioButton==IDC_RADIO1)MessageBox("Click Button1");if(iRadioButton==IDC_RADIO2)MessageBox("Click Button2");if(iRadioButton==IDC_RADIO3)MessageBox("Click Button3");/Files/Lee7/RadioButtonDemo.rar另一个方法:Radio Button成组使用时,只需保证在添加控件时资源号连续,并且第一个Radio Button的属性中Group被选中即可.这样就可以给这一组控件添加成员变量使用例:1.建立一个基于对话框的应用程序,添加三个Radio Button,和一个Button选中第一个Radio Button属性中的Group 。
然后给raido1关联一个int型变量(同样需要先分组)m_nRadio1,打开对话框构造函数,你会发现有:m_nRadio1 = -1;m_nRadio1别赋值-1表示哪个都没有选上。
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控件随窗口大小变化而变化的方法

注意:IDR_MENU1是菜单ID,ID_CONTROL_MUTE是需要被打勾的子菜单,加粗部分为核心部分一在对话框头文件中POINT Old;//存放对话框的宽和高。
在方法OnInitDialog 中加入//计录宽和高。
CRect rect;GetClientRect(&rect); //取客户区大小Old.x=rect.right-rect.left;Old.y=rect.bottom-rect.top;二添加WM_SIZE消息:if(nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED) //窗体大小发生变动。
处理函数resize{resize();}三添加reseze函数void CDialogDlg::resize(){float fsp[2]; //用于分别记录窗口发生变化的长宽新旧比POINT Newp; //获取现在对话框的大小CRect recta;GetClientRect(&recta); //取客户区大小Newp.x=recta.right-recta.left;Newp.y=recta.bottom-recta.top;fsp[0]=(float)Newp.x/Old.x; //计算长度的新旧比fsp[1]=(float)Newp.y/Old.y;//计算高度的新旧比CRect Rect;int woc;CPoint OldTLPoint,TLPoint; //左上角CPoint OldBRPoint,BRPoint; //右下角HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD); //取得第一个控件的句柄,用于遍历所有控件while(hwndChild){woc=::GetDlgCtrlID(hwndChild);//取得IDGetDlgItem(woc)->GetWindowRect(Rect); //获得相对于屏幕左上角的坐标ScreenToClient(Rect);//将屏幕坐标转换成相对客户窗口左上角的坐标OldTLPoint = Rect.TopLeft();TLPoint.x = long(OldTLPoint.x*fsp[0]); //用比例得出左上角的x坐标TLPoint.y = long(OldTLPoint.y*fsp[1]); //用比例得出左上角的y坐标OldBRPoint = Rect.BottomRight();BRPoint.x = long(OldBRPoint.x *fsp[0]); //用比例得出右下角的x坐标BRPoint.y = long(OldBRPoint.y *fsp[1]); //用比例得出右下角的y坐标Rect.SetRect(TLPoint,BRPoint); //设置最新的RectGetDlgItem(woc)->MoveWindow(Rect,TRUE);hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT); //获得下一个控件的句柄 }Old=Newp;}。
MFC关于.rc文件.rc2文件

MFC关于.rc⽂件.rc2⽂件.rc⽂件和.rc2⽂件c和rc2都是资源⽂件,包含了应⽤程序中⽤到的所有的资源。
两者不同在于:rc⽂件中的资源可以直接在VC集成环境中以可视化的⽅法进⾏编辑和修改;⽽rc2中的资源不能在VC的集成环境下直接进⾏编辑和修改, ⽽是由根据需要⼿⼯地进⾏编辑。
(// xxx.RC2 - Microsoft Visual C++ 不会直接编辑的资源)RC2⽂件:包含项⽬使⽤的附加资源的脚本⽂件。
可以在项⽬的 .rc ⽂件的顶部包括 .rc2 ⽂件。
.rc2 ⽂件⽤于存放由多个不同项⽬使⽤的资源。
不必为不同的项⽬多次创建相同的资源,⽽是可以将它们放在⼀个 .rc2 ⽂件中,然后将该.rc2 ⽂件包括在主 .rc ⽂件中。
.rc2 扩展资源⽂件,当调⽤到其它project的资源的时候就会产⽣,⽤到资源的时候,⽐如说⼀个图⽚等等……---------------------MFC中的.rc⽂件.统⼀资源管理:在win32编程中,为⽅便项⽬中的资源统⼀管理,提供了⼀个格式统⼀的资源⽂件,对各种资源进⾏管理。
它的扩展名是.rc,在程序编译时它会被资源编译器编译⽣成⼀个.res的⼆进制⽂件。
rc⽂件的语法:1.注释:注释⽅式和 C 语⾔相通,单⾏注释⽤ // 符号,多⾏注释⽤ /* ... */ 符号。
2.预处理命令:预处理指令包括⼀些头⽂件的引⽤(使⽤ #include ,也同 C 语⾔)。
3.编译指令:预定义(#define,常量和宏,不⽀持带参数的宏) 和条件编译(#if, #ifdef, #undef, #ifndef, #else, #elif, #endif 等)。
4.资源定义声明:资源定义的声明中包括“资源”(Resources),"控件"(Controls) 和 “声明”(Statements) 3 类。
资源定义声明:1.资源(Resources):“资源”具有资源 ID,在程序中可以使⽤ FindResource ,LoadResource,LoadMenu 等资源相关 API 来操作。
VC使用ActiveX控件常见问题
VC使用ActiveX控件常见问题一方面,它表示将你联系到Microsoft、Internet和业界的新技术的小型快速的可重用组件。
它与开发语言无关,任何支持 ActiveX控件的软件开发平台(如VB、VC++、Access、VFP、Delphi、PowerBuilder 等)上,都可以使用ActiveX控件,程序员可以像使用Windows标准控件一样使用不同厂商开发的ActiveX 控件。
这样就实现了软件开发的工业化,大大地提高了软件的生产效率。
另一方面,它代表Internet与应用程序的一种集成策略。
用户可以从Internet上下载ActiveX 控件,也可以通过网络在本地机上调用远程机上的ActiveX控件,还可以将ActiveX控件加入到Internet 主页上。
既然ActiveX控件对程序员是如此地重要,那么如何用好ActiveX控件也就成为软件开发者所关心的问题。
本文以VC++5.0为开发工具,以一个项目名为Test的应用程序为例,就笔者在控件使用中遇到的一些问题加以讨论。
要想在应用程序中使用ActiveX控件,必须使你的应用程序成为ActiveX控件包容器。
ActiveX 控件包容器就是完全支持ActiveX控件,并能把控件组合进自己的窗口或对话框的父应用程序。
利用MFC的AppWizard,你可以很方便地创建你的包容器程序。
事实上,在用AppWizard创建新的应用程序时,你的应用程序就被缺省设置为控件包容器,即在第3步选中支持ActiveX Controls的复选框。
如果你在创建过程中没有选择这项技术支持,以后也可以手动地加入这项支持。
步骤如下:1. 在项目的应用类的.cpp文件(本例中为test.cpp)的Initinstance函数中加入对函数AfxEnableControlContainer()的调用,如下所示:BOOL CTestApp::InitInstance(){AfxEnableControlContainer();...}--在使用一个已注册的ActiveX控件之前,必须先用组件廊将该控件添加到应用程序中,步骤如下:1.从Project菜单选择Add To Project下的Components and Controls。
在VS(VC)2010中使用MSComm控件实现串口通信的详细步骤
// TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? }
void CCommTestDlg::OnBnClickedButtonOpen() { // TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? }
10. 添加关闭串口按钮的消息响应函数 void CCommTestDlg::OnBnClickedButtonClose() { // TODO: 在此添加控件通知处理程序代码 m_mscomm.put_PortOpen(FALSE);//关闭串口 AfxMessageBox(_T("串口 1 已关闭")); } 11. 添加发送按钮消息响应函数 void CCommTestDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); //读取编辑框内容 m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据 m_EditSend.Empty(); //发送后清空输入框 UpdateData(false); //更新编辑框内容 } 12. 接收数据 void CCommTestDlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码 static unsigned int cnt=0; VARIANT variant_inp; COleSafeArray safearray_inp; long len,k; unsigned int data[1024]={0}; byte rxdata[1024]; //设置 BYTE 数组 CString strtemp; if(m_mscomm.get_CommEvent()==2) //值为 2 表示接收缓冲区内有字符 {
Windows系统有此缺陷:没设ID的,就是1001?+Windows编程如何解决
Windows系统有此缺陷:没设ID的,就是1001?+Windows编程如何解决我的《⾯向对象程序设计》课,编写了⼀个记事本程序。
但有这样⼀个问题:单击运⾏后,弹出运⾏窗体:之后再单击“取消”按钮。
回到主窗体,再对主窗体的主编辑控件做操作时,即会报错:这个错误说明主窗体的主编辑控件(1001)已经不存在了!可是,它是存在的呀?最后找到问题是这样的:这个问题稍微复杂⼀点,我先说⼀下,要有两个条件:(1)你打开的窗体中,必须有组合框(就是还可以试验,你的运⾏窗体中,如果没有组合框,也不会有问题,你课试试)(2)你的主窗体的主编辑控件的ID,必须是1001我们说每个元素都是“窗⼝”,不⽌是四四⽅⽅的主窗体叫窗⼝,每个控件也叫窗⼝,这个⼤家还记得吧组合框在这个问题上更为明显!组合框是窗⼝,没有问题,然⽽组合框之所以叫组合,它是由⼀个⽂本框和⼀个下拉列表框组成的,其中那个下拉列表⼜是⼀个窗⼝。
也就是组合框这⼀个控件都不是⼀个窗⼝,它⾥⾯还含⼀个窗⼝!这样的逻辑关系:- 组合框控件 —— ⼀个窗⼝ - ⾥⾯含的下拉列表框 —— ⼜⼀个窗⼝,是它的⼦窗⼝这⾥还有⼀个问题,也可以说是windows系统的缺陷,在windows系统中,如果⼀个窗⼝不是我们程序⾃⼰通过资源创建的,那么也就没有资源ID才对。
但是,windows系统还⼀定要给他⼀个资源ID!这个ID还恰好是1001!也就是说,⼀个控件如果是我们⾃⼰建的,那么ID该是⼏还是⼏;如果不是我们⾃⼰建的,它也有⼀个ID,就是1001!这是⽤下⾯这个软件Spy++(在VC6安装包安装后,就有这样⼀个⼩⼯具),查看所有系统中的窗⼝,发现的:可见上图,你的组合框中的下⾯的“下拉列表框”,这个控件是它⾥⾯含的对吧,这个控件的窗⼝本来应该没有资源ID的,但是windows却也给它⼀个ID,还恰好是1001!更可⽓的是下⾯,你的“运⾏”对话框有两个组合框对吧,第2个组合框也是这样:就是本来应该没有ID的、windows系统它不知道的窗⼝,就⼀律认为ID是1001!这样⼀来,在卸载查找替换窗体,或卸载运⾏窗体时,那个1001的控件也被卸载了。
Android库项目中的资源ID冲突的解决方法
Android库项⽬中的资源ID冲突的解决⽅法1、前⾔Android Studio对模块化开发提供的⼀个很有⽤的功能就是可以在主项⽬下新建库项⽬(Module),但是在使⽤库项⽬时却有⼀个问题就是资源ID冲突,因为编译时SDK会⾃动帮我们处理这个问题,所以⼀般我们不会察觉到,但是在某些情况下,我们需要意识到这个问题的存在。
⽐如,在新建的库项⽬中使⽤如下代码:public void onButtonClick(View view) {switch (view.getId()) {case R.id.button_1:break;case R.id.button_2;break;}}IDE会提⽰:Resource IDs cannot be used in a switch statement in Android library modules less.Validates using resource IDs in a switch statement in Android library module. Resource IDs are non final in thelibrary projects since SDK tools r14, means that the library code cannot treat these IDs as constants.再⽐如,我们在库项⽬中以如下⽅式使⽤ButterKnife,编译时就会报错。
@OnClick(R.id.button_1)public void onButtonClick(View view) {}2、分析⽆论是 switch 语句还是注解,都有⼀个要求就是使⽤的值必须是常量。
在主项⽬中, R类中的成员变量都被 static final 修饰,⽽在库项⽬中仅被 static 修饰。
// 库项⽬中⽣成的R类:public final class R {public static final class id {public static int button_1 = 0x7f0c0001;}}// 主项⽬中⽣成的R类:public final class R {public static final class id {public static final int text_1 = 2131165184;}}为什么库项⽬中⽣成的资源ID没有被 final 修饰呢?官⽅解释如下:当多个库项⽬进⾏合并时,不同项⽬中的资源ID可能会重复。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A control with this ID already exists
在MFC基于Dialog的程序中,修改控件ID时经常会出现这样的提示:
A control with this ID already exists.
比如想把退出按钮的ID修改为IDC_BTN_EXIT,但遇到了上面的提示。
刚开始我理解错了,我以为它的意思是IDC_BTN_EXIT这个标示符已经用过了,而我确实是在其它的对话框中使用了同样的ID,但不同对话框之间使用相同的IDC_BTN_EXIT应该没有问题呀?
但是打开resourse.h文件看了一下就明白了。
1 2 3 4 …
#define IDC_BTN_EXIT 1010
#define IDC_BTN_QUERY 1010
…
这些ID标识符就是一些数字的宏定义,而在A对话框中我的另一个按钮的ID是
IDC_BTN_QUERY,值是1010。
IDC_BTN_EXIT由于在B对话框中已经使用过了,所以它早已经被定义成1010了。
如果在A对话框中,也要使用IDC_BTN_EXIT,那么就与IDC_BTN_QUERY 冲突了,因为它们两个的值相同,这样对话框肯定无法区分这两个控件了。
所以如果想为了统一,A对话框的退出按钮,就想使用IDC_BTN_EXIT作为ID,不想换成别的,那就修改一下这些宏定义的值就OK了。
改的时候要注意一下resourse.h文件最下面的一些定义。
1 2 3 4 5 6 7 8 9 10 // Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 132 #define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_CONTROL_VALUE 1056 #define _APS_NEXT_SYMED_VALUE 105 #endif
#endif。