mCtrl
0.11.1
|
Go to the source code of this file.
HTML control (MC_WC_HTML
).
As the control name suggests, the control is intended to display HTML documents. Actually the control is thin wrapper of Internet Explorer COM object, so it can do much more: display a plethora of multimedia files, take use of JavaScript etc.
The easiest way how to show some document is to specify URL of target document as control's window name. For example when created with CreateWindow()
, use the 2nd argument as the URL. This allows easy use of the control in dialog templates.
URL can also be set anytime later with message MC_HM_GOTOURL.
The control accepts any protocol understood by the Internet Explorer, for example:
The res:
protocol is especially useful. It allows you to embed some resources like HTML pages, cascading style sheets (CSS), images (PNG, JPG etc.) or JavaScript files into binary of your application or any DLL it uses.
You can link to such resources with URL in format "res://modname/res_type/res_id" where modname
is name of the binary module (usually filename of your program or any DLL it loads; or a full path to other .EXE or .DLL file), res_type
is type of the resource and res_id
is ID of the resource in the resource script (RC).
The type can be omitted in the URL. The control then assumes type 23 (RT_HTML
).
Although res_id
can be both string or number identifier, we recommend to prefer string identifiers which end with dummy "file extension", hence making a hint to the browser about the image type. Without this the browser tries to guess what type of the data the resource is, and that may be unreliable. Remember the heuristics also differ in various versions of MSIE.
For example if you have a HTML file named some_page.html
and an image file image.png
which can be linked from the HTML page, add the following lines into your resource script:
which is used to build a MYLIBRARY.DLL
used by your application then your application can simply send the message MC_HM_GOTOURL with URL "res://mylibrary.dll/some_page.html"
.
Of course, HTML documents stored in the resources then can also use relative URLs to link to other documents and resources in the same module (.EXE or
.DLL).
MCTRL.DLL
implements a simple application protocol app:
which is intended for integration of HTML contents into your application logic.
Whenever user clicks on a link with URL starting with the "app:"
the control sends notification MC_HN_APPLINK to its parent window which is supposed to react programmatically. The control itself does not interpret application link URLs in any way.
Generating HTML contents programmatically is also possible to some degree. Note however that the application is not supposed to generate whole documents but only smaller snippets of them.
The application can set contents of almost any tag (identified by HTML attribute "id"
) with any custom string using the message MC_HM_SETTAGCONTENTS. The message takes the ID and the string as its arguments. Then, if the currently loaded page has a tag with the given ID, the content of the tag is replaced and set to the given string. Any previous content of that tag is removed. Remember the string has to follow HTML syntax and keep integrity of the HTML document.
Note the application should use the message MC_HM_SETTAGCONTENTS only after the HTML document intended to be changed is completely loaded, i.e. anytime after the notification MC_HN_DOCUMENTCOMPLETE is fired.
COL
, COLGROUP
, FRAMESET
, HEAD
, HTML
, STYLE
, TABLE
, TBODY
, TFOOT
, THEAD
, TITLE
, TR
.We recommend to use tags DIV
or SPAN
for the dynamic contents injected by application code into the HTML pages.
The control supports also invoking a script (e.g. JavaScript) function within the HTML page from the application's code.
There are actually two messages for this very purpose. The message MC_HM_CALLSCRIPTFUNCEX is more powerful, and can call any script function, with any number of arguments of any type, and returning any type, but using this message requires manual setup of OLE variadic type (VARIANT
) type and it requires more coding.
The other message, MC_HM_CALLSCRIPTFUNC, is easier to use but its use imposes some limitations: It can only deal with script functions with up to four arguments, and all arguments, as well as any return value, must be of string or integer type.
As noted in the introduction, the control is implemented as a thin wrapper of Internet Explorer COM object (COM interface IWebBrowser2
).
Because of the compatibility reasons, Microsoft has decided that by default the control will behave as Internet Explorer version 7 (assuming IE 7 or newer is installed in the computer).
This has some impact on how the HTML pages are rendered and, more importantly, on java-script dialect understood by it. Unfortunately the API does not allow reasonable to change the compatibility mode on a per-control (or rather on a per-COM-object-instance) manner.
Furthermore, the switching is done through a change in the registry, which should likely be done during installation phase of the application (and possibly undone when it is uninstalled). Therefore the mCtrl does not offer any API to change this and instead you are on your own to deal with the registry keys.
To change the behavior, you need to create the following registry key "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION" if it does not already exist, and in it, create a DWORD value named as a binary name of your application (e.g. "MyApplication.exe"). The DWORD value then determines the compatibility version (taken from MSDN documentation):
Note that only IE version 8 and newer can understand this registry value and, of course, the maximal value understood by it is limited by version of IE installed on the system. E.g. asking IE 8 to behave as IE 10 won't work.
Further recommendations:
IWebBrowser2
instances to the given compatibility mode, or none of them.These standard messages are handled by the control:
CCM_GETUNICODEFORMAT
CCM_SETNOTIFYWINDOW
CCM_SETUNICODEFORMAT
These standard notifications are sent by the control:
NM_OUTOFMEMORY
Data Structures | |
struct | MC_HMCALLSCRIPTFUNCW |
Structure for message MC_HM_CALLSCRIPTFUNCW request (Unicode variant). More... | |
struct | MC_HMCALLSCRIPTFUNCA |
Structure for message MC_HM_CALLSCRIPTFUNCA request (ANSI variant). More... | |
struct | MC_HMCALLSCRIPTFUNCEX |
Structure for message MC_HM_CALLSCRIPTFUNCEX. More... | |
struct | MC_NMHTMLURLW |
Structure used for notifications with URL parameter (Unicode variant). More... | |
struct | MC_NMHTMLURLA |
Structure used for notifications with URL parameter (ANSI variant). More... | |
struct | MC_NMHTMLPROGRESS |
Structure used for notification about download progress. More... | |
struct | MC_NMHTMLTEXTW |
Structure used for notifications with textual parameter (Unicode variant). More... | |
struct | MC_NMHTMLTEXTA |
Structure used for notifications with textual parameter (ANSI variant). More... | |
struct | MC_NMHTMLHISTORY |
Structure used for notification about history navigation. More... | |
struct | MC_NMHTTPERRORW |
Structure used for notification about HTTP error (Unicode variant). More... | |
struct | MC_NMHTTPERRORA |
Structure used for notification about HTTP error (ANSI variant). More... | |
Initialization Functions | |
BOOL | mcHtml_Initialize (void) |
void | mcHtml_Terminate (void) |
Window Class | |
#define | MC_WC_HTMLW L"mCtrl.html" |
#define | MC_WC_HTMLA "mCtrl.html" |
Control Styles | |
#define | MC_HS_NOCONTEXTMENU 0x0001 |
Disables context menu. More... | |
Control Messages | |
#define | MC_HM_GOTOURLW (MC_HM_FIRST + 10) |
Displays a document specified by the given URL (Unicode variant). More... | |
#define | MC_HM_GOTOURLA (MC_HM_FIRST + 11) |
Displays a document specified by the given URL (ANSI variant). More... | |
#define | MC_HM_SETTAGCONTENTSW (MC_HM_FIRST + 12) |
Set contents of the HTML tag with given attribute "id" (Unicode variant). More... | |
#define | MC_HM_SETTAGCONTENTSA (MC_HM_FIRST + 13) |
Set contents of the HTML tag with given attribute "id" (ANSI variant). More... | |
#define | MC_HM_GOBACK (MC_HM_FIRST + 14) |
Navigates the HTML control back or forward in history. More... | |
#define | MC_HM_CANBACK (MC_HM_FIRST + 15) |
Tests whether going back or forward in history is possible. More... | |
#define | MC_HM_CALLSCRIPTFUNCW (MC_HM_FIRST + 16) |
Calls script function in HTML page (Unicode variant). More... | |
#define | MC_HM_CALLSCRIPTFUNCA (MC_HM_FIRST + 17) |
Calls script function in HTML page (ANSI variant). More... | |
#define | MC_HM_CALLSCRIPTFUNCEX (MC_HM_FIRST + 18) |
Call script function in HTML page. More... | |
Control Notifications | |
#define | MC_HN_APPLINK (MC_HN_FIRST + 0) |
Fired when the browser should navigates to to URL with application protocol. More... | |
#define | MC_HN_DOCUMENTCOMPLETE (MC_HN_FIRST + 1) |
Fired when loading of a document is complete. More... | |
#define | MC_HN_PROGRESS (MC_HN_FIRST + 2) |
Fired to inform application about download progress. More... | |
#define | MC_HN_STATUSTEXT (MC_HN_FIRST + 3) |
Fired when the browser would like to change status text. More... | |
#define | MC_HN_TITLETEXT (MC_HN_FIRST + 4) |
Fired when the browser changes title of the HTML page. More... | |
#define | MC_HN_HISTORY (MC_HN_FIRST + 5) |
Fired when possibility of going back or forward in history changes. More... | |
#define | MC_HN_NEWWINDOW (MC_HN_FIRST + 6) |
Fired when the browser would open a new window. More... | |
#define | MC_HN_HTTPERROR (MC_HN_FIRST + 7) |
Fired to indicate that HTTP error has occurred. More... | |
#define | MC_HN_BEFORENAVIGATE (MC_HN_FIRST + 8) |
Fired before the browser navigates to a new URL. More... | |
Unicode Resolution | |
#define | MC_WC_HTML MCTRL_NAME_AW(MC_WC_HTML) |
#define | MC_HM_GOTOURL MCTRL_NAME_AW(MC_HM_GOTOURL) |
#define | MC_HM_SETTAGCONTENTS MCTRL_NAME_AW(MC_HM_SETTAGCONTENTS) |
#define | MC_HM_CALLSCRIPTFUNC MCTRL_NAME_AW(MC_HM_CALLSCRIPTFUNC) |
#define | MC_NMHTMLURL MCTRL_NAME_AW(MC_NMHTMLURL) |
#define | MC_NMHTMLTEXT MCTRL_NAME_AW(MC_NMHTMLTEXT) |
#define | MC_NMHTTPERROR MCTRL_NAME_AW(MC_NMHTTPERROR) |
#define | MC_HMCALLSCRIPTFUNC MCTRL_NAME_AW(MC_HMCALLSCRIPTFUNC) |
struct MC_HMCALLSCRIPTFUNCW |
Structure for message MC_HM_CALLSCRIPTFUNCW request (Unicode variant).
struct MC_HMCALLSCRIPTFUNCA |
Structure for message MC_HM_CALLSCRIPTFUNCA request (ANSI variant).
struct MC_HMCALLSCRIPTFUNCEX |
Structure for message MC_HM_CALLSCRIPTFUNCEX.
struct MC_NMHTMLURLW |
Structure used for notifications with URL parameter (Unicode variant).
Data Fields | ||
---|---|---|
NMHDR | hdr |
Standard notification structure header. |
LPCWSTR | pszUrl |
String representation of the URL. |
struct MC_NMHTMLURLA |
Structure used for notifications with URL parameter (ANSI variant).
Data Fields | ||
---|---|---|
NMHDR | hdr |
Standard notification structure header. |
LPCSTR | pszUrl |
String representation of the URL. |
struct MC_NMHTMLPROGRESS |
Structure used for notification about download progress.
Data Fields | ||
---|---|---|
NMHDR | hdr |
Standard notification structure header. |
LONG | lProgress |
Current progress. |
LONG | lProgressMax |
Progress maximum. |
struct MC_NMHTMLTEXTW |
Structure used for notifications with textual parameter (Unicode variant).
Data Fields | ||
---|---|---|
NMHDR | hdr |
Standard notification structure header. |
LPCWSTR | pszText |
The string. |
struct MC_NMHTMLTEXTA |
Structure used for notifications with textual parameter (ANSI variant).
Data Fields | ||
---|---|---|
NMHDR | hdr |
Standard notification structure header. |
LPCSTR | pszText |
The string. |
struct MC_NMHTMLHISTORY |
Structure used for notification about history navigation.
Data Fields | ||
---|---|---|
NMHDR | hdr |
Standard notification structure header. |
BOOL | bCanBack |
|
BOOL | bCanForward |
|
struct MC_NMHTTPERRORW |
Structure used for notification about HTTP error (Unicode variant).
Data Fields | ||
---|---|---|
NMHDR | hdr |
Standard notification structure header. |
LPCWSTR | pszUrl |
String representation of the URL. |
int | iStatus |
HTTP status code. |
struct MC_NMHTTPERRORA |
Structure used for notification about HTTP error (ANSI variant).
Data Fields | ||
---|---|---|
NMHDR | hdr |
Standard notification structure header. |
LPCSTR | pszUrl |
String representation of the URL. |
int | iStatus |
HTTP status code. |
#define MC_WC_HTMLW L"mCtrl.html" |
Window class name (Unicode variant).
#define MC_WC_HTMLA "mCtrl.html" |
Window class name (ANSI variant).
#define MC_HS_NOCONTEXTMENU 0x0001 |
Disables context menu.
#define MC_HM_GOTOURLW (MC_HM_FIRST + 10) |
Displays a document specified by the given URL (Unicode variant).
wParam | Reserved, set to zero. | |
[in] | lParam | (const WCHAR* ) The URL. |
BOOL
) TRUE
on success, FALSE
otherwise. #define MC_HM_GOTOURLA (MC_HM_FIRST + 11) |
Displays a document specified by the given URL (ANSI variant).
wParam | Reserved, set to zero. | |
[in] | lParam | (const char* ) The URL. |
BOOL
) TRUE
on success, FALSE
otherwise. #define MC_HM_SETTAGCONTENTSW (MC_HM_FIRST + 12) |
Set contents of the HTML tag with given attribute "id"
(Unicode variant).
[in] | wParam | (const WCHAR* ) ID of the tag. |
[in] | lParam | (const WCHAR* ) New contents of the tag. |
BOOL
) TRUE
on success, FALSE
otherwise. #define MC_HM_SETTAGCONTENTSA (MC_HM_FIRST + 13) |
Set contents of the HTML tag with given attribute "id"
(ANSI variant).
[in] | wParam | (const char* ) ID of the tag. |
[in] | lParam | (const char* ) New contents of the tag. |
BOOL
) TRUE
on success, FALSE
otherwise. #define MC_HM_GOBACK (MC_HM_FIRST + 14) |
Navigates the HTML control back or forward in history.
[in] | wParam | (BOOL ) Set to TRUE to go back in history or FALSE to go forward. |
lParam | Reserved, set to zero. |
BOOL
) TRUE
on success, FALSE
otherwise. #define MC_HM_CANBACK (MC_HM_FIRST + 15) |
Tests whether going back or forward in history is possible.
[in] | wParam | (BOOL ) Set to TRUE to test going back in history or FALSE to going forward. |
lParam | Reserved, set to zero. |
BOOL
) TRUE
if can go back or forward respectively, FALSE
otherwise. #define MC_HM_CALLSCRIPTFUNCW (MC_HM_FIRST + 16) |
Calls script function in HTML page (Unicode variant).
[in] | wParam | (LPCWSTR* ) Name of the function to call. |
[in,out] | lParam | (MC_HMCALLSCRIPTFUNCW*) Pointer to a function specifying function arguments and receiving the return value. May be NULL if the function takes no arguments and returns no value (or the return value is ignored). |
BOOL
) TRUE
on success, FALSE
otherwise. #define MC_HM_CALLSCRIPTFUNCA (MC_HM_FIRST + 17) |
Calls script function in HTML page (ANSI variant).
[in] | wParam | (LPCSTR* ) Name of the function to call. |
[in,out] | lParam | (MC_HMCALLSCRIPTFUNCA*) Pointer to a function specifying function arguments and receiving the return value. May be NULL if the function takes no arguments and returns no value (or the return value is ignored). |
BOOL
) TRUE
on success, FALSE
otherwise. #define MC_HM_CALLSCRIPTFUNCEX (MC_HM_FIRST + 18) |
Call script function in HTML page.
wParam | Reserved, set to zero. | |
[in,out] | lParam | (MC_HMCALLSCRIPTFUNCEX*) Pointer to structure specifying function to call, arguments to pass, and receiving the return value. |
HRESULT
) S_OK
if the call was invokes successfully, otherwise the HRESULT
code of the error. #define MC_HN_APPLINK (MC_HN_FIRST + 0) |
Fired when the browser should navigates to to URL with application protocol.
[in] | wParam | (int ) Id of the control sending the notification. |
[in] | lParam | (MC_NMHTMLURL*) Pointer to a structure specifying details about the URL. |
#define MC_HN_DOCUMENTCOMPLETE (MC_HN_FIRST + 1) |
Fired when loading of a document is complete.
[in] | wParam | (int ) Id of the control sending the notification. |
[in] | lParam | (MC_NMHTMLURL*) Pointer to a structure specifying details about the URL. |
#define MC_HN_PROGRESS (MC_HN_FIRST + 2) |
Fired to inform application about download progress.
This allows example for example to show a progress indicator.
[in] | wParam | (int ) Id of the control sending the notification. |
[in] | lParam | (MC_NMHTMLPROGRESS*) Pointer to a structure specifying details about the progress. |
#define MC_HN_STATUSTEXT (MC_HN_FIRST + 3) |
Fired when the browser would like to change status text.
IE usually shows this text in its status bar.
[in] | wParam | (int ) Id of the control sending the notification. |
[in] | lParam | (MC_NMHTMLTEXT*) Pointer to a structure specifying the text. |
#define MC_HN_TITLETEXT (MC_HN_FIRST + 4) |
Fired when the browser changes title of the HTML page.
IE usually shows this in window caption or tab label.
[in] | wParam | (int ) Id of the control sending the notification. |
[in] | lParam | (MC_NMHTMLTEXT*) Pointer to a structure specifying the text. |
#define MC_HN_HISTORY (MC_HN_FIRST + 5) |
Fired when possibility of going back or forward in history changes.
This allow application to enable or disable the corresponding command buttons.
[in] | wParam | (int ) Id of the control sending the notification. |
[in] | lParam | (MC_NMHTMLURL*) Pointer to a structure specifying the text. |
#define MC_HN_NEWWINDOW (MC_HN_FIRST + 6) |
Fired when the browser would open a new window.
This happens for example if user clicks on a link while holding SHIFT
.
MC_NMHTMLURL::pszUrl
is URL to be opened in the new window. Note however that prior to Windows XP SP2, the URL is not filled.
[in] | wParam | (int ) Id of the control sending the notification. |
[in] | lParam | (MC_NMHTMLURL*) Pointer to a structure specifying details about the URL. |
#define MC_HN_HTTPERROR (MC_HN_FIRST + 7) |
Fired to indicate that HTTP error has occurred.
[in] | wParam | (int ) Id of the control sending the notification. |
[in] | lParam | (MC_NMHTTPERROR*) Pointer to a structure specifying details about the error. |
#define MC_HN_BEFORENAVIGATE (MC_HN_FIRST + 8) |
Fired before the browser navigates to a new URL.
Note that this is sent before (MC_HN_APPLINK), and returning non-zero will prevent (MC_HN_APPLINK) from being sent.
[in] | wParam | (int ) Id of the control sending the notification. |
[in] | lParam | (MC_NMHTMLURL*) Pointer to a structure specifying details about the URL. |
#define MC_WC_HTML MCTRL_NAME_AW(MC_WC_HTML) |
Unicode-resolution alias.
#define MC_HM_GOTOURL MCTRL_NAME_AW(MC_HM_GOTOURL) |
Unicode-resolution alias.
#define MC_HM_SETTAGCONTENTS MCTRL_NAME_AW(MC_HM_SETTAGCONTENTS) |
Unicode-resolution alias.
#define MC_HM_CALLSCRIPTFUNC MCTRL_NAME_AW(MC_HM_CALLSCRIPTFUNC) |
Unicode-resolution alias.
#define MC_NMHTMLURL MCTRL_NAME_AW(MC_NMHTMLURL) |
Unicode-resolution alias.
#define MC_NMHTMLTEXT MCTRL_NAME_AW(MC_NMHTMLTEXT) |
Unicode-resolution alias.
#define MC_NMHTTPERROR MCTRL_NAME_AW(MC_NMHTTPERROR) |
Unicode-resolution alias.
#define MC_HMCALLSCRIPTFUNC MCTRL_NAME_AW(MC_HMCALLSCRIPTFUNC) |
Unicode-resolution alias.
BOOL mcHtml_Initialize | ( | void | ) |
Registers window class of the control.
TRUE
on success, FALSE
on failure. void mcHtml_Terminate | ( | void | ) |
Unregisters window class of the control.