English

webapp - 基于webkit内核的简单应用,双核浏览器的基础!

webapp,是一款基于webkit内核的简单浏览器应用,并对外提供操纵webkit内核的接口。

当前,双核浏览器逐渐风行,前有傲游3.0,后有搜狗浏览器2.0,再有QQ浏览器5.0,等等。

双核的含义,是指在IE的trident内核之外,再加上渲染及JS执行速度非常快的webkit内核。

webapp的出现,使得双核应用更简便,因为webapp提供了webkit调用接口,你的应用也可非常方便地使用webkit内核。

如果有更多的需求,可以与联系(QQ353239635 MSN同email)。(源代码出售中)

下载

webapp-0.1-1-win32.zip (适用于Windows系统)

运行

Windows: webapp.exe

注:修改webapp.ini中的start_url,可使webapp打开指定的网址

webapp acid3测试结果

webapp调用接口

webapp.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//
#ifndef WEBAPP_H
#define WEBAPP_H
 
#include <windows.h>
 
namespace gfx {
typedef HWND NativeWindow;
}; // namespace gfx
 
namespace webapp {
 
class IWebView
{
public:
    virtual gfx::NativeWindow NativeWindow() = 0;
    virtual gfx::NativeWindow ParentWindow() = 0;
    virtual void LoadURL(const char* url) = 0;
    virtual void LoadURL(const wchar_t* url) = 0;
};
 
class IWebViewEventListener
{
public:
    virtual gfx::NativeWindow OnGetNewWindowContainer(IWebView* webview) = 0;
    virtual void OnReceiveTitle(IWebView* webview, const wchar_t* title) = 0;
    virtual void OnStartLoad(IWebView* webview) = 0;
    virtual void OnFinishLoad(IWebView* webview) = 0;
};
 
}; // namespace webapp
 
extern "C" __declspec(dllexport) bool webapp_init(int argc, char **argv);
extern "C" __declspec(dllexport) bool webapp_create_webview(webapp::IWebView** webview, gfx::NativeWindow parent);
extern "C" __declspec(dllexport) bool webapp_delete_webview(webapp::IWebView** webview);
extern "C" __declspec(dllexport) bool webapp_add_webview_event_listener(webapp::IWebViewEventListener* listener);
extern "C" __declspec(dllexport) bool webapp_remove_webview_event_listener(webapp::IWebViewEventListener* listener);
extern "C" __declspec(dllexport) void webapp_run();
extern "C" __declspec(dllexport) void webapp_shutdown();
 
typedef bool (__cdecl *WEBAPP_INIT)(int argc, char **argv);
typedef bool (__cdecl *WEBAPP_CREATE_WEBVIEW)(webapp::IWebView** webview, gfx::NativeWindow container);
typedef bool (__cdecl *WEBAPP_DELETE_WEBVIEW)(webapp::IWebView** webview);
typedef bool (__cdecl *WEBAPP_ADD_WEBVIEW_EVENT_LISTENER)(webapp::IWebViewEventListener* listener);
typedef bool (__cdecl *WEBAPP_REMOVE_WEBVIEW_EVENT_LISTENER)(webapp::IWebViewEventListener* listener);
typedef void (__cdecl *WEBAPP_RUN)();
typedef void (__cdecl *WEBAPP_SHUTDOWN)();
 
#endif // WEBAPP_H

webapp测试用例(webapp_test.tar.gz - 下载完整源码)

webapp_test.cc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "webapp_holder.h"
#include <windows.h>
#include <string>
#include "webview_event_listener.h"
 
#define WEBAPP_WINDOW_CLASS L"WebAppContainer_Win"
 
using namespace webapp;
 
WebAppHolder holder;
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam,
                         LPARAM lParam) {
    IWebView* webview = reinterpret_cast<IWebView*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
    if (webview) {
        switch (message) {
        case WM_DESTROY:
            holder.webapp_delete_webview(&webview);
            holder.webapp_shutdown();
        return 0;
 
        case WM_SIZE:
            RECT rc;
            GetClientRect(hwnd, &rc);
            MoveWindow(webview->NativeWindow(), 0, 0, rc.right, rc.bottom, TRUE);
            return 0;
        }
    }
 
  return DefWindowProc(hwnd, message, wParam, lParam);
}
 
void RegisterWindowClass()
{
    WNDCLASSEX wcex = {
        sizeof(WNDCLASSEX),
        CS_HREDRAW | CS_VREDRAW,
        WndProc,
        0,
        0,
        ::GetModuleHandle(NULL),
        0,
        LoadCursor(NULL, IDC_ARROW),
        0,
        0,
        WEBAPP_WINDOW_CLASS,
        0,
    };
    RegisterClassEx(&wcex);
}
 
int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t*, int) {
    //
    RegisterWindowClass();
    //
    HWND mainWnd = CreateWindow(WEBAPP_WINDOW_CLASS, L"webapp test",
        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
        NULL, NULL, ::GetModuleHandle(NULL), NULL);
    //
    holder.webapp_init(0, NULL);
    //
    IWebView* webview = NULL;
    holder.webapp_create_webview(&webview, mainWnd);
    ShowWindow(webview->NativeWindow(), SW_SHOW);
    SetWindowLongPtr(mainWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(webview));
    ShowWindow(mainWnd, SW_SHOW);
    //
    WebViewEventListener evt;
    holder.webapp_add_webview_event_listener(&evt);
    //
    wchar_t start_url[256];
    DWORD num = GetPrivateProfileString(L"webapp", L"start_url", L"", start_url, sizeof(start_url), L".\\webapp.ini");
    start_url[num] = 0;
    webview->LoadURL(start_url);
 
    holder.webapp_run();
 
    return 0;
}

webview_event_listener.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef WEBVIEW_EVENT_LISTENER_H
#define WEBVIEW_EVENT_LISTENER_H
 
#include "webapp.h"
 
class WebViewEventListener : public webapp::IWebViewEventListener
{
public:
    WebViewEventListener();
 
    virtual gfx::NativeWindow OnGetNewWindowContainer(webapp::IWebView* webview);
    virtual void OnReceiveTitle(webapp::IWebView* webview, const wchar_t* title);
    virtual void OnStartLoad(webapp::IWebView* webview);
    virtual void OnFinishLoad(webapp::IWebView* webview);
 
};
 
#endif // WEBVIEW_EVENT_LISTENER_H

webview_event_listener.cc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "webview_event_listener.h"
#include "resource.h"
 
WebViewEventListener::WebViewEventListener()
{}
 
gfx::NativeWindow WebViewEventListener::OnGetNewWindowContainer(webapp::IWebView* webview)
{
    wchar_t className[128];
    GetClassName(webview->ParentWindow(), className, sizeof(className));
    return ::CreateWindow(className, L"",
        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
        NULL, NULL, ::GetModuleHandle(NULL), NULL);
}
 
void WebViewEventListener::OnReceiveTitle(webapp::IWebView* webview, const wchar_t* title)
{
    ::SetWindowText(webview->ParentWindow(), title);
}
 
void WebViewEventListener::OnStartLoad(webapp::IWebView* webview)
{
    ::SendMessage(webview->ParentWindow(), WM_SETICON,TRUE,(LPARAM)::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)));
}
 
void WebViewEventListener::OnFinishLoad(webapp::IWebView* webview)
{
    ::SendMessage(webview->ParentWindow(), WM_SETICON,TRUE,(LPARAM)::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON2)));
}
产品族: 海狮 海猫 海葵 海蛛 海鹞 海星 海狗 WBXL Xultray webapp
iDocSet iDocSetHelper 雨燕 templateJS skiafy tranid 犀利播放器 犀利助手 网址导航 原创歌曲
(C) 2025 抓糖网 版权所有

update: 2013-06-07