Sciter教程系列-01 分析sdk/demos/minimal例程
编译demos/minimal例程
上一个教程已经搭建好工程运行起来了,现在将VS项目中src目录下的源码文件移除(不是删除),然后将$(SciterSDK)/demos/minimal/minimal.cpp拷贝到src/并添加到VS工程中。编译运行,将会得到如下结果。

控制台提示无法加载bin/minimal.htm文件,显然代码中指定了加载此文件,但是本地磁盘没有该文件。为了显示本地文件,将res/main.htm拷贝到bin/目录下,将代码中的minimal.htm改为main.htm,再次编译运行即可看到本地的文件被加载成功并显示出来。
接下来分析minimal.cpp中的代码。
程序入口WinMain
代码使用win32-api创建了一个窗口并加载本地.htm资源文件,有关程序入口WinMain的描述见WinMain function。
在这个程序入口函数里,主要完成两件事,通过sciter加载文件、创建窗口并建立消息循环。
1、sciter加载文件。sciter可以通过回调函数使得用户可以自定义文件加载的方式。如下代码中,函数SciterCallback实现中分发了系列回调事件,其中就包括了加载文件的回调函数,当SciterLoadFile加载文件时,执行的其实是自定义的加载文件回调函数DoLoadData。而在DoLoadData中,将根据指定的资源文件路径的字符串格式来区分资源从内存导入、从res/导入、从resources.cpp导入或者是从绝对路径导入。
::SciterSetCallback(wnd,&SciterCallback,NULL);
::SciterLoadFile(wnd, GetAbsolutePath());
示例中使用了指定绝对路径导入资源文件的方式。
2、创建窗口并建立消息循环。这里使用的都是win32-api,具体函数用法可参考Programming reference for the Win32 API。创建窗口消息循环相关可参考Creating a Message Loop。
HWND wnd = ::CreateWindowEx(
0, /*WS_EX_LAYOUTRTL,*/
::SciterClassName(),
L"Minimal Sciter Application",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0,
800, 600,
0,0,0,0);
::ShowWindow(wnd, SW_SHOWNORMAL);
MSG msg;
while( ::IsWindow(wnd) && GetMessage(&msg, 0, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
资源文件改为从resources.cpp加载
按照上一个教程中资源文件路径指定的方式,修改main.htm的路径。编译运行,发现窗口正确显示了,但是资源文件未加载。
// ::SciterLoadFile(wnd, GetAbsolutePath());
::SciterLoadFile(wnd, WSTR("this://app/main.htm"));
调试发现,在DoLoadData中,分支代码的::SciterDataReady并未被执行,具体来说,是sciter::archive::instance().get()方法没有取到所需的资源数据。对比上一个教程的代码可以看到,其中有加载resources.cpp数据的动作,而resources.cpp又是使用打包脚本打包资源文件得到的,加上以下两行代码,再编译运行,可以看到资源文件成功加载。
#include "resources.cpp"
sciter::archive::instance()

本文介绍了如何在SciterSDK的minimal例程中编译并运行,涉及文件加载、窗口创建、消息循环以及资源文件从内存、res目录和archive的加载。作者详细解释了WinMain函数和SciterCallback的作用,并展示了如何通过回调函数处理不同类型的文件加载请求。
最低0.47元/天 解锁文章
929

被折叠的 条评论
为什么被折叠?



