colevariant

时间:2024-06-17 08:09:00编辑:揭秘君

MFC在自己定义的头文件中如何引用对话框自己生成的头文件?对话框引用对话框的头文件就不错

这个一点都不扯。。。
系统自己生成的,同样需要声明的支持,只不过,在MFC框架里面,这些支持是给你写好的。
比如那个ID,是在resource.h中定义的。
一般来说,在自定义头文件中使用对话框类,比较合理和安全的办法,就是将对话框类cpp文件首部全部的包含include,按照原有顺序全部复制过来,放在自定义的CPP文件首部,并且在包含自定义头文件之前。(注意,是放在CPP文件,而不是.H文件),并且,在每个使用自定义头文件的地方,都使用这个包含顺序。
这样的好处,就是不会产生重复包含和相互包含的问题。当然也可以写在.H文件中,同样要保证,在包含对话框.H之前有其它必要的包含文件。


COleVariant是什么数据类型

用于ole自动化的VARRANT类型,可以用于存储多种格式





COleVariant 类通逢装了 VARIANT 结构。实际的数据就在 VARIANT 结构中。

VARIANT 结构包含两部分。其一是 VARTYPE 型的成员变量vt;其二是个联合类型,这个联合包含了VC常用的几乎所有类型。因为联合用的是相同的存储空间,因此对联合的内容的解释依赖于 vt。
例如,
若 vt 的值是 VT_UI2, 说明该联合被解释为short int. 并使用成员变量名 iVal。
若 vt 的的值是 VT_BSTR,说明该联合被解释为 BSTR 类型。并使用成员变量名 bstrVal。
若 vt 的的值是 VT_BSTR|VT_BYREF,说明该联合被解释为BSTR 型指针。并使用成员变量名 pbstrVal

Example:
------------------
VARIANT va;
:: VariantInit(&va); // 初始化
int a = 2002;
va.vt = VT_I4; // 指明long数据类型
va.lVal = a; // 赋值
--------------------------------
  为了方便处理VARIANT类型的变量,Windows还提供了这样一些非常有用的函数:

  VariantInit —— 将变量初始化为VT_EMPTY;

  VariantClear —— 消除并初始化VARIANT;

  VariantChangeType —— 改变VARIANT的类型;

  VariantCopy —— 释放与目标VARIANT相连的内存并复制源VARIANT。


51单片机串口通信c语言编程

#include
#define uchar unsigned char
#define uint unsigned int


sbit ring=P3^7;
sbit CASE1=P2^0;
sbit CASE2=P2^1;
sbit CASE3=P2^2;
sbit CASE4=P2^3;


uchar se=0,re=0;
uchar temp=0;


void wait(uint cnt)
{
while(--cnt);
}


//串口发送程序
void send(uchar se)
{
SBUF=se; //发送数据
while(TI == 0);
TI = 0;
}
//串口接收程序
uchar receive(void)
{
re=SBUF; //接收数据
while(RI==0);
RI=0;
return re;
}
//串口初始化
void sinti(void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xFD;
TR1 = 1;
EA = 1;
ES = 1;
}
void delay(int cnt)
{
while(--cnt);
}



//主程序
int main (void)
{
int i;
sinti(); //串口初始化程序
ring=1;
while(1)
{
while (1)
{
if(CASE1==0)
{
send('a');
ring=0;
break;
}
if(CASE2==0)
{
send('b');
ring=0;
break;
}
if(CASE3==0)
{
send('c');
ring=0;
break;
}
if(CASE4==0)
{
send('d');
ring=0;
break;
}
}
if(ring==0)
{
wait(60000);
ring=1;
}
for(i=0;i<10000;i++);
}
}
//串口中断程序
void UART_SER (void) interrupt 4 //串行中断服务程序
{


if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
temp=SBUF;
}
if(TI) //如果是发送标志位,清零
TI=0;
}


如何使用MScomm控件

1:添加MSComm控件

2:为对话框添加MSComm控件成员变量
右击MSComm控件,然后选择Add Variable...

3:为对话框添加OnComm事件
右击MSComm控件,然后选择Add Event Handle..

4:打开/关闭串口.

void Ctbox_debug_viewDlg::OnBnClickedBtOpen()
{
// TODO: Add your control notification handler code here

if(m_mscomm.get_PortOpen())
{
m_mscomm.put_PortOpen(FALSE);
GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("打开"));
ShowInfo(_T("关闭串口成功!"));
m_OpenStatus =false;
return;
}
UpdateData(TRUE);
m_OpenStatus =true;
//当前端口号
m_mscomm.put_CommPort(m_Port+1);//端口号
m_mscomm.put_InBufferSize(1024);//接收缓冲区
m_mscomm.put_OutBufferSize(1024);//发送缓冲区

m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_mscomm.put_InputMode(1);//以二进制方式读写数据
m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件



//波特率
DWORD baudrate;
switch(m_CombolBaudrate.GetCurSel())
{
case 0:
baudrate =115200;
break;
case 1:
baudrate =9600;
break;
default:
ASSERT(FALSE);
break;
}
CString setting;
setting.Format(_T("%d,n,8,1"),baudrate);
m_mscomm.put_Settings(setting/*_T("115200,n,8,1")*/);//波特率,无校验,8个数据位,1个停止1位

m_mscomm.put_PortOpen(TRUE);//打开串口
GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("关闭"));
ShowInfo(_T("打开串口成功!"));

}
5:接收串口数据

void Ctbox_debug_viewDlg::OnCommMscomm1()
{
// TODO: Add your message handler code here
short curEvent =m_mscomm.get_CommEvent();
switch(curEvent)
{
case CMscomm1::comEvReceive:
EvReceiveHandle();
break;
}

}

void Ctbox_debug_viewDlg::EvReceiveHandle(void)
{
static unsigned int cnt=0;
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
/*unsigned intdata[1024]={0};*/
BYTE rxdata[1024];//设置BYTE数组
CString strtemp;

cnt++;
variant_inp= m_mscomm.get_Input();//读取缓冲区
safearray_inp= variant_inp;//变量转换
len= safearray_inp.GetOneDimSize();//得到有效的数据长度

for (k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);
}
/*char c_char; */
for (k=0;k<len;k++)
{
strtemp.Format(_T("%c"),*(rxdata+k));
m_RecveString +=strtemp;
if(*(rxdata+k) =='\n')
{
ShowInfoByFilter(m_RecveString);
m_RecveString ="";
}
}
}

6:发送串口数据

void Ctbox_debug_viewDlg::OnBnClickedBtSend()
{
// TODO: Add your control notification handler code here
if(m_OpenStatus ==false)
{
AfxMessageBox(_T("请先打开串口"));
return;
}
UpdateData(TRUE);
if(m_SendString.IsEmpty())
return;
if(m_AutoAddLF)
{
m_SendString +="\r\n";
}
m_mscomm.put_Output(COleVariant(m_SendString));
ShowInfo(m_SendString);
}


要完成类似word的查找替换功能,编写了如下c++程序,求高手帮忙调试

#include
#include

using namespace std;

int searchString(char *src, char *dst, int *locationIndex)
{
int DstLength = strlen(dst);
int i=0,j,findResultCount=0;
char *ptrSrc, *ptrDst;

ptrSrc= src;

memset(locationIndex,-1,sizeof(int)*200);
while(src[i] != '\0')
{
ptrDst= dst;
for(j=0;j<DstLength;j++)
{
if(ptrSrc[i+j] == ptrDst[j])
continue;
else
break;
}
if(j == DstLength)
{
locationIndex[findResultCount] = i;
findResultCount++;
}

i++;
}

return findResultCount;
}

int replaceString(char *src, char *searChar, char *repChar, int *locationIndex, int findResultCount)
{
int i,m;
int index;
int searchLenth= strlen(searChar);
int replaceLenth = strlen(repChar);
int srcLenth= strlen(src);

for(i=findResultCount-1; i>=0; i--)
{
index= locationIndex[i];
if(searchLenth > replaceLenth)
{
int offset = searchLenth-replaceLenth;
for(m=index+searchLenth;m<srcLenth+1;m++)
src[m-offset]= src[m];

memcpy(&src[index],repChar,sizeof(char)*replaceLenth);
}
else if(searchLenth < replaceLenth)
{
int offset = replaceLenth -searchLenth;
for(m=srcLenth+1;m>=index+searchLenth;m--)
src[m+offset]= src[m];

memcpy(&src[index],repChar,sizeof(char)*replaceLenth);
}
else
memcpy(&src[index],repChar,sizeof(char)*replaceLenth);
}

return 1;
}

int main ()
{
char a[200],b[200],d[200];
int location[200];
int i,j,count;
cout<<"请输入原始字符"<<endl;
cin.getline(a,200);
for(i=0;;i++)
if(a[i]=='\0')
break;
cout<<"请输入要查找的字符串"<<endl;
cin>>b;
cout<<"请输入要替换的字符串"<<endl;
cin>>d;

count = searchString(a, b, location);
if(count < 1)
{
printf("没找到相应的字符串\n");
return 0;
}
replaceString(a, b, d, location, count);

cout<<"替换后的字符串为"<<endl;
cout<<a;

return 0;
}


我这里写了一些代码
可以输入任意长度的查找字符串,先其找到源字符串的多个位置(源字符串中包含多个查找字符串)
然后对找到的位置进行相应的替换,替换中考虑3中情况,
查找字符串长度>替换字符串长度: 该情况需要缩短字符串
查找字符串长度<替换字符串长度: 该情况需要增长字符串
相等: 直接替换

我做了一些简单测试,通过了,你再试试看吧


c++如何读取word

首先建立一个win32控制台程序,注意如图要选择支持MFC选项。然后选择视图->类向导,点击Add Class;选择Import from Type Library;将Office安装目录下的MSWORD.OLB打开,会出现如下对话框:将_Application,Documents,_Document,Range四个类导入。在主函数的else语句中添加如下代码即可实现。_Application wordApp; //在对象继承结构中是最顶层的对象,可以通过它的方法访问别的工作类型的对象(本例主要是word)Documents docs; //代表所有打开的文档对象_Document doc;Range aRange;COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);wordApp.CreateDispatch("Word.Application",NULL);wordApp.SetVisible(FALSE);docs=wordApp.GetDocuments();doc=docs.Open(COleVariant(filename...),vFalse,vTrue,vFalse,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt);aRange=doc.Range(vOpt,vOpt);string str(aRange.GetText());cout<<str<<endl;doc.Close(vOpt,vOpt,vOpt);wordApp.Quit(vOpt,vOpt,vOpt);CoUninitialize(); //关闭COM对象库,释放资源

MFC读写EXCEL时,如何获取当前行号,列号,如何向指定的单元格写数据?

//通过OLE实现,获取当前活动单元格行号与列号
Range range=objApp.GetActiveCell();//objApp 为_Application类对象
long RowNum=range.GetRow();//获取行号
long ColNum=range.GetColumn();//获取列号
range.SetValue2(COleVariant("HELLO EXCEL!"));//向当前活动单元格写入HELLO EXCEL!


COleVariant 具体如何用,有什么功能?

  COleVariant类是对VARIANT结构的封装。
  VARIANT 结构包含两部分。其一是 VARTYPE 型的成员变量vt;其二是个联合类型,这个联合包含了VC常用的几乎所有类型。因为联合用的是相同的存储空间,因此对联合的内容的解释依赖于 vt。
  例如,
  若 vt 的值是 VT_UI2, 说明该联合被解释为short int. 并使用成员变量名 iVal。
  若 vt 的的值是 VT_BSTR,说明该联合被解释为 BSTR 类型。并使用成员变量名 bstrVal。
  若 vt 的的值是 VT_BSTR|VT_BYREF,说明该联合被解释为BSTR 型指针。并使用成员变量名 pbstrVal。
  它的构造函数具有极为强大的功能,当对象构造时首先调用VariantInit进行 初始化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy进行转换赋值操作,当VARIANT对象不在有效范围时,它的析构函 数就会被自动调用,由于析构函数调用了VariantClear,因而相应的内存就会被自动清除。除此之外,COleVariant的赋值操作符在与 VARIANT类型转换中为我们提供极大的方便。


ColeVariant需要引用那个头文件?mfc问题

ColeVariant需要引用 #include 细节如下:COleVariant类是对VARIANT结构的封装。VARIANT 结构包含两部分。其一是 VARTYPE 型的成员变量vt;其二是个联合类型,这个联合包含了VC常用的几乎所有类型。因为联合用的是相同的存储空间,因此对联合的内容的解释依赖于 vt。COleVariant 本质上是一个枚举,用同一种类型来表达不同的子类型。如同boost中的variant。 

各位高人。如何在autocad里面读取excel数据,然后在cad里面自动绘制股票k线。可以给一定报酬

使用truetable是一款基于CAD平台的插件,它能够在CAD和Excel、WPS之间相互导入表格,能输出更新CAD中的任意表格,同时附带钢结构助手,轻轻松松统计用钢量。truetable11.0破解说明介绍:1. 解压缩2. 首先要确定电脑中己安装好autocad3. 再双击文件“Install.exe”进行安装4. 然后将文件夹“TrueTable 11.0I(AutoCAD)”中所有内容复制到truetable安装目录下替换5. 再双击文件“truetable 11.0.reg”,导入注册表OK!truetable11.0产品特点:1. 将CAD中的表格或文本输出到Excel2. 将CAD中的表格或文本输出到文本文件(TXT)或CSV文件3. 直接输出CAD中的任意表格,即使这些表格是复杂实体4. 将Excel表格导入CAD5. 将文本文件(TXT)或CSV文件导入CAD6. 同时将多个CAD表格输出到Excel文件7. 可以精确定义CAD表格尺寸,包括文字高度、文字宽度系数、行高、列宽8. 可以设置表格外框,网格,文本的颜色9. 按Excel表格或Excel文件更新CAD表格10. 如果输入的表格太长,自动将表格分片,并能设置表头,表尾11. 支持文本水平、垂直排列,共9种对齐方式12. 支持自动换行,上、下标,文本旋转,竖直文本,多行文本13. 具有文本自动替换功能,能使CAD中的特殊符号在Excel中正确显示,如将"%%c"替换为"Φ"% 14. 支持Excel的隐藏行、列15. 支持表格倒置,即输出、输入表格时颠倒表格顺序16. 5种表格插入方式: 表格四个角点以及指定窗口17. 对CAD中的文本进行统计18. 批量输出MST,SFCAD,TWCAD材料表19. 材料表自动计算,钢结构用钢量统计可以把数据导入Excel,在Excel里面做k线图才好处理


上一篇:落落和夏河

下一篇:07-ghost