⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 numpanel.cpp

📁 一个好的输入法源代码
💻 CPP
字号:
//======================================================================// NumPanel - A Windows CE example input method//// Written for the book Programming Windows CE// Copyright (C) 1998 Douglas Boling//======================================================================#include <windows.h>                 // For all that Windows stuff#include <commctrl.h>                // Command bar includes#define INITGUID#include <initguid.h>#include <coguid.h>#include <aygshell.h>                // Palm-size PC shell includes#include <sip.h>                     // SIP includes#include "NumPanel.h"                // Local program includes#include "NPWnd.h"                   // My IM window includesHINSTANCE hInst;                     // DLL instance handlelong g_DllCnt = 0;                   // Global DLL reference count// Replace this GUID with your own!static const TCHAR szCLSIDNumPanel[] = TEXT ("{C915FE81-24C0-11d2-93F7-204C4F4F5020}");static const GUID CLSID_NumPanel = {0x2B06F7A1, 0x088E, 0x11d2, {0x93,0xf1,0x20,0x4c,0x4f,0x4f,0x50,0x20}};static const TCHAR szFriendlyName[] = TEXT ("Numeric Keypad");//======================================================================// DllMain - DLL initialization entry point//
BOOL WINAPI DllMain (HANDLE hinstDLL, DWORD dwReason,                      LPVOID lpvReserved) {    hInst = (HINSTANCE)hinstDLL;    return TRUE;}//======================================================================// DllGetClassObject - Exported function called to get pointer to // Class factory object//STDAPI DllGetClassObject (REFCLSID rclsid, REFIID riid, LPVOID *ppv) {    MyClassFactory *pcf;    HRESULT hr;
    // See if caller wants us...    if (IsEqualCLSID (rclsid, CLSID_NumPanel)) {        // Create IClassFactory object.        pcf = new MyClassFactory();        if (pcf == NULL)            return E_OUTOFMEMORY;        // Call class factory's query interface method.        hr = pcf->QueryInterface (riid, ppv);        // This will cause an obj delete unless interface found        pcf->Release();        return hr;    }    return CLASS_E_CLASSNOTAVAILABLE;}//======================================================================// DllCanUnloadNow - Exported function called when DLL can unload//STDAPI DllCanUnloadNow () {    if (g_DllCnt)        return S_FALSE;    return S_OK;}//======================================================================// DllRegisterServer - Exported function called to register the server//STDAPI DllRegisterServer () {    TCHAR szName[MAX_PATH+2];    DWORD dwDisp;    HKEY hKey, hSubKey;    INT rc, i;    GetModuleFileName (hInst, szName, sizeof (szName));    // Open the key.    rc = RegCreateKeyEx (HKEY_CLASSES_ROOT, szCLSIDNumPanel, 0,                         TEXT (""), 0, 0, NULL, &hKey, &dwDisp);    if (rc != ERROR_SUCCESS)        return E_FAIL;    // Set the friendly name of the SIP.    RegSetValueEx (hKey, TEXT (""), 0, REG_SZ, (PBYTE)szFriendlyName,                   (lstrlen (szFriendlyName)+1) * sizeof (TCHAR));    // Create subkeys.    // Set the module name of the SIP.    rc = RegCreateKeyEx (hKey, TEXT ("InProcServer32"), 0, TEXT (""),                         0, 0, NULL, &hSubKey, &dwDisp);    rc = RegSetValueEx (hSubKey, TEXT (""), 0, REG_SZ, (PBYTE)szName,                        (lstrlen (szName)+1) * sizeof (TCHAR));    RegCloseKey (hSubKey);    // Set the default icon of the server.    RegCreateKeyEx (hKey, TEXT ("DefaultIcon"), 0, TEXT (""),                         0, 0, NULL, &hSubKey, &dwDisp);    lstrcat (szName, TEXT (",0"));    RegSetValueEx (hSubKey, TEXT (""), 0, REG_SZ, (PBYTE)szName,                        (lstrlen (szName)+1) * sizeof (TCHAR));    RegCloseKey (hSubKey);    // Set the flag indicating this is a SIP.    RegCreateKeyEx (hKey, TEXT ("IsSIPInputMethd"), 0, TEXT (""),                     0, 0, NULL, &hSubKey, &dwDisp);    i = 1;    RegSetValueEx (hSubKey, TEXT (""), 0, REG_DWORD, (PBYTE)&i, 4);    RegCloseKey (hSubKey);    RegCloseKey (hKey);    return S_OK;}//======================================================================// DllUnregisterServer - Exported function called to remove the server// information from the registry//STDAPI DllUnregisterServer() {    INT rc;    rc = RegDeleteKey (HKEY_CLASSES_ROOT, szCLSIDNumPanel);    if (rc == ERROR_SUCCESS)        return S_OK;    return E_FAIL;}//**********************************************************************// MyClassFactory Object implimentation//----------------------------------------------------------------------// Object constructorMyClassFactory::MyClassFactory () {    m_lRef = 1;     //Set ref count to 1 on create    return;}//----------------------------------------------------------------------// Object destructorMyClassFactory::~MyClassFactory () {    return;}//----------------------------------------------------------------------// QueryInterface - Called to see what interfaces this object supportsSTDMETHODIMP MyClassFactory::QueryInterface (THIS_ REFIID riid,                                              LPVOID *ppv) {    // If caller wants our IUnknown or IClassFactory object,     // return a pointer to the object.    if (IsEqualIID (riid, IID_IUnknown) ||         IsEqualIID (riid, IID_IClassFactory)) {        *ppv = (LPVOID)this;     // return pointer to object.        AddRef();                // Inc ref to prevent delete on return.        return NOERROR;    }    *ppv = NULL;    return (E_NOINTERFACE);}//----------------------------------------------------------------------// AddRef - Increment object reference count.STDMETHODIMP_(ULONG) MyClassFactory::AddRef (THIS) {    ULONG cnt;    cnt = (ULONG)InterlockedIncrement (&m_lRef);    return cnt;}//----------------------------------------------------------------------// Release - Decrement object reference count.STDMETHODIMP_(ULONG) MyClassFactory::Release (THIS) {    ULONG cnt;    cnt = (ULONG)InterlockedDecrement (&m_lRef);    if (cnt == 0)        delete this;    return cnt;}//----------------------------------------------------------------------// LockServer - Called to tell the DLL not to unload even if use cnt 0STDMETHODIMP MyClassFactory::LockServer (BOOL fLock) {    if (fLock)        InterlockedIncrement (&g_DllCnt);    else        InterlockedDecrement (&g_DllCnt);    return NOERROR;}//----------------------------------------------------------------------// CreateInstance - Called to have class factory object create other// objectsSTDMETHODIMP MyClassFactory::CreateInstance (LPUNKNOWN pUnkOuter,                                              REFIID riid, LPVOID *ppv) {    MyIInputMethod *pMyIM;    HRESULT hr;    if (pUnkOuter)        return (CLASS_E_NOAGGREGATION);    if (IsEqualIID (riid, IID_IUnknown) ||         IsEqualIID (riid, IID_IInputMethod)) {        // Create file filter object.        pMyIM = new MyIInputMethod();        if (!pMyIM)            return E_OUTOFMEMORY;        // See if object exports the proper interface.        hr = pMyIM->QueryInterface (riid, ppv);        // This will cause an obj delete unless interface found.        pMyIM->Release ();        return hr;    }     return E_NOINTERFACE;}//**********************************************************************// MyIInputMethod Object implementation//----------------------------------------------------------------------// Object constructorMyIInputMethod::MyIInputMethod () {    m_lRef = 1;     //Set reference count to 1 on create.    g_DllCnt++;    return;}//----------------------------------------------------------------------// Object destructorMyIInputMethod::~MyIInputMethod () {    g_DllCnt--;    return;}//----------------------------------------------------------------------// QueryInterface - Called to see what interfaces this object supportsSTDMETHODIMP MyIInputMethod::QueryInterface (THIS_ REFIID riid,                                              LPVOID *ppv) {    // If caller wants our IUnknown or IID_ICeFileFilter object,     // return a pointer to the object.    if (IsEqualIID (riid, IID_IUnknown) ||         IsEqualIID (riid, IID_IInputMethod)){        // Return pointer to object.        *ppv = (IInputMethod *)this;        AddRef();                // Inc ref to prevent delete on return.        return NOERROR;    }    *ppv = NULL;    return (E_NOINTERFACE);}//----------------------------------------------------------------------// AddRef - Increment object reference count.STDMETHODIMP_(ULONG) MyIInputMethod::AddRef (THIS) {    ULONG cnt;    cnt = (ULONG)InterlockedIncrement (&m_lRef);    return cnt;}//----------------------------------------------------------------------// Release - Decrement object reference count.STDMETHODIMP_(ULONG) MyIInputMethod::Release (THIS) {    ULONG cnt;    cnt = (ULONG)InterlockedDecrement (&m_lRef);    if (cnt == 0) {        delete this;        return 0;    }    return cnt;}//----------------------------------------------------------------------// Select - The IM has just been loaded into memory.//HRESULT STDMETHODCALLTYPE MyIInputMethod::Select (HWND hwndSip) {    RECT rect;    WNDCLASS wc;    HBITMAP hBmp, hbmpMask;    m_hwndParent = hwndSip;    // Create image list for narrow (16x16) image.    m_himlNarrow = ImageList_Create (16, 16, ILC_COLOR | ILC_MASK,                                      1, 0);    hBmp = LoadBitmap (hInst, TEXT ("NarrowBmp"));    hbmpMask = LoadBitmap (hInst, TEXT ("NarrowMask"));    ImageList_Add (m_himlNarrow, hBmp, hbmpMask);    DeleteObject (hBmp);    DeleteObject (hbmpMask);    // Create image list for wide (32x16) image.    m_himlWide = ImageList_Create (32, 16, ILC_COLOR | ILC_MASK, 1, 0);    hBmp = LoadBitmap (hInst, TEXT ("WideBmp"));    hbmpMask = LoadBitmap (hInst, TEXT ("WideMask"));    ImageList_Add (m_himlWide, hBmp, hbmpMask);    DeleteObject (hBmp);    DeleteObject (hbmpMask);    // Register SIP window class.    memset (&wc, 0, sizeof (wc));    wc.style = CS_DBLCLKS;    wc.lpfnWndProc = NPWndProc;               // Callback function    wc.hInstance = hInst;                     // Owner handle    wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);    wc.lpszClassName = MYSIPCLS;              // Window class name    if (RegisterClass (&wc) == 0) return E_FAIL;    // Create SIP window.      GetClientRect (hwndSip, &rect);    m_hwndMyWnd = CreateWindowEx (0, MYSIPCLS, TEXT (""),                   WS_VISIBLE | WS_CHILD | WS_BORDER, rect.left,                   rect.top, rect.right - rect.left,                   rect.bottom - rect.top, hwndSip, (HMENU)IDC_SIP,                   hInst, 0);    if (!IsWindow (m_hwndMyWnd))        return E_FAIL;    return S_OK;}//----------------------------------------------------------------------// Deselect - The IM is about to be unloaded.//HRESULT STDMETHODCALLTYPE MyIInputMethod::Deselect (void) {    // Clean up since we're about to be unloaded.    DestroyWindow (m_hwndMyWnd);    UnregisterClass (MYSIPCLS, hInst);    ImageList_Destroy (m_himlNarrow);    ImageList_Destroy (m_himlWide);    return S_OK;}//----------------------------------------------------------------------// Showing - The IM is about to be made visible.//HRESULT STDMETHODCALLTYPE MyIInputMethod::Showing (void) {    return S_OK;}//----------------------------------------------------------------------// Hiding - The IM is about to be hidden.//HRESULT STDMETHODCALLTYPE MyIInputMethod::Hiding (void) {    return S_OK;}//----------------------------------------------------------------------// GetInfo - The SIP wants info from the IM.//HRESULT STDMETHODCALLTYPE MyIInputMethod::GetInfo (                                              IMINFO __RPC_FAR *pimi) {    pimi->cbSize = sizeof (IMINFO);    pimi->hImageNarrow = m_himlNarrow;    pimi->hImageWide = m_himlWide;    pimi->iNarrow = 0;    pimi->iWide = 0;      pimi->fdwFlags = SIPF_DOCKED;    pimi->rcSipRect.left = 0;    pimi->rcSipRect.top = 0;    pimi->rcSipRect.right = FLOATWIDTH;    pimi->rcSipRect.bottom = FLOATHEIGHT;    SendMessage (m_hwndMyWnd, MYMSG_METHCALL, 1, (LPARAM) pimi);    return S_OK;}//----------------------------------------------------------------------// ReceiveSipInfo - The SIP is passing info to the IM.//HRESULT STDMETHODCALLTYPE MyIInputMethod::ReceiveSipInfo (                                               SIPINFO __RPC_FAR *psi) {    // Pass the SIP info data to the window.    SendMessage (m_hwndMyWnd, MYMSG_METHCALL, 2, (LPARAM) psi);    return S_OK;}//----------------------------------------------------------------------// RegisterCallback - The SIP is providing the IM with the pointer to // the IIMCallback interface.//HRESULT STDMETHODCALLTYPE MyIInputMethod::RegisterCallback (                                  IIMCallback __RPC_FAR *lpIMCallback) {    m_pIMCallback = lpIMCallback;    PostMessage (m_hwndMyWnd, MYMSG_METHCALL, 0, (LPARAM)m_pIMCallback);    return S_OK;}//----------------------------------------------------------------------// GetImData - An application is passing IM-specfic data to the IM.// HRESULT STDMETHODCALLTYPE MyIInputMethod::GetImData (DWORD dwSize,                                                     LPVOID pvImData) {    return E_FAIL;}//----------------------------------------------------------------------// SetImData - An application is querying IM-specfic data from the IM.//HRESULT STDMETHODCALLTYPE MyIInputMethod::SetImData (DWORD dwSize,                                                      LPVOID pvImData) {    return S_OK;}//----------------------------------------------------------------------// UserOptionsDlg - The SIP control panel applet is asking for a // configuration dialog box to be displayed.//HRESULT STDMETHODCALLTYPE MyIInputMethod::UserOptionsDlg (                                                     HWND hwndParent) {    MessageBox (hwndParent, TEXT ("UserOptionsDlg called."),                TEXT ("NumPanel"), MB_OK);    return S_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -