阳光VIP

少壮不努力,老大徒伤悲。平日弗用功,自到临期悔。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

多功能输入法前端设计与实现(总)

Posted on 2012-02-16 20:11  阳光VIP  阅读(364)  评论(0编辑  收藏  举报

  目前的输入法可以分为两种,一种是外挂式的,一种是以dll为接口的输入法。这篇笔记讨论的主题主要是围绕外挂式的输入法的前端设计与实现。

主要解决的问题:包括位图的导出和转换,右键弹出菜单实现与功能选择,窗口的贴图,属性表的显示实现,窗口移动实现,字体选择和窗体的颜色

下面的代码是为一个简单的窗口实现,这窗口主要解决窗口移动,右键菜单,还有一些字体选择和窗口颜色变化


// 透明色.cpp : Defines the entry point for the application.

//



#include "stdafx.h"

#include "resource.h"

#include "config.h"



#include <prsht.h>

#include <commctrl.h>

#include <pshpack1.h>

#include <crtdbg.h>



#include "shellapi.h"

#pragma comment (lib,"comctl32.lib")

#pragma  comment(lib,"shell32.lib")

#define MAX_LOADSTRING 100

#pragma comment (lib,"comctl32.lib")

// Global Variables:

HINSTANCE hInst;		

HWND  hInputWnd;

TCHAR szTitle[MAX_LOADSTRING];								// The title bar text

TCHAR szWindowClass[MAX_LOADSTRING];								// The title bar text



// Foward declarations of functions included in this code module:

ATOM				MyRegisterClass(HINSTANCE hInstance);

BOOL				InitInstance(HINSTANCE, int);

LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

void Stand_TrackPopupMenu(HWND hWnd,WPARAM wParam, LPARAM lParam);// 右键弹出菜单

void Stand_Move(HWND hWnd,WPARAM wParam,LPARAM lParam);//窗口移动

void Stand_ONLBUTTONDOWN(HWND hWnd,WPARAM wParam,LPARAM lParam);//按钮按下的时候



void Stand_onBUTONUP(HWND hWnd,WPARAM wParam,LPARAM lParam);

//////////////////////////////////////////////////////////////////////



int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

 	// TODO: Place code here.

	MSG msg;

	HACCEL hAccelTable;



// 	// Initialize global strings

 	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

	LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);

	MyRegisterClass(hInstance);



	// Perform application initialization:

	if (!InitInstance (hInstance, nCmdShow)) 

	{

		return FALSE;

	}



	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MY);



	// Main message loop:

	while (GetMessage(&msg, NULL, 0, 0)) 

	{

		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 

		{

			TranslateMessage(&msg);

			DispatchMessage(&msg);

		}

	}



	return msg.wParam;

}







ATOM MyRegisterClass(HINSTANCE hInstance)

{

	WNDCLASSEX wcex;



	wcex.cbSize = sizeof(WNDCLASSEX); 



	wcex.style			= CS_HREDRAW | CS_VREDRAW;

	wcex.lpfnWndProc	= (WNDPROC)WndProc;

	wcex.cbClsExtra		= 0;

	wcex.cbWndExtra		= 0;

	wcex.hInstance		= hInstance;

	wcex.hIcon			= NULL;

	wcex.hCursor		= NULL;

	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);

	wcex.lpszMenuName	= NULL;

	wcex.lpszClassName	= szWindowClass;

	wcex.hIconSm		= NULL;



	return RegisterClassEx(&wcex);

}







BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

//    HWND hWnd;

//    hWnd=hInputWnd;

   hInst = hInstance; 

   hInputWnd=CreateWindow(szWindowClass,

						"ds",

						WS_POPUP|WS_DISABLED,

							500,

						    500,

							300, 

							42,

							NULL,

							NULL, 

							hInst, 

							NULL);



   if (!hInputWnd)

   {

      return FALSE;

   }



   ShowWindow(hInputWnd, nCmdShow);

   UpdateWindow(hInputWnd);



   return TRUE;

}









LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

	int wmId, wmEvent;

 	PAINTSTRUCT ps;

	HDC hdc;

	TCHAR szHello[MAX_LOADSTRING];

	LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

   

   



	switch (message) 

	{

		case WM_COMMAND:

			{	wmId    = LOWORD(wParam); 

			   wmEvent = HIWORD(wParam); 

			

			switch (wmId)

			{

				case IDM_ABOUT:

				   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);

				   break;

				case IDM_EXIT:

				   DestroyWindow(hWnd);

				   break;



                case IDM_HELP:

				DoPropertySheet(hWnd);

					break;



				case IDM_WENDANG:

				// MessageBox(NULL,"ds","ds",MB_OK);

					ShellExecute(NULL, "open", "Help.chm",  NULL, NULL,SW_SHOWNORMAL); 

					break;





				default:

				   return DefWindowProc(hWnd, message, wParam, lParam);

			}



			}

			break;

		 



		case  WM_RBUTTONDOWN:

			{

              Stand_TrackPopupMenu( hWnd,wParam,  lParam);//实现右键菜单

			}	

			break;



		case WM_SETCURSOR:

			{

				Stand_ONLBUTTONDOWN(hWnd,wParam,lParam);

			}

           break;



		case WM_LBUTTONUP:

			{

				Stand_onBUTONUP(hWnd,wParam,lParam);

			}

          break;



		case WM_MOUSEMOVE:

			{

            

				Stand_Move(hWnd,wParam,lParam);

			}

            break;





       

		case WM_PAINT:

			{

			hdc=BeginPaint(hWnd,&ps);

            Stand_onPaint(hWnd,hdc);

			EndPaint(hWnd,&ps);

			}

			break;





    	case WM_DESTROY:

			PostQuitMessage(0);

			break;

		default:

			return DefWindowProc(hWnd, message, wParam, lParam);

   }

   return 0;

}







 LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

 {

 	switch (message)

 	{

 		case WM_INITDIALOG:

 				return TRUE;

 

 		case WM_COMMAND:

			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 

 			{

				EndDialog(hDlg, LOWORD(wParam));

 				return TRUE;

 			}

 			break;

 	}

     return FALSE;

 }





//////////////////////////////////////////////////////////////////////////

// 右键菜单实现

void Stand_TrackPopupMenu(HWND hWnd,WPARAM wParam, LPARAM lParam)

{



 HMENU hMenu;

 HMENU hsubmenu;

 int cmd;

 hMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU1));

 hsubmenu=GetSubMenu(hMenu,0);

 POINT pt;

 

 pt.x=LOWORD(lParam);//

 pt.y=HIWORD(lParam);//

 ClientToScreen(hWnd,&pt);

 cmd=TrackPopupMenu(hsubmenu,TPM_RIGHTBUTTON,pt.x,pt.y,0,hWnd,NULL);

  switch(cmd)

  {

  

   case IDM_EXIT:

      DestroyWindow(hWnd);

	  break;

  

   case IDM_ABOUT:

	   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);

	   break;

  

   case IDM_HELP:

 DoPropertySheet(hWnd);

	   break;



   case IDM_WENDANG:

	 ShellExecute(hWnd, "open", "Help.chm",  NULL, NULL,SW_SHOWNORMAL);

	 break;





  }

			 













}

//////////////////////////////////////////////////////////////////////////

//创建一个填涂区//////////////////////////////////////////////////////////

void Stand_onPaint(HWND hWnd,HDC hdc)

{



 HPEN hPen;//定义一支笔

 HBRUSH hBrush;//创建一个画刷

 char  output[32];

 hBrush=CreateSolidBrush(SetMyview.WndColor);//创建一个填充填充色The CreateSolidBrush function creates a logical brush that has the specified solid color

 SelectObject(hdc,hBrush);

 

 hPen=CreatePen(PS_SOLID,6,RGB(255,255,1));//利用这个函数创建一个RGB 是这个的的实线画笔*/

 Rectangle(hdc,0,0,300,42);//画一个矩形

 SelectObject(hdc,hPen);



 SetTextColor(hdc,SetMyview.FontColor);

 SelectObject(hdc,SetMyview.hfont);//选择字体种类

 sprintf(output,"%s","SuCCess"); 

 TextOut(hdc,10,10,output,strlen(output));//输出一个字先

 	



 

 

 DeleteObject(hPen);

 DeleteObject(hBrush);



}







//更新窗口,要指明那个窗口要更新

void  UpdateInputWnd()

{



ShowWindow(hInputWnd,SW_SHOWNA);



HDC hdc=GetDC(hInputWnd);

Stand_onPaint(hInputWnd,hdc);

ReleaseDC(hInputWnd,hdc);



}

 



//////////////////////////////////////////////////////////////////////////

//窗口移动,捕捉鼠标///////////////////////////////////////////////////////////////

static BOOL fMove=FALSE;//判断是否移动

static RECT  inRect,drect;

static SIZE		sz;

static POINT pwnd;//

void Stand_ONLBUTTONDOWN(HWND hWnd,WPARAM wParam,LPARAM lParam)

{



POINT pt;



HDC hdc=GetDC(hWnd);



if(HIWORD(lParam)==WM_LBUTTONDOWN)

{



	SetCapture(hWnd);	//捕捉鼠标

	GetCursorPos(&pt); //获得当前鼠标坐标位置

	GetWindowRect(hWnd,&drect);//获得当前窗口矩形

    

	inRect.left=drect.left;

	inRect.top=drect.top;

	inRect.right=drect.right;

	inRect.bottom=drect.bottom;



     pwnd.x=pt.x-drect.left;////计算鼠标坐标与矩形左上角x坐标的距离 初始化第一个位置

	 pwnd.y=pt.y-drect.top;////计算鼠标坐标与矩形左上角Y坐标的距离  





    sz.cx=inRect.right-inRect.left;

	sz.cy=inRect.bottom-inRect.top;

	fMove=TRUE;

    

}





else if (HIWORD(lParam)== WM_RBUTTONDOWN)

{



	SetCapture(hWnd);		



}











}



//移动

void Stand_onBUTONUP(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

  POINT pt;

  ReleaseCapture();

  if (fMove)

  {

	 // MessageBox(NULL,"ds","dsd",MB_OK);

   GetCursorPos(&pt);

   MoveWindow(hWnd,pt.x-pwnd.x,pt.y-pwnd.y,sz.cx,sz.cy,TRUE);//当前位置减去之前的位置,从而得到了移动后的距离位置

  }

  fMove=FALSE;





}



//计算移动窗口

void Stand_Move(HWND hWnd,WPARAM wParam,LPARAM lParam)

{



POINT pt;

if (fMove)

{

GetCursorPos(&pt);

drect.left   = pt.x - pwnd.x;

drect.top    = pt.y - pwnd.y;

drect.right  = inRect.left + sz.cx;

drect.bottom = inRect.top + sz.cy;



}









}



#include "StdAfx.h"

#include "config.h"

#include "resource.h"

#include "prsht.h"

#include <commctrl.h>

#include <pshpack1.h>

#include <crtdbg.h>

#include "Commdlg.h"

#pragma comment (lib,"comctl32.lib")



SetView SetMyview;

HINSTANCE  hInst1;

#pragma comment (lib,"comctl32.lib")



//***************************************************//



//弹出对话框

HFONT CreateMyFont() 

{ 

    CHOOSEFONT cf; 

    LOGFONT lf; 

    HFONT hfont; 

	

    cf.lStructSize	= sizeof(CHOOSEFONT); 

    cf.hwndOwner	= (HWND)NULL; 

    cf.hDC			= (HDC)NULL; 

    cf.lpLogFont	= &lf; 

    cf.iPointSize	= 0; 

    cf.Flags		= CF_SCREENFONTS; 

    cf.rgbColors	= RGB(0,0,0); 

    cf.lCustData	= 0L; 

    cf.lpfnHook		= (LPCFHOOKPROC)NULL; 

    cf.lpTemplateName = (LPSTR)NULL; 

    cf.hInstance	= (HINSTANCE) NULL; 

    cf.lpszStyle	= (LPSTR)NULL; 

    cf.nFontType	= SCREEN_FONTTYPE; 

    cf.nSizeMin		= 0; 

    cf.nSizeMax		= 0; 

	

    

	if (ChooseFont(&cf))

	{

		hfont = CreateFontIndirect(cf.lpLogFont); 

		return (hfont);

	}

	else

	{

		return (HFONT)NULL;

	}

}





//选择字体颜色,返回选择后的颜色值,这个颜色值给窗口和字体

COLORREF ChooseMyColor(HWND hWnd)

{

	CHOOSECOLOR		cc;                 

	COLORREF		acrCustClr[16];  

	DWORD			rgbCurrent;

	

	rgbCurrent=RGB(255,255,255);

	

	ZeroMemory(&cc, sizeof(cc));

	cc.lStructSize = sizeof(cc);

	cc.hwndOwner = hWnd;

	cc.lpCustColors = (LPDWORD) acrCustClr;

	cc.rgbResult = rgbCurrent;

	cc.Flags = CC_FULLOPEN | CC_RGBINIT;

	

	if (ChooseColor(&cc)==TRUE)

	{

		rgbCurrent = cc.rgbResult; 

	}

	return rgbCurrent;

}



//设置一个范围,这个是范围是用于

void InitSlider(HWND hWnd,UINT uValue)

{

	SendMessage(hWnd,TBM_SETRANGE,(WPARAM)TRUE,(LPARAM)MAKELONG(0,100));	//初始化范围

	SendMessage(hWnd,TBM_SETPAGESIZE,(WPARAM)TRUE,(LPARAM)5);

	SendMessage(hWnd,TBM_SETPOS,(WPARAM)TRUE,(LPARAM)100);

}







BOOL WINAPI First(HWND hWnd,UINT message, WPARAM wParam,LPARAM lParam)

{

	switch(message)

	{

		

	case WM_CLOSE:

		DestroyWindow(hWnd);

        break;

    

	case WM_INITDIALOG:

		{

			HWND hSlider=GetDlgItem(hWnd,IDC_SLIDER1);

			InitSlider(hSlider,100);

            SetDlgItemText(hWnd,IDC_EDIT1,"100");



		}

       break;





    case WM_COMMAND:

		{	

		switch(LOWORD(wParam))

		{

          

		 case IDC_BUTTON1:

			 {

			   SetMyview.hfont=CreateMyFont();//弹出字体对话框调用系统那个

		       UpdateInputWnd();

			 }

			

			break;

       

		 

		 case IDC_BUTTON2:

			 {

				SetMyview.FontColor=ChooseMyColor(hWnd);

				UpdateInputWnd();

			 }

			break;



        



		 case IDC_BUTTON3:

			 {

			   SetMyview.WndColor=ChooseMyColor(hWnd);

			   UpdateInputWnd();

			 }

			 break;



		

		}

         

		}

		break;

	case WM_NOTIFY:

		{

			switch( ((LPNMHDR)lParam)->code )

			{

			case NM_RELEASEDCAPTURE:

				{

					static char chNumBuff[20];

					LONG lResult=SendMessage( ((LPNMHDR)lParam)->hwndFrom, TBM_GETPOS ,(WPARAM)0,(LPARAM)0 );

					sprintf(chNumBuff,"%ld",lResult);

					SetDlgItemText(hWnd,IDC_EDIT1,chNumBuff);

					ShowWindow(hInputWnd,SW_SHOWNA);

					//TranspanentWindow((int)lResult);

				}

				break;

			}

		}

		

	default:

		return DefWindowProc(hWnd, message, wParam, lParam);

	}

	return 0;

	

}









//////////////////////////////////////////////////////////////////////////////////

BOOL WINAPI Second(HWND hWnd,UINT message, WPARAM wParam,LPARAM lParam)

{

	switch(message)

	{

		

	case WM_CLOSE:

		DestroyWindow(hWnd);

        break;

		

	default:

		return DefWindowProc(hWnd, message, wParam, lParam);

	}

	return 0;

	

}









int DoPropertySheet(HWND hWnd)

{

	

	PROPSHEETPAGE psp[2];

    PROPSHEETHEADER psh;

    int nRect=-1; 

    psp[0].dwSize = sizeof(PROPSHEETPAGE);

    psp[0].dwFlags = PSP_USEICONID | PSP_USETITLE;

    psp[0].hInstance =hInst1;

    psp[0].pszTemplate =MAKEINTRESOURCE(IDD_DIALOG1);

    psp[0].pszIcon = NULL;

    psp[0].pfnDlgProc = (DLGPROC)First;

    psp[0].pszTitle = "常规";

    psp[0].lParam = 0;

    psp[0].pfnCallback = NULL;

	

	psp[1].dwSize = sizeof(PROPSHEETPAGE);

    psp[1].dwFlags = PSP_USEICONID | PSP_USETITLE;

    psp[1].hInstance = hInst1;

    psp[1].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG2);//

    psp[1].pszIcon = NULL;

    psp[1].pfnDlgProc = (DLGPROC)Second;

    psp[1].pszTitle ="热键";

    psp[1].lParam = 0;

    psp[1].pfnCallback = NULL;

		

    psh.dwSize = sizeof(PROPSHEETHEADER);

    psh.dwFlags = PSH_USEICONID | PSH_PROPSHEETPAGE|PSH_USEPAGELANG;

    psh.hwndParent = hWnd;

    psh.hInstance = hInst1;

    psh.pszIcon =NULL;

    psh.pszCaption = (LPSTR) "输入法后台设置";

    psh.nPages = sizeof(psp)/sizeof(PROPSHEETPAGE);

    psh.nStartPage = 0;

    psh.ppsp = (LPCPROPSHEETPAGE) &psp;

    psh.pfnCallback = NULL;

	nRect=PropertySheet(&psh);

    return nRect;

}
配置文件:
Config.cpp
#include "StdAfx.h"
#include "config.h"
#include "resource.h"
#include "prsht.h"
#include <commctrl.h>
#include <pshpack1.h>
#include <crtdbg.h>
#include "Commdlg.h"
#pragma comment (lib,"comctl32.lib")
SetView SetMyview;
HINSTANCE  hInst1;
#pragma comment (lib,"comctl32.lib")
//***************************************************//
//弹出对话框
HFONT CreateMyFont() 
{ 
    CHOOSEFONT cf; 
    LOGFONT lf; 
    HFONT hfont; 
 
    cf.lStructSize = sizeof(CHOOSEFONT); 
    cf.hwndOwner = (HWND)NULL; 
    cf.hDC   = (HDC)NULL; 
    cf.lpLogFont = &lf; 
    cf.iPointSize = 0; 
    cf.Flags  = CF_SCREENFONTS; 
    cf.rgbColors = RGB(0,0,0); 
    cf.lCustData = 0L; 
    cf.lpfnHook  = (LPCFHOOKPROC)NULL; 
    cf.lpTemplateName = (LPSTR)NULL; 
    cf.hInstance = (HINSTANCE) NULL; 
    cf.lpszStyle = (LPSTR)NULL; 
    cf.nFontType = SCREEN_FONTTYPE; 
    cf.nSizeMin  = 0; 
    cf.nSizeMax  = 0; 
 
    
 if (ChooseFont(&cf))
 {
  hfont = CreateFontIndirect(cf.lpLogFont); 
  return (hfont);
 }
 else
 {
  return (HFONT)NULL;
 }
}
//选择字体颜色,返回选择后的颜色值,这个颜色值给窗口和字体
COLORREF ChooseMyColor(HWND hWnd)
{
 CHOOSECOLOR  cc;                 
 COLORREF  acrCustClr[16];  
 DWORD   rgbCurrent;
 
 rgbCurrent=RGB(255,255,255);
 
 ZeroMemory(&cc, sizeof(cc));
 cc.lStructSize = sizeof(cc);
 cc.hwndOwner = hWnd;
 cc.lpCustColors = (LPDWORD) acrCustClr;
 cc.rgbResult = rgbCurrent;
 cc.Flags = CC_FULLOPEN | CC_RGBINIT;
 
 if (ChooseColor(&cc)==TRUE)
 {
  rgbCurrent = cc.rgbResult; 
 }
 return rgbCurrent;
}
//设置一个范围,这个是范围是用于
void InitSlider(HWND hWnd,UINT uValue)
{
 SendMessage(hWnd,TBM_SETRANGE,(WPARAM)TRUE,(LPARAM)MAKELONG(0,100)); //初始化范围
 SendMessage(hWnd,TBM_SETPAGESIZE,(WPARAM)TRUE,(LPARAM)5);
 SendMessage(hWnd,TBM_SETPOS,(WPARAM)TRUE,(LPARAM)100);
}
 
BOOL WINAPI First(HWND hWnd,UINT message, WPARAM wParam,LPARAM lParam)
{
 switch(message)
 {
  
 case WM_CLOSE:
  DestroyWindow(hWnd);
        break;
    
 case WM_INITDIALOG:
  {
   HWND hSlider=GetDlgItem(hWnd,IDC_SLIDER1);
   InitSlider(hSlider,100);
            SetDlgItemText(hWnd,IDC_EDIT1,"100");
  }
       break;
    case WM_COMMAND:
  { 
  switch(LOWORD(wParam))
  {
          
   case IDC_BUTTON1:
    {
      SetMyview.hfont=CreateMyFont();//弹出字体对话框调用系统那个
         UpdateInputWnd();
    }
   
   break;
       
   
   case IDC_BUTTON2:
    {
    SetMyview.FontColor=ChooseMyColor(hWnd);
    UpdateInputWnd();
    }
   break;
        
   case IDC_BUTTON3:
    {
      SetMyview.WndColor=ChooseMyColor(hWnd);
      UpdateInputWnd();
    }
    break;
  
  }
         
  }
  break;
 case WM_NOTIFY:
  {
   switch( ((LPNMHDR)lParam)->code )
   {
   case NM_RELEASEDCAPTURE:
    {
     static char chNumBuff[20];
     LONG lResult=SendMessage( ((LPNMHDR)lParam)->hwndFrom, TBM_GETPOS ,(WPARAM)0,(LPARAM)0 );
     sprintf(chNumBuff,"%ld",lResult);
     SetDlgItemText(hWnd,IDC_EDIT1,chNumBuff);
     ShowWindow(hInputWnd,SW_SHOWNA);
     //TranspanentWindow((int)lResult);
    }
    break;
   }
  }
  
 default:
  return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;
 
}
 
//////////////////////////////////////////////////////////////////////////////////
BOOL WINAPI Second(HWND hWnd,UINT message, WPARAM wParam,LPARAM lParam)
{
 switch(message)
 {
  
 case WM_CLOSE:
  DestroyWindow(hWnd);
        break;
  
 default:
  return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;
 
}
 
int DoPropertySheet(HWND hWnd)
{
 
 PROPSHEETPAGE psp[2];
    PROPSHEETHEADER psh;
    int nRect=-1; 
    psp[0].dwSize = sizeof(PROPSHEETPAGE);
    psp[0].dwFlags = PSP_USEICONID | PSP_USETITLE;
    psp[0].hInstance =hInst1;
    psp[0].pszTemplate =MAKEINTRESOURCE(IDD_DIALOG1);
    psp[0].pszIcon = NULL;
    psp[0].pfnDlgProc = (DLGPROC)First;
    psp[0].pszTitle = "常规";
    psp[0].lParam = 0;
    psp[0].pfnCallback = NULL;
 
 psp[1].dwSize = sizeof(PROPSHEETPAGE);
    psp[1].dwFlags = PSP_USEICONID | PSP_USETITLE;
    psp[1].hInstance = hInst1;
    psp[1].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG2);//
    psp[1].pszIcon = NULL;
    psp[1].pfnDlgProc = (DLGPROC)Second;
    psp[1].pszTitle ="热键";
    psp[1].lParam = 0;
    psp[1].pfnCallback = NULL;
  
    psh.dwSize = sizeof(PROPSHEETHEADER);
    psh.dwFlags = PSH_USEICONID | PSH_PROPSHEETPAGE|PSH_USEPAGELANG;
    psh.hwndParent = hWnd;
    psh.hInstance = hInst1;
    psh.pszIcon =NULL;
    psh.pszCaption = (LPSTR) "输入法后台设置";
    psh.nPages = sizeof(psp)/sizeof(PROPSHEETPAGE);
    psh.nStartPage = 0;
    psh.ppsp = (LPCPROPSHEETPAGE) &psp;
    psh.pfnCallback = NULL;
 nRect=PropertySheet(&psh);
    return nRect;
}
config.h
#pragma once
#define WIN32_LEAN_AND_MEAN  
#include "StdAfx.h"
#include "prsht.h"
#include <commctrl.h>
#include <pshpack1.h>
#include <crtdbg.h>
#pragma comment (lib,"comctl32.lib")
HFONT CreateMyFont();//创建我的字体
int DoPropertySheet(HWND hWnd);
BOOL WINAPI First(HWND hWnd,UINT message, WPARAM wParam,LPARAM lParam);
BOOL WINAPI Second(HWND hWnd,UINT message, WPARAM wParam,LPARAM lParam);
//定义个结构体这个结构是用于设置字体的颜色,字体大小,窗口的背景颜色
typedef struct _tagSetView
{
 HFONT hfont;//选择字体
   COLORREF FontColor;//字体颜色
    COLORREF WndColor;//窗口颜色
 BOOL     SetSkin;//设置皮肤
   
}
SetView;
extern SetView SetMyview;
extern HWND  hInputWnd;
extern HINSTANCE hInst1;
void UpdateInputWnd();//更新窗口
void Stand_onPaint(HWND hWnd,HDC hdc);//输出窗口的颜色值