2025-11-28 00:35:46 +09:00

432 lines
14 KiB
C

/**********************************************************************/
/* */
/* MULTIUI.C */
/* */
/* Copyright (c) 1995 - 2000 Microsoft Corporation */
/* */
/**********************************************************************/
#include <windows.h>
#include <imm.h>
#include <strsafe.h>
#include <stdio.h>
#include "resource.h"
#include "multiui.h"
/**********************************************************************/
/* */
/* WinMain (HANDLE, HANDLE, LPSTR, int) */
/* */
/**********************************************************************/
int APIENTRY WinMain (
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
INT nCmdShow)
{
MSG msg = {0};
BOOL bSuccess = TRUE;
BOOL bRet = FALSE;
if (!InitApplication(hInstance))
{
bSuccess = FALSE;
goto exit_func;
}
if (!InitInstance(hInstance, nCmdShow))
{
bSuccess = FALSE;
goto exit_func;
}
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
bSuccess = FALSE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
exit_func:
if (bSuccess)
{
return (int)(msg.wParam);
}
else
{
return 0;
}
}
/**********************************************************************/
/* */
/* InitApplication (HANDLE) */
/* */
/**********************************************************************/
BOOL InitApplication (
HANDLE hInstance)
{
WNDCLASS wc = {0};
BOOL bSuccess = TRUE;
wc.lpfnWndProc = (WNDPROC)MainWndProc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance,TEXT("MyIcon"));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = TEXT("MultiUiMenu");
wc.lpszClassName = TEXT("MultiUiWClass");
if (! RegisterClass (&wc))
{
bSuccess = FALSE;
goto exit_func;
}
wc.style = CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)NoUINoIMCWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = WNDEXTRA_NOUINOIMC;
wc.hInstance = hInstance;
wc.hIcon = 0;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("NoUINoIMCWClass");
if (! RegisterClass (&wc))
{
bSuccess = FALSE;
goto exit_func;
}
wc.style = CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)NoUIOwnIMCWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = WNDEXTRA_NOUIOWNIMC;
wc.hInstance = hInstance;
wc.hIcon = 0;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("NoUIOwnIMCWClass");
if (! RegisterClass (&wc))
{
bSuccess = FALSE;
goto exit_func;
}
wc.style = CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)OwnUIOwnIMCWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = WNDEXTRA_OWNUIOWNIMC;
wc.hInstance = hInstance;
wc.hIcon = 0;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("OwnUIOwnIMCWClass");
if (! RegisterClass (&wc))
{
bSuccess = FALSE;
goto exit_func;
}
exit_func:
return bSuccess;
}
/**********************************************************************/
/* */
/* InitInstance (HANDLE, int) */
/* */
/**********************************************************************/
BOOL InitInstance (
HANDLE hInstance,
int nCmdShow)
{
RECT rc = {0};
int iDesc = 0;
HDC hIC = NULL;
TEXTMETRIC tm = {0};
HFONT hFont = GetDefaultGUIFont();
BOOL bSuccess = TRUE;
TCHAR szTitle[20] = TEXT("MultiUi TestTool");
hInst = hInstance;
hWndMain = CreateWindow(TEXT("MultiUiWClass"), szTitle,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL);
if (!hWndMain)
{
bSuccess = FALSE;
goto exit_func;
}
GetClientRect(hWndMain,&rc);
rc.right /= 2;
rc.bottom /= 3;
hIC = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL);
SelectObject(hIC, hFont);
GetTextMetrics(hIC,&tm);
if (rc.bottom >= tm.tmHeight)
{
iDesc = tm.tmHeight + tm.tmExternalLeading;
}
DeleteDC(hIC);
if (!(hWndDef1 = CreateWindowEx(
WS_EX_CLIENTEDGE, TEXT("NoUINoIMCWClass"), TEXT(""),
WS_CHILD | WS_VISIBLE,
rc.left, rc.top + iDesc, rc.right, rc.bottom - iDesc,
hWndMain, NULL, hInstance, NULL)))
{
bSuccess = FALSE;
goto exit_func;
}
if (!(hWndDef2 = CreateWindowEx(
WS_EX_CLIENTEDGE, TEXT("NoUINoIMCWClass"), TEXT(""),
WS_CHILD | WS_VISIBLE,
rc.right, rc.top + iDesc, rc.right, rc.bottom - iDesc,
hWndMain, NULL, hInstance, NULL)))
{
bSuccess = FALSE;
goto exit_func;
}
if (!(hWndIMC1 = CreateWindowEx(
WS_EX_CLIENTEDGE, TEXT("NoUIOwnIMCWClass"), TEXT(""),
WS_CHILD | WS_VISIBLE,
rc.left, rc.bottom + iDesc, rc.right, rc.bottom - iDesc,
hWndMain, NULL, hInstance, NULL)))
{
bSuccess = FALSE;
goto exit_func;
}
if (!(hWndIMC2 = CreateWindowEx(
WS_EX_CLIENTEDGE, TEXT("NoUIOwnIMCWClass"), TEXT(""),
WS_CHILD | WS_VISIBLE,
rc.right, rc.bottom + iDesc, rc.right, rc.bottom - iDesc,
hWndMain, NULL, hInstance, NULL)))
{
bSuccess = FALSE;
goto exit_func;
}
if (!(hWndIMCUI1 = CreateWindowEx(
WS_EX_CLIENTEDGE, TEXT("OwnUIOwnIMCWClass"), TEXT(""),
WS_CHILD | WS_VISIBLE,
rc.left, rc.bottom * 2 + iDesc, rc.right, rc.bottom - iDesc,
hWndMain, NULL, hInstance, NULL)))
{
bSuccess = FALSE;
goto exit_func;
}
if (!(hWndIMCUI2 = CreateWindowEx(
WS_EX_CLIENTEDGE, TEXT("OwnUIOwnIMCWClass"), TEXT(""),
WS_CHILD | WS_VISIBLE,
rc.right, rc.bottom * 2 + iDesc, rc.right, rc.bottom - iDesc,
hWndMain, NULL, hInstance, NULL)))
{
bSuccess = FALSE;
goto exit_func;
}
/* display each windows */
ShowWindow (hWndMain, nCmdShow);
UpdateWindow (hWndMain);
exit_func:
return bSuccess;
}
/**********************************************************************/
/* */
/* MainWndProc (HWND, UINT, WPARAM, LPARAM) */
/* */
/**********************************************************************/
LRESULT CALLBACK MainWndProc (
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
PAINTSTRUCT ps = {0};
HDC hDC = NULL;
RECT rc = {0};
int iDesc = 0;
HDC hIC = NULL;
TEXTMETRIC tm = {0};
HFONT hFont = NULL;
HFONT hOldFont = NULL;
HIMC hIMC = NULL;
HWND hIMEWnd = NULL;
TCHAR szDesc[128] = {0};
BOOL bRetDWP = FALSE;
switch (message)
{
case WM_CREATE:
break;
case WM_SIZE:
switch (wParam)
{
case SIZENORMAL: /* fall-through */
case SIZEFULLSCREEN:
GetClientRect(hWndMain,&rc);
rc.right /= 2;
rc.bottom /= 3;
hFont = GetDefaultGUIFont();
hIC = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL);
SelectObject(hIC, hFont);
GetTextMetrics(hIC,&tm);
iDesc = 0;
if (rc.bottom >= tm.tmHeight)
{
iDesc = tm.tmHeight + tm.tmExternalLeading;
}
DeleteDC(hIC);
MoveWindow(hWndDef1,
rc.left,rc.top + iDesc,
rc.right,rc.bottom - iDesc,TRUE);
MoveWindow(hWndDef2,
rc.right,rc.top + iDesc,
rc.right,rc.bottom - iDesc,TRUE);
MoveWindow(hWndIMC1,
rc.left,rc.bottom + iDesc,
rc.right,rc.bottom - iDesc,TRUE);
MoveWindow(hWndIMC2,
rc.right,rc.bottom + iDesc,
rc.right,rc.bottom - iDesc,TRUE);
MoveWindow(hWndIMCUI1,
rc.left,rc.bottom * 2 + iDesc,
rc.right,rc.bottom - iDesc,TRUE);
MoveWindow(hWndIMCUI2,
rc.right,rc.bottom * 2 + iDesc,
rc.right,rc.bottom - iDesc,TRUE);
InvalidateRect(hWnd,NULL,TRUE);
break;
case SIZEICONIC:
bRetDWP = TRUE;
goto exit_func;
break;
}
break;
case WM_PAINT:
hDC = BeginPaint (hWnd, &ps);
hFont = GetDefaultGUIFont();
hOldFont = SelectObject(hDC, hFont);
GetClientRect(hWndMain,&rc);
rc.right /= 2;
rc.bottom /= 3;
StringCchPrintf(szDesc, sizeof(szDesc)/sizeof(szDesc[0]) - 1,
TEXT("%08lX Default IMC and Default IME window"),
(DWORD_PTR)hWndDef1);
TextOut (hDC, rc.left,rc.top, szDesc, lstrlen(szDesc));
StringCchPrintf (szDesc, sizeof(szDesc)/sizeof(szDesc[0]) - 1,
TEXT("%08lX Default IMC and Default IME window"),
(DWORD_PTR)hWndDef2);
TextOut (hDC, rc.right, rc.top, szDesc, lstrlen(szDesc));
hIMC = (HIMC)GetWindowLongPtr(hWndIMC1,MYGWL_IMC);
StringCchPrintf (szDesc, sizeof(szDesc)/sizeof(szDesc[0]) - 1,
TEXT("%08lX IMC[%08lX] and Default IME window"),
(DWORD_PTR)hWndIMC1, (DWORD_PTR)hIMC);
TextOut (hDC, rc.left, rc.bottom, szDesc, lstrlen(szDesc));
hIMC = (HIMC)GetWindowLongPtr(hWndIMC2,MYGWL_IMC);
StringCchPrintf (szDesc, sizeof(szDesc)/sizeof(szDesc[0]) - 1,
TEXT("%08lX IMC[%08lX] and Default IME window"),
(DWORD_PTR)hWndIMC2, (DWORD_PTR)hIMC);
TextOut (hDC, rc.right, rc.bottom, szDesc, lstrlen(szDesc));
hIMC = (HIMC)GetWindowLongPtr(hWndIMCUI1,MYGWL_IMC);
hIMEWnd = (HWND)GetWindowLongPtr(hWndIMCUI1,MYGWL_IMEWND);
StringCchPrintf (szDesc, sizeof(szDesc)/sizeof(szDesc[0]) - 1,
TEXT("%08lX IMC[%08lX] and IME window[%08lX]"),
(DWORD_PTR)hWndIMCUI1, (DWORD_PTR)hIMC ,(DWORD_PTR)hIMEWnd);
TextOut (hDC, rc.left, rc.bottom * 2, szDesc, lstrlen(szDesc));
hIMC = (HIMC)GetWindowLongPtr(hWndIMCUI2,MYGWL_IMC);
hIMEWnd = (HWND)GetWindowLongPtr(hWndIMCUI2,MYGWL_IMEWND);
StringCchPrintf (szDesc, sizeof(szDesc)/sizeof(szDesc[0]) - 1,
TEXT("%08lX IMC[%08lX] and IME window[%08lX]"),
(DWORD_PTR)hWndIMCUI2, (DWORD_PTR)hIMC ,(DWORD_PTR)hIMEWnd);
TextOut (hDC, rc.right, rc.bottom * 2, szDesc, lstrlen(szDesc));
SelectObject(hDC, hOldFont);
EndPaint (hWnd, &ps);
break;
case WM_COMMAND:
switch(WMCOMMANDWPARAM(wParam))
{
case IDM_ABOUT:
DialogBox(hInst, TEXT("ABOUTBOX"), hWnd, (DLGPROC)AboutDlg);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
bRetDWP = TRUE;
goto exit_func;
}
exit_func:
if (bRetDWP)
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
else
{
return 0L;
}
}