找回密码
 注册
Simdroid-非首页
查看: 946|回复: 11

[转贴]:研学shxchen0592近期做的一个非常好的gui

[复制链接]
发表于 2005-11-29 19:13:27 | 显示全部楼层 |阅读模式 来自 新疆乌鲁木齐
刚才看了一下,文件比较大,分卷搞成4个,如果有悖于版规,请版主及时删贴,谢谢.之所以贴这个GUI,有两个原因,一个是这个GUI里的花样真的比较多,呵呵...simulink,excel中SHEET的activeX控件,一个很漂亮的waitbar,shxchen0592自己想出来的一个tabpanel的方法(从我对程序的理解应该是text的遮挡).另一个原因是这个里面的activeX控件的使用上我有点儿困惑(作者本人也有这个问题),即:当按下export按钮,activeX控件充满数据之后,再转向其他tab,该控件不能隐藏.会遮住其他tab上的图形或者按钮,所以shxchen0592的做法是tab一旦按下,回到setings时就再重新export和calculate一遍.不知道大家有没有什么好办法能让别的tab上的东西正常显示.不要再变一次tab就重算了.
另外说明一下,如果你使用的是版本7.0,很有可能会报错,因为在7.0里的imshow命令已经不能使用了,你把所有的imshow命令用image来代替,(有两个文件需要这样做)即可正常使用.
我在这里给出链接给感兴趣的朋友.
http://bbs.matwav.com/post/view?bid=12&id=373910&sty=1&tpg=1&age=30
转到这里的原因是个人感觉这个是值得转贴的原创作品.本意并非把文件"在论坛之间搬来搬去".^_^
发表于 2005-11-29 19:24:32 | 显示全部楼层 来自 新加坡

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

Simdroid开发平台
支持bainhome转贴兄弟论坛的精品作品。
发表于 2005-11-30 08:35:49 | 显示全部楼层 来自 江苏南京

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

收到,要好好学学
发表于 2005-11-30 09:40:07 | 显示全部楼层 来自 湖北武汉

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

本人对“元帅”级别的会员不再授予勋章,“功高盖主”,以后只奖励“士兵”。
 楼主| 发表于 2005-11-30 18:07:39 | 显示全部楼层 来自 新疆乌鲁木齐

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

*午夜流星* wrote:
本人对“元帅”级别的会员不再授予勋章,“功高盖主”,以后只奖励“士兵”。
第一:小的不是元帅,是混混儿.:D
第二:这个问题我前面发过帖子,感谢午夜流星的支持.
第三:这也是最重要的,大家可别忘记喽,这里面是有一个问题亟待解决的哟.还请各位高手畅所欲言不吝赐教.simweGUI高手很多,连手带脚数上两轮估计都有.这研学的战书我是下了(这句馊话是我自己想的,作者本人可不知道,别误会而赖他哟:D),欢迎上来打擂互动一下:).另外如果不麻烦的话,请版主置顶一阵儿.并欢迎shxchen0592自己直接来参与一下,因为现在这个附件已经不是那个最初的bug版了,而我好像把最初的那个无法实现遮盖的附件给删掉了.所以还是shxchen兄你自己个儿来吧.hoho...
期待讨论啊,两个兄弟论坛...:D:D:D
发表于 2005-12-1 07:06:38 | 显示全部楼层 来自 新加坡

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

关于ActiveX控件得控制,我暂时想到了如下两种方案(都是随机想法,没经过验证):

1。actxcontrol创建ActiveX控件时可以指定一个matlab Figure窗口作为Parent,而ActiveX控件的可视则可以通过控制该窗口的可视实现(用'Visible'特性)。从这里分出去,可以有两种办法:
1)如果该parent可以是一个GUI控件,比如Panel,那么直接在ActiveX所在的位置先放置一个Panel,把它作为Parent传给actxcontrol。
2)如果Parent必须是Figure窗口,那么就用Figure窗口,只是把它的titlebar等去掉,然后移到相应的位置。

2。通过Win32 API来实现对该ActiveX窗口的显示和隐藏。这种方法需要得到该窗口的HWND,但是常用的FindWindow用不上。只要有了HWND,那么能做的事情还很多。

砖已抛出,请楼下的继续。
 楼主| 发表于 2005-12-1 18:31:42 | 显示全部楼层 来自 新疆乌鲁木齐

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

taohe wrote:
关于ActiveX控件得控制,我暂时想到了如下两种方案(都是随机想法,没经过验证):

1。actxcontrol创建ActiveX控件时可以指定一个matlab Figure窗口作为Parent,而ActiveX控件的可视则可以通过控制该窗口的可视实现(用'Visible'特性)。从这里分出去,可以有两种办法:
1)如果该parent可以是一个GUI控件,比如Panel,那么直接在ActiveX所在的位置先放置一个Panel,把它作为Parent传给actxcontrol。
2)如果Parent必须是Figure窗口,那么就用Figure窗口,只是把它的titlebar等去掉,然后移到相应的位置。

2。通过Win32 API来实现对该ActiveX窗口的显示和隐藏。这种方法需要得到该窗口的HWND,但是常用的FindWindow用不上。只要有了HWND,那么能做的事情还很多。

砖已抛出,请楼下的继续。
谢谢taohe的发言,昨天我请教了nostalgica,对这个他提出的方案就是你所说的方法2.思路是:
nostalgi 19:18:13
得到句柄,用api
showwindow(hwnd,SW_HIDE)
Boogie 19:18:04
哦哦哦,窗体句柄hwnd的swhide可以做到啊...没想过.试试看

nostalgi 19:18:52
句柄好找啊。findwindow就行。
nostalgi 19:19:05
用spy++查一下窗口类。
Boogie 19:22:23
这部分的内容我很不懂,两三招儿下来估计就丢脸了,还是你说最好了

nostalgi 19:24:42
findwindow
ShowWindow
就这两个函数。可能可以吗。我猜的
======================================================
基本上都是用windows本身的api实现.但是findwindow我还没试过,这两天系里有些高校评估的琐事,非常之忙,很难抽出时间上网,等过几天忙完就试试,因为你和nostalgica所说的似有不同,我到时验证一下findwindow到底能否得到窗体句柄hwnd.再有就是这个实例中activeX控件是被放在某一个tab上的,我感觉不能用figure的parent句柄实现visible.不过刚才我看了一下tabdlg命令,好像可以通过比如:
a1 = axes('Parent',sheetPanels(1));
这样控制在tab上的显示,第一种方法后面我也会试试.
to alexqxp:谢谢,辛苦.研学看到你的帖子了.原来的bug版我手中也没有了,后面我问作者再要一个.
发表于 2005-12-1 19:44:46 | 显示全部楼层 来自 上海

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

谢谢热心的bainhome,怎么没看到修正后的版本啊。
我常来simwe,不过不常发帖子,呵呵。
activex的parent只能是figure window,没办法传到panel等其它控件。关于activex的隐藏问题,Matlab/help里有这么一句话: If the figure window designated by fig_handle is invisible, the control will be invisible. If you want the control you are creating to be invisible, use the handle of an invisible figure window.  看来除了隐藏figure window之外,依靠其它控件来隐藏Activex有困难。 关于用api的办法,兄弟我不在行,呵呵。期待高手出招。
发表于 2005-12-2 12:29:41 | 显示全部楼层 来自 陕西西安

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

搞定。
解决示例如下:

1。先用以下代码创建sheet activex
function h=sheet
f=figure('name','fig','numbertitle','off');

try
    h = actxcontrol('OWC11.Spreadsheet.11',...
        [0 0 400 400],f);
catch
    h = actxcontrol('OWC11.Spreadsheet.10',...
        [0 0 400 400],f);
end
set(h,'AutoFit',1);           
set(h,'DisplayOfficeLogo',0);
plot(1:10,1:10)

2。将mexsheet.dll拷入工作目录。
3。输入命令mexsheet('ATL:38D31C18',0,'fig')
  参数意义为:
  参数1:activex子窗口类名,这里是'ATL:38D31C18'。
  参数2:1 or 0,1为显示,0为隐藏
        参数3:figure的name,这里为'fig',遗憾的是标题只能是英文,若要中文可以改mex里unicode转换的方法。我用的matlab7.1,fiugre类必须为com.mathworks.hg.peer.FigureFrameProxy$FigureFrame,若不能使用,可自行修改mex

附mex等文件 : 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2005-12-2 12:30:25 | 显示全部楼层 来自 陕西西安

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

mex代码如下:
使用方法为(VC6)
1。新建工程win32 dynamic-link library
2。新建C++source file(mexsheet.cpp),将下面代码拷入。
3。用记事本建立mexsheet.def文件,内容为:
; mexsheet.def : Declares the module parameters for the DLL.

LIBRARY "mexsheet"
DESCRIPTION 'mexsheet Windows Dynamic Link Library'

EXPORTS
; Explicit exports can go here
mexFunction
并将此文件加入工程
4。project -settings- c/c++,preprocessor definition中加加入UNICODE,_UNICODE,这是因为matlab的参数是UNICODE的。
5。tools-option-directories-include files 加入 $matlabroot$\extern\include
tool-option-derectores-libriary files加入$matlabroot$\extern\lib\win32\microsoft\msvc60
6。project -settings-link,加入libmx.lib libmat.lib libmex.lib 库文件
7。build就可以啦。

#include "mex.h"
#include "windows.h"

HWND hwnd=NULL;//所要找的子窗口
TCHAR szMyClassName[255];
TCHAR szFigureName[255];

BOOL CALLBACK EnumChildWindowsProc(HWND hWnd, LPARAM lParam);
void char2Wchar(char* lpChar ,wchar_t* lpWchar,int maxcount);

void mexFunction (int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]){
  //prhs[0]所寻子窗口类名;
  //prhs[1]1表示显示,0表示隐藏
  //prhs[2]父fiugre标题
  int xlen,ylen;
  /////////////////参数检验//////
  if(nrhs!=3)
    mexErrMsgTxt("输入变量个数应为3\n");
  xlen=mxGetN(prhs[1]);//矩阵列数
  ylen=mxGetM(prhs[1]);//矩阵行数
  if(!mxIsChar(prhs[0]))
        mexErrMsgTxt("第一个输入变量应为字符串\n");
  if (xlen!=1 || ylen!=1)
    mexErrMsgTxt("第二个输入变量应为单个数字\n");
  int iNumber=(int)(*mxGetPr(prhs[1]));
  if(iNumber!=1 && iNumber!=0)
    mexErrMsgTxt("第二个输入变量应为1或0\n");
  if(!mxIsChar(prhs[2]))
        mexErrMsgTxt("第三个输入变量应为字符串\n");
  ///////////////////////////////

  HWND figureWindow;//父figure句柄
  char szBufferMyClassName[255];
    char szBufferFigureName[255];
    mxGetString(prhs[0],szBufferMyClassName,255);//所寻子窗口类名
  mxGetString(prhs[2],szBufferFigureName,255);//父fiugre标题
  char2Wchar(szBufferMyClassName,szMyClassName,255);//UNICODE转换
    char2Wchar(szBufferFigureName,szFigureName,255);

    figureWindow=(HWND)FindWindow(TEXT("com.mathworks.hg.peer.FigureFrameProxy$FigureFrame"),szFigureName);
    //找到父figure
  if (figureWindow==NULL){
    mexWarnMsgTxt("不能找到figure");
    return;
  }
  //枚举子窗口
  EnumChildWindows(figureWindow,(WNDENUMPROC)EnumChildWindowsProc, NULL);
    //枚举结果
  if (hwnd==NULL){
     mexWarnMsgTxt("不能找到子窗口");
     return;
  }
  if (iNumber==1){
    HWND hppwnd;
    hppwnd=GetParent(GetParent(hwnd));
    EnableWindow(hppwnd,TRUE);
        ShowWindow(hppwnd,SW_SHOWNORMAL);
  }else{
    HWND hppwnd;
    hppwnd=GetParent(GetParent(hwnd));
    EnableWindow(hppwnd,FALSE);
        ShowWindow(hppwnd,SW_HIDE);
    
  }    
}

////////////////////////////////////////////////////////////
// EnumChildWindowsProc:枚举子窗口句柄的回调函数
////////////////////////////////////////////////////////////
BOOL CALLBACK EnumChildWindowsProc(HWND hWnd, LPARAM lParam)
{
        TCHAR szClassName[255];
        TCHAR szTitle[255];
        GetClassName(hWnd, szClassName, 255);
        GetWindowText(hWnd, szTitle, 255);
        // 如果类名和标题皆符合要求,即找到控件,这里标题未用
        if (lstrcmp(szClassName, szMyClassName) == 0)
        { hwnd=hWnd;//hwnd所要找的子窗口,全局
          return FALSE;//return FALSE时EnumChildWindows返回
        }
        return TRUE;
}

///////////////////////////////////////////////////////////////////////////
void char2Wchar(char* lpChar ,wchar_t* lpWchar,int maxcount){
//非unicode转为unicode
   int i=0;
   while(lpChar!=0){
     if(i+1<=maxcount ){
     lpWchar=(USHORT)lpChar;
     i++;}
     else{
     break;
     }
   }
   lpWchar=0;
}
发表于 2005-12-2 13:11:17 | 显示全部楼层 来自 新加坡

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

Excellent! Thanks to nostalgica.

EnumChildWindows is the key point.

In addition to mex approach, it looks like calling functions directly from user32.dll (using MATLAB's interface to DLL) may also do the trick.
发表于 2005-12-5 17:24:00 | 显示全部楼层 来自 上海

Re:[转贴]:研学shxchen0592近期做的一个非常好的gui

activex用 regsvr32注册,很多都无法注册成功,有没有什么办法?activex是可以扩充丰富gui的控件,但是开发的GUI果无法在其它的机子上运行的话就没什么意义了。
还有个菜单的问题请教一下,能否在菜单上加入自己的图标?matlab菜单不象button一样,有个CData属性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-27 23:41 , Processed in 0.049794 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表