movewindow的move不对问题??求指导

shiter
领域专家: 人工智能技术领域
2014-08-10 09:10:01
matlab跟vc混合编程,vc调用matlab生成的dll,用matlab绘制了一个数学函数,plot生成了一个窗口,我想把它movewindow到我的mdi-mfc的picture控件中去,但是move 的有问题,求指导

还有就是窗口一般是这么找的么?




if( !myfunInitialize())
{
MessageBox(_T("初始化失败"));
}


fun();//这个函数就是matlab窗体生成的函数
// terminate MCR
mclTerminateApplication();
CString wnd_name = "Topo Image";


HWND hFig=::FindWindow(NULL,wnd_name);//wnd_name为matlab figure的名称,
//此处需循环多次才能得到句柄,不知为啥
while(hFig==NULL)
{
hFig=::FindWindow(NULL,wnd_name);
}
long IStyle=::GetWindowLong(hFig,GWL_STYLE); //获得figure的属性
::SetWindowLong(hFig,GWL_STYLE,IStyle&(~WS_CAPTION));//设置figure的属性,去掉标题栏

CRect figure_rect;
CWnd *myfigure=GetDlgItem(IDC_STATIC_MATLABWND);
myfigure->GetWindowRect(&figure_rect);
long fig_width=figure_rect.Width();
long fig_height=figure_rect.Height();
::SetParent(hFig,myfigure->GetSafeHwnd());//设置figure的父窗口
::SetWindowPos(hFig,NULL,0,0,fig_width,fig_height,SWP_NOZORDER|SWP_NOACTIVATE);//
::ShowWindow(hFig,SW_SHOW); //显示设置完后的figure
::SetForegroundWindow(this->m_hWnd);

...全文
305 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-08-20
  • 打赏
  • 举报
回复
建议楼主静下心来完整过一遍: MSDN98\SAMPLES\VC98\MFC\TUTORIAL\SCRIBBLE\STEP1~7\*.*
shiter 2014-08-15
  • 打赏
  • 举报
回复
引用 38 楼 schlafenhamster 的回复:
你还是再研究研究:3.对象的公共属性 对象常用的公共属性:Children属性、Parent属性、Tag属性、Type属性、UserData属性、Visible属性、ButtonDownFcn属性、CreateFcn属性、DeleteFcn属性。
\ 好,确实这个乱找代码乱改不是个头。。。
schlafenhamster 2014-08-15
  • 打赏
  • 举报
回复
你还是再研究研究:3.对象的公共属性 对象常用的公共属性:Children属性、Parent属性、Tag属性、Type属性、UserData属性、Visible属性、ButtonDownFcn属性、CreateFcn属性、DeleteFcn属性。
shiter 2014-08-14
  • 打赏
  • 举报
回复
引用 35 楼 schlafenhamster 的回复:
figure('Child',true, 'Parent',this, NumberTitle','off','menubar','none','toolbar','none','name','Topo Image'); 行不行?
高手,你这么写,matlab代码好像不对 我试了一下, figure('NumberTitle','off','menubar','none','toolbar','none','name','Topo Image'); x=0:pi/100:2*pi; y=2*exp(-0.5*x).*sin(2*pi*x); plot(x,y) 也能行。 那么可能就是下面这句代码起作用了: ::SetWindowLong(hFig,GWL_STYLE,IStyle & (~WS_CAPTION) & (~WS_THICKFRAME));//设置figure的属性,去掉标题栏
shiter 2014-08-14
  • 打赏
  • 举报
回复
引用 35 楼 schlafenhamster 的回复:
figure('Child',true, 'Parent',this, NumberTitle','off','menubar','none','toolbar','none','name','Topo Image'); 行不行?
我现在这样搞,但是有点瑕疵,可能是哪里坐标没搞对

void Cmdi_matlab_movewindow20140810View::OnMatlab()
{
	// TODO: 在此添加命令处理程序代码

	

	if( !myfunInitialize())
	{
		MessageBox(_T("初始化失败"));
	}


	fun();

	// terminate MCR
	mclTerminateApplication();
	CString wnd_name = "Topo Image";


	HWND hFig=::FindWindow(NULL,wnd_name);//wnd_name为matlab figure的名称,
	//此处需循环多次才能得到句柄,不知为啥
	while(hFig==NULL)
	{
		hFig=::FindWindow(NULL,wnd_name);

	}

	//::ShowWindow(hFig, SW_HIDE); 
	ModifyStyle(hFig,WS_POPUP,WS_CHILD,NULL); 

	

	long IStyle=::GetWindowLong(hFig,GWL_STYLE); //获得figure的属性
	
	//ModifyStyle(hFig,WS_POPUP,WS_CHILD,NULL); 

	//CWnd* pMainWnd =AfxGetMainWnd();
	//CRect client_rect;
	CRect figure_rect;
	CWnd *myfigure = GetDlgItem(IDC_STATIC_MATLABWND);

	myfigure->GetClientRect(&figure_rect);
	//pMainWnd->GetClientRect(&client_rect);

	long fig_width=figure_rect.Width();
	long fig_height=figure_rect.Height();

	//long client_width = client_rect.Width();
	//long client_height = client_rect.Height();

	::SetParent(hFig,myfigure->GetSafeHwnd());//设置figure的父窗口
	::SetWindowLong(hFig,GWL_STYLE,IStyle & (~WS_CAPTION) & (~WS_THICKFRAME));//设置figure的属性,去掉标题栏
	
	::SetWindowPos(hFig,NULL,0,0,fig_width,fig_height,SWP_NOZORDER|SWP_NOACTIVATE);//
	//::SetWindowPos(myfigure->GetSafeHwnd(),HWND_TOP,0,0,fig_width,fig_height,SWP_NOZORDER); 
	::ShowWindow(hFig,SW_SHOW);  //显示设置完后的figure
	::SetForegroundWindow(this->m_hWnd);



	//::UpdateWindow(hFig); //刷新
	//::UpdateWindow(myfigure->m_hWnd); //刷新

	//CWnd* pMainWnd =AfxGetMainWnd();

	//::UpdateWindow(pMainWnd->m_hWnd); //刷新


	
	
	

}



跟上面代码主要就是这个代码里面属性改了改: ::SetWindowLong(hFig,GWL_STYLE,IStyle & (~WS_CAPTION) & (~WS_THICKFRAME));// 完后matlab代码这样写,先隐藏一个figure完后,再显示: figure('NumberTitle','off','menubar','none','toolbar','none','name','Topo Image','Visible','off'); x=0:pi/100:2*pi; y=2*exp(-0.5*x).*sin(2*pi*x); plot(x,y) figure(1);
schlafenhamster 2014-08-14
  • 打赏
  • 举报
回复
figure('Child',true, 'Parent',this, NumberTitle','off','menubar','none','toolbar','none','name','Topo Image'); 行不行?
shiter 2014-08-13
  • 打赏
  • 举报
回复
引用 30 楼 lis2012 的回复:
最好不要使用STATIC控件,这个控件背景刷新存在问题,能不能尝试直接把matlab对话框创建到view中
哎,这个我到是没有考虑到,那这个代码怎么改改呢?
shiter 2014-08-13
  • 打赏
  • 举报
回复
引用 27 楼 schlafenhamster 的回复:
窗口的一些风格,创建后是不能改变的.
我现在还有点不明白,是不是头次不能移动窗口的原因就是,这个children风格没有设置好呢
lis2012 2014-08-13
  • 打赏
  • 举报
回复
最好不要使用STATIC控件,这个控件背景刷新存在问题,能不能尝试直接把matlab对话框创建到view中
shiter 2014-08-13
  • 打赏
  • 举报
回复
引用 27 楼 schlafenhamster 的回复:
窗口的一些风格,创建后是不能改变的.
那就是我得在matlab的代码里,把窗口的属性设置好? 设置成children属性的窗口么?
shiter 2014-08-13
  • 打赏
  • 举报
回复
引用 26 楼 xianglitian 的回复:
如果你点两次按钮操作的是同一个目标窗口 那把ModifyStyle(hFig,WS_POPUP,WS_CHILD,NULL); 放到SetParent(hFig,myfigure->GetSafeHwnd());后面试试
这样还是得再点一下,才能移动过去
shiter 2014-08-13
  • 打赏
  • 举报
回复
引用 33 楼 schlafenhamster 的回复:
"在matlab的代码里,把窗口的属性设置" 好试试,
我看了下,相关的文档,我觉的,figure这个窗口,好像没法直接设置成children这种属性的 那个children属性是figure窗口里面其他东西的。。。
schlafenhamster 2014-08-13
  • 打赏
  • 举报
回复
窗口的一些风格,创建后是不能改变的.
向立天 2014-08-13
  • 打赏
  • 举报
回复
如果你点两次按钮操作的是同一个目标窗口 那把ModifyStyle(hFig,WS_POPUP,WS_CHILD,NULL); 放到SetParent(hFig,myfigure->GetSafeHwnd());后面试试
schlafenhamster 2014-08-13
  • 打赏
  • 举报
回复
或者:2.属性的操作 set函数的调用格式为: set(句柄,属性名1,属性值1,属性名2,属性值2,…) 其中句柄用于指明要操作的图形对象。如果在调用set函数时省略全部属性名和属性值,则将显示出句柄所有的允许属性。 get函数的调用格式为: V=get(句柄,属性名) 其中V是返回的属性值。如果在调用get函数时省略属性名,则将返回句柄所有的属性值。 3.对象的公共属性 对象常用的公共属性:Children属性、Parent属性、Tag属性、Type属性、UserData属性、Visible属性、ButtonDownFcn属性、CreateFcn属性、DeleteFcn属性。
schlafenhamster 2014-08-13
  • 打赏
  • 举报
回复
10.3.1 图形窗口对象 建立图形窗口对象使用figure函数,其调用格式为: 句柄变量=figure(属性名1,属性值1,属性名2,属性值2,…) MATLAB通过对属性的操作来改变图形窗口的形式。也可以使用figure函数按MATLAB缺省的属性值建立图形窗口: figure 或 句柄变量=figure 要关闭图形窗口,使用close函数,其调用格式为: close(窗口句柄) 另外,close all 命令可以关闭所有的图形窗口,clf命令则是清除当前图形窗口的内容,但不关闭窗口。 MATLAB为每个图形窗口提供了很多属性。这些属性及其取值控制着图形窗口对象。除公共属性外,其他常用属性如下:MenuBar属性、Name属性、NumberTitle属性、Resize属性、Position属性、Units属性、Color属性、Pointer属性、KeyPressFcn(键盘键按下响应)、WindowButtonDownFcn(鼠标键按下响应)、WindowButtonMotionFcn(鼠标移动响应)及WindowButtonUpFcn(鼠标键释放响应)等。
schlafenhamster 2014-08-13
  • 打赏
  • 举报
回复
"在matlab的代码里,把窗口的属性设置" 好试试,
shiter 2014-08-12
  • 打赏
  • 举报
回复
引用 22 楼 schlafenhamster 的回复:
OnMatlab()按钮点了两次, 又创建一个? if( !myfunInitialize()) { MessageBox(_T("初始化失败")); } fun(); 是不是要在创建时, 指定风格?
不是把,那个fun()函数就是相当于调用matlab三句代码: figure('NumberTitle','off','menubar','none','toolbar','none','name','Topo Image'); x=0:pi/100:2*pi; y=2*exp(-0.5*x).*sin(2*pi*x); plot(x,y) 后面这个函数 mclTerminateApplication();我也不知道是干嘛。。。 然后现在就是,这个代码确实点击两次效果就好了。。。 我给这段代码加上个for循环,反倒不行。。。。
向立天 2014-08-12
  • 打赏
  • 举报
回复
以下引自baidu百科 由于兼容的原因,对于将改变父窗口的子窗口,SetParent函数并不改变该子窗口的WS_CHILD WS_POPUP风格。所以,如果hWndNewParent参数为NULL,就应在调用SetParent函数之后清空WS_CHILD位并且设置为WS_POPUP风格。相反的,如果hWndNewParent参数不为NULL并且在此之前窗口是桌面窗口的子窗口,就应在调用SetParent函数之前清空WS_POPUP位并设置WS_CHILD风格 可能是这个原因
schlafenhamster 2014-08-12
  • 打赏
  • 举报
回复
HWND hFig=0 ; // ::FindWindow(NULL,wnd_name);//wnd_name为matlab figure的名称, //此处需循环多次才能得到句柄,不知为啥? 可能窗口未创建好 while(hFig==NULL) { hFig=::FindWindow(NULL,wnd_name); }
加载更多回复(20)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧