MULTIWND.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:17k
源码类别:
Windows编程
开发平台:
Visual C++
- /**********************************************************************/
- /* */
- /* MULTIWND.C */
- /* */
- /* Copyright (c) 1995-1996 Microsoft Corporation */
- /* */
- /**********************************************************************/
- #include "windows.h"
- #include "imm.h"
- #include "resource.h"
- #include "multiui.h"
- /**********************************************************************/
- /* */
- /* InitStringBuffer(HWND) */
- /* */
- /**********************************************************************/
- void FAR PASCAL InitStringBuffer(hWnd)
- HWND hWnd;
- {
- LPSTR lpStr = NULL;
- if (lpStr = GlobalAlloc(GPTR,MAXSIZE_STR))
- {
- SetWindowLong(hWnd,MYGWL_LPSTR,(LONG)lpStr);
- }
- else
- {
- SetWindowLong(hWnd,MYGWL_LPSTR,(LONG)0L);
- }
- }
- /**********************************************************************/
- /* */
- /* DestroyStringBuffer(HWND) */
- /* */
- /**********************************************************************/
- void FAR PASCAL DestroyStringBuffer(hWnd)
- HWND hWnd;
- {
- LPSTR lpStr = NULL;
- lpStr = (LPSTR)GetWindowLong(hWnd,MYGWL_LPSTR);
- if (lpStr)
- {
- GlobalFree((HANDLE)lpStr);
- }
- }
- /**********************************************************************/
- /* */
- /* MyDrawString(HWND,WPARAM,LPARAM) */
- /* */
- /**********************************************************************/
- void FAR PASCAL MyDrawString(hWnd,wParam,lParam)
- HWND hWnd;
- WPARAM wParam;
- LPARAM lParam;
- {
- LPSTR lpStr = NULL;
- HDC hDC;
- PAINTSTRUCT ps;
- HFONT hOldFont;
- HFONT hFont;
- DWORD dwHeight;
- TEXTMETRIC tm;
- RECT rc;
- lpStr = (LPSTR)GetWindowLong(hWnd,MYGWL_LPSTR);
- if (!lpStr)
- return;
- hFont = (HFONT)GetWindowLong(hWnd,MYGWL_FONT);
- if (!hFont)
- return;
- hDC = BeginPaint(hWnd, &ps);
- hOldFont = SelectObject(hDC, hFont);
- lpStr = (LPSTR)GetWindowLong(hWnd,MYGWL_LPSTR);
- // Get dwHeight.
- GetTextMetrics(hDC,&tm);
- dwHeight = tm.tmHeight + tm.tmExternalLeading;
- GetClientRect(hWnd,&rc);
- rc.bottom -= dwHeight;
- DrawText(hDC,lpStr,-1,&rc,DT_LEFT | DT_WORDBREAK);
- SelectObject(hDC, hOldFont);
- EndPaint(hWnd, &ps);
- }
- /**********************************************************************/
- /* */
- /* MySetCompositionFont(HWND) */
- /* */
- /**********************************************************************/
- void FAR PASCAL MySetCompositionFont(hWnd)
- HWND hWnd;
- {
- HIMC hIMC;
- if (hIMC = ImmGetContext(hWnd))
- {
- LOGFONT lf;
- HFONT hFont = (HFONT)GetWindowLong(hWnd,MYGWL_FONT);
- GetObject(hFont,sizeof(lf),&lf);
- ImmSetCompositionFont(hIMC,&lf);
- ImmReleaseContext(hWnd, hIMC);
- }
- }
- /**********************************************************************/
- /* */
- /* MySetCompositionForm(HWND) */
- /* */
- /**********************************************************************/
- void FAR PASCAL MySetCompositionForm(hWnd)
- HWND hWnd;
- {
- RECT rc;
- HIMC hIMC;
- HDC hDC;
- TEXTMETRIC tm;
- DWORD dwHeight;
- HFONT hFont = (HFONT)GetWindowLong(hWnd,MYGWL_FONT);
- HFONT hOldFont;
- COMPOSITIONFORM CompForm;
- if (!hFont)
- return;
- if (hIMC = ImmGetContext(hWnd))
- {
- // Get dwHeight.
- hDC = GetDC(hWnd);
- hOldFont = SelectObject(hDC, hFont);
- GetTextMetrics(hDC,&tm);
- dwHeight = tm.tmHeight + tm.tmExternalLeading;
- SelectObject(hDC, hOldFont);
- ReleaseDC(hWnd,hDC);
- GetClientRect(hWnd,&rc);
- CompForm.dwStyle = CFS_POINT;
- CompForm.ptCurrentPos.x = rc.left;
- CompForm.ptCurrentPos.y = rc.bottom - dwHeight;
- ImmSetCompositionWindow(hIMC,&CompForm);
- ImmReleaseContext(hWnd, hIMC);
- }
- }
- /**********************************************************************/
- /* */
- /* MyChangeFont(HWND) */
- /* */
- /**********************************************************************/
- void FAR PASCAL MyChangeFont(hWnd)
- HWND hWnd;
- {
- LOGFONT lf;
- CHOOSEFONT cf;
- HFONT hFont;
- /* Set all structure fields to zero. */
- memset(&cf, 0, sizeof(CHOOSEFONT));
- cf.lStructSize = sizeof(CHOOSEFONT);
- cf.hwndOwner = hWnd;
- cf.lpLogFont = &lf;
- cf.Flags = CF_SCREENFONTS | CF_EFFECTS;
- cf.rgbColors = RGB(0, 255, 255); /* light blue */
- cf.nFontType = SCREEN_FONTTYPE;
- if (ChooseFont(&cf))
- {
- hFont = (HFONT)GetWindowLong(hWnd,MYGWL_FONT);
- DeleteObject(hFont);
- hFont = CreateFontIndirect(&lf);
- SetWindowLong(hWnd,MYGWL_FONT,(LONG)hFont);
- MySetCompositionForm(hWnd);
- MySetCompositionFont(hWnd);
- }
- SetFocus(hWnd);
- }
- /**********************************************************************/
- /* */
- /* GetDefaultGUIFont(void) */
- /* */
- /**********************************************************************/
- HFONT GetDefaultGUIFont(void)
- {
- static HFONT hFont;
- OSVERSIONINFO VerInfo;
- if (hFont)
- return hFont;
- VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- GetVersionEx(&VerInfo);
- if (VerInfo.dwMajorVersion < 4) {
- NONCLIENTMETRICS ncm;
- ncm.cbSize = sizeof(NONCLIENTMETRICS);
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
- hFont = CreateFontIndirect(&ncm.lfStatusFont);
- if (!hFont)
- hFont = GetStockObject(SYSTEM_FONT);
- } else {
- hFont = GetStockObject(DEFAULT_GUI_FONT);
- }
- return hFont;
- }
- /**********************************************************************/
- /* */
- /* OverFlowText(HWND,LPSTR,LPSTR) */
- /* */
- /**********************************************************************/
- BOOL FAR PASCAL OverFlowText(hWnd,lpStr,lpResultStr)
- HWND hWnd;
- LPSTR lpStr;
- LPSTR lpResultStr;
- {
- BOOL bRet = FALSE;
- RECT rc;
- HDC hDC;
- TEXTMETRIC tm;
- int nHeight;
- HFONT hFont = (HFONT)GetWindowLong(hWnd,MYGWL_FONT);
- HFONT hOldFont;
- LPSTR lpTemp;
- if (!hFont)
- return FALSE;
- if (lstrlen(lpStr) + lstrlen(lpResultStr) > MAXSIZE_STR)
- {
- bRet = TRUE;
- }
- else
- {
- lpTemp = GlobalAlloc(GPTR,MAXSIZE_STR);
- if (lpTemp)
- {
- lstrcpy(lpTemp,lpStr);
- lstrcat(lpTemp,lpResultStr);
- GetClientRect(hWnd,&rc);
- hDC = GetDC(hWnd);
- hOldFont = SelectObject(hDC, hFont);
- GetTextMetrics(hDC,&tm);
- rc.bottom -= tm.tmHeight + tm.tmExternalLeading;
- nHeight = rc.bottom;
- if (nHeight < DrawText(hDC,lpTemp,-1,&rc,DT_LEFT | DT_WORDBREAK | DT_CALCRECT))
- {
- bRet = TRUE;
- }
- SelectObject(hDC, hOldFont);
- ReleaseDC(hWnd,hDC);
- GlobalFree((HANDLE)lpTemp);
- }
- }
- return bRet;
- }
- /**********************************************************************/
- /* */
- /* AddResultString(HWND) */
- /* */
- /**********************************************************************/
- void FAR PASCAL AddResultString(hWnd)
- HWND hWnd;
- {
- HIMC hIMC;
- DWORD dwLen;
- LPSTR lpStr;
- LPSTR lpResultStr;
- lpStr = (LPSTR)GetWindowLong(hWnd,MYGWL_LPSTR);
- hIMC = ImmGetContext(hWnd);
- if (!hIMC)
- return;
- dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);
- if (dwLen)
- {
- lpResultStr = GlobalAlloc(GPTR,dwLen+1);
- if (lpResultStr)
- {
- ImmGetCompositionString(hIMC,GCS_RESULTSTR,
- lpResultStr,dwLen+1);
- if (OverFlowText(hWnd,lpStr,lpResultStr))
- lstrcpy(lpStr,lpResultStr);
- else
- lstrcat(lpStr,lpResultStr);
- InvalidateRect(hWnd,NULL,TRUE);
- GlobalFree((HANDLE)lpResultStr);
- }
- }
- ImmReleaseContext(hWnd,hIMC);
- }
- /**********************************************************************/
- /* */
- /* NoUINoIMCWndProc(HWND, UINT, WPARAM, LPARAM) */
- /* */
- /**********************************************************************/
- long FAR PASCAL NoUINoIMCWndProc(hWnd, message, wParam, lParam)
- HWND hWnd;
- UINT message;
- WPARAM wParam;
- LPARAM lParam;
- {
- HFONT hFont;
- switch (message)
- {
- case WM_CREATE:
- hFont = GetDefaultGUIFont();
- SetWindowLong(hWnd,MYGWL_FONT,(LONG)hFont);
- InitStringBuffer(hWnd);
- break;
- case WM_LBUTTONDBLCLK:
- MyChangeFont(hWnd);
- break;
- case WM_LBUTTONDOWN:
- SetFocus(hWnd);
- break;
- case WM_SETFOCUS:
- MySetCompositionFont(hWnd);
- MySetCompositionForm(hWnd);
- break;
- case WM_IME_COMPOSITION:
- if (lParam & GCS_RESULTSTR)
- {
- AddResultString(hWnd);
- }
- return (DefWindowProc(hWnd, message, wParam, lParam));
- break;
- case WM_SIZE:
- switch (wParam)
- {
- case SIZENORMAL:
- case SIZEFULLSCREEN:
- if (hWnd == GetFocus())
- {
- MySetCompositionForm(hWnd);
- }
- InvalidateRect(hWnd,NULL,TRUE);
- break;
- case SIZEICONIC:
- return (DefWindowProc(hWnd, message, wParam, lParam));
- break;
- }
- break;
- case WM_PAINT:
- MyDrawString(hWnd,wParam,lParam);
- break;
- case WM_DESTROY:
- hFont = (HFONT)GetWindowLong(hWnd,MYGWL_FONT);
- DeleteObject(hFont);
- DestroyStringBuffer(hWnd);
- break;
- default:
- return (DefWindowProc(hWnd, message, wParam, lParam));
- }
- return 0L;
- }
- /**********************************************************************/
- /* */
- /* NoUIOwnIMCWndProc(HWND, UINT, WPARAM, LPARAM) */
- /* */
- /**********************************************************************/
- long FAR PASCAL NoUIOwnIMCWndProc(hWnd, message, wParam, lParam)
- HWND hWnd;
- UINT message;
- WPARAM wParam;
- LPARAM lParam;
- {
- HIMC hIMC;
- HFONT hFont;
- switch (message)
- {
- case WM_CREATE:
- hFont = GetDefaultGUIFont();
- SetWindowLong(hWnd,MYGWL_FONT,(LONG)hFont);
- hIMC = ImmCreateContext();
- ImmAssociateContext(hWnd,hIMC);
- // Save hIMC into WndExtra.
- SetWindowLong(hWnd,MYGWL_IMC,(LONG)hIMC);
- MySetCompositionFont(hWnd);
- MySetCompositionForm(hWnd);
- InitStringBuffer(hWnd);
- break;
- case WM_LBUTTONDBLCLK:
- MyChangeFont(hWnd);
- break;
- case WM_LBUTTONDOWN:
- SetFocus(hWnd);
- break;
- case WM_IME_COMPOSITION:
- if (lParam & GCS_RESULTSTR)
- {
- AddResultString(hWnd);
- }
- return (DefWindowProc(hWnd, message, wParam, lParam));
- break;
- case WM_SIZE:
- switch (wParam)
- {
- case SIZENORMAL:
- case SIZEFULLSCREEN:
- MySetCompositionForm(hWnd);
- InvalidateRect(hWnd,NULL,TRUE);
- break;
- case SIZEICONIC:
- return (DefWindowProc(hWnd, message, wParam, lParam));
- break;
- }
- break;
- case WM_PAINT:
- MyDrawString(hWnd,wParam,lParam);
- break;
- case WM_DESTROY:
- hFont = (HFONT)GetWindowLong(hWnd,MYGWL_FONT);
- DeleteObject(hFont);
- hIMC = (HIMC)GetWindowLong(hWnd,MYGWL_IMC);
- ImmDestroyContext(hIMC);
- DestroyStringBuffer(hWnd);
- break;
- default:
- return (DefWindowProc(hWnd, message, wParam, lParam));
- }
- return 0L;
- }
- /**********************************************************************/
- /* */
- /* OwnUIOwnIMCWndProc(HWND, UINT, WPARAM, LPARAM) */
- /* */
- /**********************************************************************/
- long FAR PASCAL OwnUIOwnIMCWndProc(hWnd, message, wParam, lParam)
- HWND hWnd;
- UINT message;
- WPARAM wParam;
- LPARAM lParam;
- {
- HFONT hFont;
- HIMC hIMC = 0L;
- HWND hIMEWnd = (HWND)GetWindowLong(hWnd,MYGWL_IMEWND);
- if (IsWindow(hIMEWnd) && ImmIsUIMessage(hIMEWnd,message,wParam,lParam))
- {
- switch (message)
- {
- case WM_IME_COMPOSITION:
- if (lParam & GCS_RESULTSTR)
- {
- AddResultString(hWnd);
- }
- break;
- default:
- break;
- }
- return 0L;
- }
- switch (message)
- {
- case WM_CREATE:
- hFont = GetDefaultGUIFont();
- SetWindowLong(hWnd,MYGWL_FONT,(LONG)hFont);
- hIMC = ImmCreateContext();
- ImmAssociateContext(hWnd,hIMC);
- // Save hIMC into WndExtra.
- SetWindowLong(hWnd,MYGWL_IMC,(LONG)hIMC);
- if (!(hIMEWnd = CreateWindow("Ime", "",
- WS_POPUP | WS_DISABLED,
- 0,0,0,0,
- hWnd, NULL, hInst, NULL)))
- return -1;
- // Save hIMEWnd into WndExtra.
- SetWindowLong(hWnd,MYGWL_IMEWND,(LONG)hIMEWnd);
- MySetCompositionFont(hWnd);
- MySetCompositionForm(hWnd);
- InitStringBuffer(hWnd);
- break;
- case WM_LBUTTONDBLCLK:
- MyChangeFont(hWnd);
- break;
- case WM_LBUTTONDOWN:
- SetFocus(hWnd);
- break;
- case WM_SIZE:
- switch (wParam)
- {
- case SIZENORMAL:
- case SIZEFULLSCREEN:
- MySetCompositionForm(hWnd);
- InvalidateRect(hWnd,NULL,TRUE);
- break;
- case SIZEICONIC:
- return (DefWindowProc(hWnd, message, wParam, lParam));
- break;
- }
- break;
- case WM_PAINT:
- MyDrawString(hWnd,wParam,lParam);
- break;
- case WM_DESTROY:
- hFont = (HFONT)GetWindowLong(hWnd,MYGWL_FONT);
- DeleteObject(hFont);
- hIMC = (HIMC)GetWindowLong(hWnd,MYGWL_IMC);
- ImmDestroyContext(hIMC);
- DestroyStringBuffer(hWnd);
- break;
- default:
- return (DefWindowProc(hWnd, message, wParam, lParam));
- }
- return 0L;
- }