mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
325 lines
7.5 KiB
C++
325 lines
7.5 KiB
C++
// XPTCInvoke_Testing.cpp : Defines the entry point for the application.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "XPTCInvoke_Testing.h"
|
|
#include <commctrl.h>
|
|
#include <aygshell.h>
|
|
#include <sipapi.h>
|
|
|
|
#define MAX_LOADSTRING 100
|
|
|
|
// Global Variables:
|
|
HINSTANCE g_hInst; // The current instance
|
|
HWND g_hwndCB; // The command bar handle
|
|
|
|
static SHACTIVATEINFO s_sai;
|
|
|
|
// Forward declarations of functions included in this code module:
|
|
ATOM MyRegisterClass (HINSTANCE, LPTSTR);
|
|
BOOL InitInstance (HINSTANCE, int);
|
|
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
|
|
LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM);
|
|
HWND CreateRpCommandBar(HWND);
|
|
|
|
|
|
VOID
|
|
WINAPI
|
|
OutputDebugStringW(
|
|
LPCWSTR lpOutputString
|
|
);
|
|
|
|
|
|
|
|
|
|
int main();
|
|
|
|
|
|
|
|
|
|
|
|
int WINAPI WinMain( HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
LPTSTR lpCmdLine,
|
|
int nCmdShow)
|
|
{
|
|
MSG msg;
|
|
HACCEL hAccelTable;
|
|
|
|
// Perform application initialization:
|
|
if (!InitInstance (hInstance, nCmdShow))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_XPTCINVOKE_TESTING);
|
|
|
|
// Main message loop:
|
|
while (GetMessage(&msg, NULL, 0, 0))
|
|
{
|
|
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
|
|
return msg.wParam;
|
|
}
|
|
|
|
//
|
|
// FUNCTION: MyRegisterClass()
|
|
//
|
|
// PURPOSE: Registers the window class.
|
|
//
|
|
// COMMENTS:
|
|
//
|
|
// It is important to call this function so that the application
|
|
// will get 'well formed' small icons associated with it.
|
|
//
|
|
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
|
|
{
|
|
WNDCLASS wc;
|
|
|
|
wc.style = CS_HREDRAW | CS_VREDRAW;
|
|
wc.lpfnWndProc = (WNDPROC) WndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = hInstance;
|
|
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_XPTCINVOKE_TESTING));
|
|
wc.hCursor = 0;
|
|
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
|
|
wc.lpszMenuName = 0;
|
|
wc.lpszClassName = szWindowClass;
|
|
|
|
return RegisterClass(&wc);
|
|
}
|
|
|
|
//
|
|
// FUNCTION: InitInstance(HANDLE, int)
|
|
//
|
|
// PURPOSE: Saves instance handle and creates main window
|
|
//
|
|
// COMMENTS:
|
|
//
|
|
// In this function, we save the instance handle in a global variable and
|
|
// create and display the main program window.
|
|
//
|
|
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
|
|
{
|
|
HWND hWnd = NULL;
|
|
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
|
|
TCHAR szWindowClass[MAX_LOADSTRING]; // The window class name
|
|
|
|
g_hInst = hInstance; // Store instance handle in our global variable
|
|
// Initialize global strings
|
|
LoadString(hInstance, IDC_XPTCINVOKE_TESTING, szWindowClass, MAX_LOADSTRING);
|
|
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
|
|
|
|
//If it is already running, then focus on the window
|
|
hWnd = FindWindow(szWindowClass, szTitle);
|
|
if (hWnd)
|
|
{
|
|
// set focus to foremost child window
|
|
// The "| 0x01" is used to bring any owned windows to the foreground and
|
|
// activate them.
|
|
SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
|
|
return 0;
|
|
}
|
|
|
|
MyRegisterClass(hInstance, szWindowClass);
|
|
|
|
hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
|
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
|
|
if (!hWnd)
|
|
{
|
|
return FALSE;
|
|
}
|
|
//When the main window is created using CW_USEDEFAULT the height of the menubar (if one
|
|
// is created is not taken into account). So we resize the window after creating it
|
|
// if a menubar is present
|
|
if (g_hwndCB)
|
|
{
|
|
RECT rc;
|
|
RECT rcMenuBar;
|
|
|
|
GetWindowRect(hWnd, &rc);
|
|
GetWindowRect(g_hwndCB, &rcMenuBar);
|
|
rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
|
|
|
|
MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE);
|
|
}
|
|
|
|
|
|
ShowWindow(hWnd, nCmdShow);
|
|
UpdateWindow(hWnd);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
|
|
//
|
|
// PURPOSE: Processes messages for the main window.
|
|
//
|
|
// WM_COMMAND - process the application menu
|
|
// WM_PAINT - Paint the main window
|
|
// WM_DESTROY - post a quit message and return
|
|
//
|
|
//
|
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
HDC hdc;
|
|
int wmId, wmEvent;
|
|
PAINTSTRUCT ps;
|
|
TCHAR szHello[MAX_LOADSTRING];
|
|
|
|
TCHAR szMsgDbg[1000];
|
|
|
|
wsprintf(szMsgDbg, TEXT("rcvd msg #%d (0x%04X)\n"), message, message);
|
|
OutputDebugStringW(szMsgDbg);
|
|
|
|
switch (message)
|
|
{
|
|
case WM_COMMAND:
|
|
wmId = LOWORD(wParam);
|
|
wmEvent = HIWORD(wParam);
|
|
// Parse the menu selections:
|
|
switch (wmId)
|
|
{
|
|
case IDM_HELP_ABOUT:
|
|
DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
|
|
break;
|
|
case IDM_TEST:
|
|
main();
|
|
break;
|
|
case IDOK:
|
|
SendMessage (hWnd, WM_CLOSE, 0, 0);
|
|
break;
|
|
default:
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
}
|
|
break;
|
|
case WM_KILLFOCUS:
|
|
SendMessage (hWnd, WM_CLOSE, 0, 0);
|
|
break;
|
|
case WM_CREATE:
|
|
g_hwndCB = CreateRpCommandBar(hWnd);
|
|
// Initialize the shell activate info structure
|
|
memset (&s_sai, 0, sizeof (s_sai));
|
|
s_sai.cbSize = sizeof (s_sai);
|
|
break;
|
|
case WM_PAINT:
|
|
RECT rt;
|
|
hdc = BeginPaint(hWnd, &ps);
|
|
GetClientRect(hWnd, &rt);
|
|
LoadString(g_hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
|
|
DrawText(hdc, szHello, _tcslen(szHello), &rt,
|
|
DT_SINGLELINE | DT_VCENTER | DT_CENTER);
|
|
EndPaint(hWnd, &ps);
|
|
break;
|
|
case WM_DESTROY:
|
|
CommandBar_Destroy(g_hwndCB);
|
|
PostQuitMessage(0);
|
|
break;
|
|
case WM_CLOSE:
|
|
DestroyWindow(hWnd);
|
|
break;
|
|
case WM_ACTIVATE:
|
|
// Notify shell of our activate message
|
|
SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);
|
|
break;
|
|
case WM_SETTINGCHANGE:
|
|
SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
|
|
break;
|
|
default:
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
HWND CreateRpCommandBar(HWND hwnd)
|
|
{
|
|
SHMENUBARINFO mbi;
|
|
|
|
memset(&mbi, 0, sizeof(SHMENUBARINFO));
|
|
mbi.cbSize = sizeof(SHMENUBARINFO);
|
|
mbi.hwndParent = hwnd;
|
|
mbi.nToolBarId = IDM_MENU;
|
|
mbi.hInstRes = g_hInst;
|
|
mbi.nBmpId = 0;
|
|
mbi.cBmpImages = 0;
|
|
|
|
if (!SHCreateMenuBar(&mbi))
|
|
return NULL;
|
|
|
|
return mbi.hwndMB;
|
|
}
|
|
|
|
// Mesage handler for the About box.
|
|
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
SHINITDLGINFO shidi;
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
// Create a Done button and size it.
|
|
shidi.dwMask = SHIDIM_FLAGS;
|
|
shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN;
|
|
shidi.hDlg = hDlg;
|
|
SHInitDialog(&shidi);
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
if (LOWORD(wParam) == IDOK)
|
|
{
|
|
EndDialog(hDlg, LOWORD(wParam));
|
|
return TRUE;
|
|
}
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#define MAX_CHARS_IN_VARIABLE_STRING 5120
|
|
|
|
|
|
|
|
void MyOutputFunction(const char *str, ...)
|
|
{
|
|
char buf[MAX_CHARS_IN_VARIABLE_STRING];
|
|
|
|
TCHAR tBuf[MAX_CHARS_IN_VARIABLE_STRING];
|
|
|
|
va_list ptr;
|
|
va_start(ptr,str);
|
|
vsprintf(buf,str,ptr);
|
|
|
|
mbstowcs(tBuf, buf, MAX_CHARS_IN_VARIABLE_STRING);
|
|
|
|
OutputDebugString(tBuf);
|
|
}
|
|
|
|
|
|
|
|
int printf(const char *str, ...)
|
|
{
|
|
char buf[MAX_CHARS_IN_VARIABLE_STRING];
|
|
|
|
TCHAR tBuf[MAX_CHARS_IN_VARIABLE_STRING];
|
|
|
|
va_list ptr;
|
|
va_start(ptr,str);
|
|
vsprintf(buf,str,ptr);
|
|
|
|
mbstowcs(tBuf, buf, MAX_CHARS_IN_VARIABLE_STRING);
|
|
|
|
OutputDebugString(tBuf);
|
|
|
|
return 1;
|
|
} |