- 积分
- 86
- 注册时间
- 2004-12-22
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 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;
} |
|