最近在研究UGOPEN文件夹里的例子,发现从NX10版开始可以用户自定义资源栏选项卡了,NX10以下也可以做,但是需要反编译DLL调内部函数,这个只有高手才会,我是不会弄。

以前看过有人把标准件库做到了这个选项卡里面。

在UGOPEN里有一个例子CustomResourceBarTab就介绍了怎么自定义资源栏选项卡。但是我发现例子中能实现的功能还是有限,有些功能接口并没有开放,可能还是要调内部函数才能实现。

就比如我想在选项卡里创建BlockUI的各种控件,我没研究出来怎么弄。但是这个例子我基本上知道怎么去创建选项卡以及做MFC控件。其实我觉得可以搭建个MFC项目,把MFC的界面通过获取

窗口句柄嵌套在选项卡里面去实现交互。例子也是通过获取NX窗口句柄注册选项卡的。

用到的几个NXOPEN方法https://docs.plm.automation.siemens.com/data_services/resources/nx/11/nx_api/custom/en_US/open_c++_ref/a05722.html

 // 描述:
//这是一个允许第三方应用程序
//将自己的工具或交互式窗口嵌入到选项卡中
// NX资源栏。 // Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h> // Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx> // Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx> //头文件
#include <NXOpen/Session.hxx>
#include <NXOpen/UI.hxx>
#include <NXOpen/ListingWindow.hxx>
#include <afxwin.h>
#include <WinUser.h>
#include <map>
#include <RichEdit.h>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/TaggedObject.hxx>
#include <NXOpen/Callback.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/ResourceBarManager.hxx>
#include <uf.h>
#include <uf_ui.h>
#include <uf_exit.h>
#include <uf_modl.h> //命名空间
using namespace std;
using namespace NXOpen; // Std C++ Includes
#include <iostream>
#include <sstream> using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr; //------------------------------------------------------------------------------
// NXOpen c++ test class
//------------------------------------------------------------------------------
class MyClass
{
// class members
public: //用户代码
static Session *theSession;
static UI *theUI;
static ListingWindow* listW;
static HINSTANCE theInst; typedef std::map<int, int> StlRegisteredTabMap;
static StlRegisteredTabMap g_TabMap; typedef std::map<int, HWND> StlChildWindowMap;
static StlChildWindowMap g_ChildMap; BOOL InitApplication();//初始化应用程序
BOOL InitInstance();//初始化函数
HWND CreateChildWindow(HWND parent_handle);//创建子窗口
int ActivationHandler(int tab_id);//激活Handler int GetRegisteredID(int id) const { return g_TabMap[id]; }//获取注册的ID
void SetRegisteredID(int id, int tab_id) { g_TabMap[id] = tab_id; }//设置注册的ID
void RemoveRegisteredID(int id) { g_TabMap.erase(id); }//移除注册的ID
int GetLastRegisteredID() const;//获取最后一个注册的ID
int GetRegisteredNumber(int tab_id) const;//获取注册的数量 HWND GetChildWindow(int id) const { return g_ChildMap[id]; }//获取子窗口
void SetChildWindow(int id, HWND handle) { g_ChildMap[id] = handle; }//设置子窗口
void RemoveChildWindow(int id) { g_ChildMap.erase(id); }//移除子窗口 MyClass();
~MyClass(); void do_it();
void print(const NXString &);
void print(const string &);
void print(const char*); private:
Part *workPart, *displayPart;
NXMessageBox *mb;
ListingWindow *lw;
LogFile *lf; const char* theDlxFileName;
NXOpen::BlockStyler::BlockDialog* theDialog;
}; //------------------------------------------------------------------------------
// 初始化静态变量
//------------------------------------------------------------------------------
Session* MyClass::theSession = NULL;
UI* MyClass::theUI = NULL;
ListingWindow* MyClass::listW = NULL;
HINSTANCE MyClass::theInst = NULL;
static MyClass* theMyClass = NULL;
static HWND hAdd = NULL;
static HWND hActivate = NULL;
static HWND hHide = NULL;
static HWND hShow = NULL;
static HWND hRemove = NULL;
static HWND hMain = NULL;
static int tab_count = ;
MyClass::StlChildWindowMap MyClass::g_ChildMap;
MyClass::StlRegisteredTabMap MyClass::g_TabMap; static LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); //------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
MyClass::MyClass()
{ //初始化NX Open c++ API环境
MyClass::theSession = NXOpen::Session::GetSession();
MyClass::theUI = UI::GetUI(); //初始化列表窗口
listW = MyClass::theSession->ListingWindow(); //获取指定模块的句柄
theInst = GetModuleHandle(_T("CustomResourceBarTab.dll")); mb = theUI->NXMessageBox();
lw = theSession->ListingWindow();
lf = theSession->LogFile(); workPart = theSession->Parts()->Work();
displayPart = theSession->Parts()->Display(); } //------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
MyClass::~MyClass()
{
DestroyWindow(hMain);
} //------------------------------------------------------------------------------
// Print string to listing window or stdout
//------------------------------------------------------------------------------
void MyClass::print(const NXString &msg)
{
if (!lw->IsOpen()) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const string &msg)
{
if (!lw->IsOpen()) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const char * msg)
{
if (!lw->IsOpen()) lw->Open();
lw->WriteLine(msg);
} //初始化应用程序
BOOL MyClass::InitApplication()
{
WNDCLASSEX wcx; //用参数填充窗口类结构
//描述主窗口。
wcx.cbSize = sizeof(wcx); // size of structure
wcx.style = CS_HREDRAW | CS_VREDRAW; // redraw if size changes
wcx.lpfnWndProc = WndProc; // points to window procedure
wcx.cbClsExtra = ; // no extra class memory
wcx.cbWndExtra = ; // no extra window memory
wcx.hInstance = theInst; // handle to instance
wcx.hIcon = NULL; // predefined app. icon
wcx.hCursor = LoadCursor(NULL, IDC_ARROW); // predefined arrow
wcx.hbrBackground = ::GetSysColorBrush(COLOR_WINDOW); // white background brush
wcx.lpszMenuName = NULL; // name of menu resource
wcx.lpszClassName = L"TestWClass"; // name of window class
wcx.hIconSm = NULL; // no small class icon //注册窗口类
return RegisterClassEx(&wcx);
} //初始化函数
BOOL MyClass::InitInstance()
{
HINSTANCE hInst = MyClass::theInst; //创建主窗口
hMain = CreateWindow(
L"TestWClass", // name of window class
L"Main", // title-bar string
WS_CAPTION | WS_SYSMENU | WS_OVERLAPPEDWINDOW, // top-level window
CW_USEDEFAULT, // default horizontal position
CW_USEDEFAULT, // default vertical position
, // default width
, // default height
(HWND)NULL, // no owner if NULL
(HMENU)NULL, // use class menu
theInst, // handle to application instance
(LPVOID)NULL); // no window-creation data if (!hMain)
return FALSE; ShowWindow(hMain, SW_SHOW);
UpdateWindow(hMain); return TRUE;
} //获取最后一个注册的ID
int MyClass::GetLastRegisteredID() const
{
StlRegisteredTabMap::const_iterator it; int tab_id = ;
for (int i = tab_count; i > ; i--)
{
it = g_TabMap.find(i);
if (it != g_TabMap.end())
return it->second;
} return ;
} //获取注册的数量
int MyClass::GetRegisteredNumber(int tab_id) const
{
int tab_num = ;
for (StlRegisteredTabMap::const_iterator it = g_TabMap.begin(); it != g_TabMap.end(); ++it)
{ if (tab_id == it->second)
return it->first;
} return tab_num;
} //激活Handler
int MyClass::ActivationHandler(int tab_id)
{
try
{
//获取WindowHandle对象
WindowHandle *window_handle = MyClass::theUI->ResourceBarManager()->GetWindowHandle(tab_id);//返回与给定选项卡ID关联的NX停靠窗口
//获取真正的handle
HWND parent_handle = (HWND)window_handle->GetHandle();
BOOL is_window = ::IsWindow(parent_handle); char msg[];
//打开打印信息窗口并打印消息
MyClass::listW->Open();
sprintf_s(msg, "Window Handle: %p %s", parent_handle, is_window ? "is a window" : "is not a window");
MyClass::listW->WriteLine(msg); //检查子窗口是否已经创建
HWND child_handle = theMyClass->GetChildWindow(tab_id);
if (is_window && child_handle == NULL)
{
HWND child_handle = CreateChildWindow(parent_handle);
theMyClass->SetChildWindow(tab_id, child_handle);
}
}
catch (const NXOpen::NXException& ex)
{
std::cerr << "Caught exception" << ex.Message() << std::endl;
}
return ;
} //创建子窗口
HWND MyClass::CreateChildWindow(HWND parent_handle)
{
RECT rcClient;
GetClientRect(parent_handle, &rcClient);
HWND hChild = NULL;
HINSTANCE hInst = MyClass::theInst; if (parent_handle != NULL)
{
//创建主窗口
hChild = CreateWindow(
L"TestWClass", // name of window class
L"Child", // title-bar string
WS_CHILD | WS_BORDER | WS_VSCROLL | WS_HSCROLL, // child window
CW_USEDEFAULT, // default horizontal position
CW_USEDEFAULT, // default vertical position
rcClient.right, // default width
rcClient.bottom, // default height
(HWND)parent_handle, // parent window or no owner if NULL
(HMENU)NULL, // use class menu
hInst, // handle to application instance
(LPVOID)NULL); // no window-creation data
} if (!hChild)
return NULL; ShowWindow(hChild, SW_SHOW);
UpdateWindow(hChild); return hChild;
} //创建对话框
static BOOL Cls_OnCreate(HWND hwnd, CREATESTRUCT FAR *lpCreateStruct)
{
WCHAR title[];
GetWindowText(hwnd, title, ); HINSTANCE hInst = MyClass::theInst; if (wcscmp(title, _T("Child")) == )
{
HWND hInsert = CreateWindow(_T("BUTTON"), _T("Insert Text"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
, , , , hwnd, (HMENU)NULL, hInst, NULL);
HWND hEdit = CreateWindow(_T("EDIT"), TEXT("Edit"), WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
, , , , hwnd, (HMENU)NULL, hInst, NULL);
//创建组合框控件
HWND hComboBox = CreateWindow(WC_COMBOBOX, TEXT("Combo"), CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE | CBS_AUTOHSCROLL,
, , , , hwnd, (HMENU)NULL, hInst, NULL); HWND hInsert1 = CreateWindow(_T("BUTTON"), _T("创建块"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
, , , , hwnd, (HMENU)NULL, hInst, NULL); //用项目列表加载组合框
TCHAR Planets[][] =
{
TEXT("Mercury"), TEXT("Venus"), TEXT("Terra"), TEXT("Mars"),
TEXT("Jupiter"), TEXT("Saturn"), TEXT("Uranus"), TEXT("Neptune"),
TEXT("Pluto??")
}; TCHAR A[];
int k = ;
memset(&A, , sizeof(A));
for (k = ; k <= ; k += )
{
wcscpy_s(A, sizeof(A) / sizeof(TCHAR), (TCHAR*)Planets[k]); //添加字符串到combobox
SendMessage(hComboBox, (UINT)CB_ADDSTRING, (WPARAM), (LPARAM)A);
} //发送CB_SETCURSEL消息以在选择字段中显示初始项
SendMessage(hComboBox, CB_SETCURSEL, (WPARAM), (LPARAM)); LoadLibrary(TEXT("Riched20.dll"));
HWND hwndEdit = CreateWindowEx(, RICHEDIT_CLASS, TEXT("Type here"),
ES_MULTILINE | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP,
, , , , hwnd, NULL, hInst, NULL);
}
else if (wcscmp(title, _T("Main")) == )
{
hAdd = CreateWindow(_T("BUTTON"), _T("Add New Tab"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
, , , , hwnd, (HMENU)NULL, hInst, NULL);
hActivate = CreateWindow(_T("BUTTON"), _T("Activate New Tab"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
, , , , hwnd, (HMENU)NULL, hInst, NULL);
hHide = CreateWindow(_T("BUTTON"), _T("Hide New Tab"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
, , , , hwnd, (HMENU)NULL, hInst, NULL);
hShow = CreateWindow(_T("BUTTON"), _T("Show New Tab"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
, , , , hwnd, (HMENU)NULL, hInst, NULL);
hRemove = CreateWindow(_T("BUTTON"), _T("Remove New Tab"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
, , , , hwnd, (HMENU)NULL, hInst, NULL);
} return TRUE;
} LRESULT CALLBACK WndProc(HWND hwnd, // handle to window
UINT Message, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch (Message)
{
case WM_CREATE:
Cls_OnCreate(hwnd, NULL);
break;
case WM_DESTROY:
break;
case WM_PAINT:
break;
case WM_LBUTTONDOWN:
break;
case WM_CTLCOLOREDIT:
break;
case WM_MOUSEACTIVATE:
break;
case WM_SETCURSOR:
break;
case WM_CHILDACTIVATE:
break;
case WM_COMMAND:
{
WCHAR wStr[];
HWND hControl = (HWND)lParam; //在测试对话框中单击按钮
if (HIWORD(wParam) == BN_CLICKED)
{
GetWindowText(hControl, wStr, );
if (wcscmp(wStr, L"Insert Text") == )
{
HWND parent = GetParent(hControl);
HWND edit = FindWindowEx(parent, NULL, L"Edit", L"Edit");
// Apply button clicked
if (edit)
SetWindowText(edit, L"This is a Test");
}
if (wcscmp(wStr, L"创建块") == )
{
//加锁
UF_UI_lock_ug_access(UF_UI_FROM_CUSTOM); //点构造器
char sCue[] = "点构造器";
UF_UI_POINT_base_method_t base_method = UF_UI_POINT_INFERRED;
tag_t tPoint = NULL_TAG;
double sBasePoint[] = { , , };
int iRespone;
UF_UI_point_construct(sCue, &base_method, &tPoint, sBasePoint, &iRespone); //解锁
UF_UI_unlock_ug_access(UF_UI_FROM_CUSTOM); //创建块
UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
double Corner_pt[];
Corner_pt[] = sBasePoint[];//设置原点
Corner_pt[] = sBasePoint[];
Corner_pt[] = sBasePoint[];
char *Edge_Len[] = { "", "", "" };//设置长宽高
tag_t BlkTag = NULL_TAG;
UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);
} if (hControl == hRemove)
{
//删除最后添加的标签
int tab_id = theMyClass->GetLastRegisteredID(); if (tab_id != )
{
int tab_num = theMyClass->GetRegisteredNumber(tab_id); MyClass::theUI->ResourceBarManager()->Destroy(tab_id);//从资源栏区域中删除并销毁与给定选项卡ID关联的选项卡
theMyClass->RemoveRegisteredID(tab_num);
theMyClass->RemoveChildWindow(tab_id);
}
}
else if (hControl == hAdd)
{
//添加新选项卡
tab_count++;
char title[];
sprintf_s(title, "My Tab %d", tab_count);
int tab_id = MyClass::theUI->ResourceBarManager()->ResourceBarManager::Create(title, "computer");// 通过注册标签数据来创建标签
//注册一个回调,每当要激活自定义选项卡时将调用该回调
MyClass::theUI->ResourceBarManager()->ResourceBarManager::RegisterActivationCallback(tab_id, make_callback(theMyClass, &MyClass::ActivationHandler));
theMyClass->SetRegisteredID(tab_count, tab_id);
}
else if (hControl == hShow)
{
//显示最后添加的标签
int tab_id = theMyClass->GetLastRegisteredID(); if (tab_id != )
MyClass::theUI->ResourceBarManager()->SetTabVisibility(tab_id, true);//在资源栏区域中设置选项卡的可见性
}
else if (hControl == hHide)
{
//隐藏最后添加的标签
int tab_id = theMyClass->GetLastRegisteredID(); if (tab_id != )
MyClass::theUI->ResourceBarManager()->SetTabVisibility(tab_id, false);//在资源栏区域中设置选项卡的可见性
}
else if (hControl == hActivate)
{
//激活最后添加的标签
int tab_id = theMyClass->GetLastRegisteredID(); if (tab_id != )
MyClass::theUI->ResourceBarManager()->ActivateTab(tab_id);//激活资源栏选项卡
}
}
}
break;
} /* switch */ return DefWindowProc(hwnd, Message, wParam, lParam);
} //------------------------------------------------------------------------------
// Do something
//------------------------------------------------------------------------------
void MyClass::do_it()
{ // TODO: add your code here } //------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
// Explicit Execution
extern "C" DllExport void ufsta(char *parm, int *returnCode, int rlen)
{
try
{ if (UF_initialize())
{
/* Failed to initialize */
return;
} if (theMyClass == NULL)
theMyClass = new MyClass(); /* TODO: Add your application code here */
BOOL init = theMyClass->InitApplication();
if (init)
init = theMyClass->InitInstance(); // Create NXOpen C++ class instance
theMyClass->do_it(); /* Terminate the API environment */
UF_terminate(); }
catch (const NXException& e1)
{
UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
}
catch (const exception& e2)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
}
catch (...)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
}
} //------------------------------------------------------------------------------
// Unload Handler
//------------------------------------------------------------------------------
extern "C" DllExport int ufusr_ask_unload()
{
return (int)NXOpen::Session::LibraryUnloadOptionAtTermination;
} extern void ufusr_cleanup()
{
try
{
//---- Enter your callback code here -----
char msg[];
// Open the Print the Information window and print the message.
MyClass::listW->Open();
sprintf_s(msg, "ufusr clean up");
MyClass::listW->WriteLine(msg); if (theMyClass != NULL)
{
for (MyClass::StlRegisteredTabMap::const_iterator it = MyClass::g_TabMap.begin(); it != MyClass::g_TabMap.end(); ++it)
{
int num = it->first;
int tab_id = it->second; if (tab_id > )
MyClass::theUI->ResourceBarManager()->Destroy(tab_id);
} delete theMyClass;
theMyClass = NULL;
}
}
catch (const NXOpen::NXException& ex)
{
std::cerr << "Caught exception" << ex.Message() << std::endl;
}
} Caesar卢尚宇
2019年11月25日

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback的更多相关文章

  1. 【NX二次开发】Block UI 选项卡控件

    [NX二次开发]Block UI 选项卡控件

  2. NX二次开发-UDO用户自定义对象(UFUN)【持续完善】

    每当提起UDO总是会让我想起大专毕业那会失业找工作,后来有个宝贵机会去了软件公司上班,拿到了我人生中的第一个NX二次开发项目,一个关于测量汽车前后左右摄像头的项目.当时那个项目就用到了UDO,对于只看 ...

  3. NX二次开发-基于MFC界面对话框与NX交互的开发

    打开VS2013 点击新建,选择MFC DLL 点击确定 点下一步 什么都不改,直接点完成 进来之后先编译一下,看是否编译成功 打开项目属性,更改这几处 $(UGII_BASE_DIR)\ugopen ...

  4. NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条

    半年前在一些QQ群看到有大神NX二次开发做出了进度条,那个时候我还不会弄,也不知道怎么弄得,后来断断续续得研究了一下,直到今天我把它做出来了.内心还是很喜悦的!回想自己这两年当初从没公司肯给我做NX二 ...

  5. C# NX二次开发环境搭建

    在网上看到一篇C#二次开发环境搭建的文章:NX二次开发-使用NXOPEN C#手工搭建开发环境配置 ,写得非常好.我按照文章操作,过程中遇到几个问题,把问题分享给大家,希望对各位有帮助. 注意三点: ...

  6. 【NX二次开发】Block UI 目录

    Block UI 目录  基本   标签/位图   切换开关   枚举   字符串   多行字符串   操作按钮   列表框   分割线   对象颜色选择器   RGB颜色选择器   绘图区   图层 ...

  7. NX二次开发-Block UI C++界面关于 在Block UI中UF_initialize();和UF_terminate();的使用

    关于 在Block UI中UF_initialize();和UF_terminate();的使用 用Block UI作NX二次开发的时候,不需要在使用UFUN函数的时候加UF_initialize() ...

  8. NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))

    NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...

  9. NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))

    在看这个博客前,请读者先去完整看完:NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article ...

随机推荐

  1. hdu 4609 3-idiots(FFT+去重处理)

    3-idiots Problem Description King OMeGa catched three men who had been streaking in the street. Look ...

  2. html生成pdf

    /** * 生成pdf * @param string $html 需要生成的内容 */ function pdf($html='<h1 style="color:red"& ...

  3. ajax中回调的几个坑

    在前端开发中,经常要用ajax去拿后台接口返回的数据,总结几个ajax的回调的常见问题,供大家参考爬坑. 未定义contentType,可能会造成的传入后台的数据乱码,可以加上如下代码在ajax请求中 ...

  4. python selenium模拟登陆163邮箱。

    selenium是可以模拟浏览器操作. 有些爬虫是异步加载的,通过爬取网页源码是得不到需要的内容.所以可以模拟浏览器去登陆该网站进行爬取操作. 需要安装selenium通过pip install xx ...

  5. 64、saleforce 删除操作举例

    String deletePrivelegeRoleSql = 'SELECT ROLEID__c, NAME__c, Id, PRIVELEGEID__r.ID, ROLEID__r.ID FROM ...

  6. 2019 pycharm激活码

    http://lookdiv.com 里面有,钥匙:1211268069 激活码网址里面有 lookdiv.com 里面的钥匙就是lookdiv.com

  7. HP Server BIOS实验报告

    原文链接http://www.hpiss.com/3924.html 注意:红色字体为HP手册中查找到的资源,及个人感觉应该注意的一些信息,个人翻译的也为红字体,网络中自行查找到的资源,以及询问各位师 ...

  8. cannot find module node-sass

    解决方法: npm install --save-dev node-sass

  9. 12. MySQL简单使用

    关于MySQL的使用,大家可以去网上看相关教程,但是为了保证阅读的连贯性,这里会做简单介绍. 创建数据库 我们双击刚刚新建的数据库,然后双击mysql,点击新建查询,可以在编辑器里面输入一些mysql ...

  10. tarjam 模板改编

    思路要灵活 邻接表涉及数组问题,可以用vector代替