一,创建过程
1) 首先安装WinCE开发必备的环境:
VS2005
VS80sp1-KB926604-X86-CHS.exe
VS80sp1-KB932230-X86-CHS.exe
vs_emulator.exe
WINCE6.0_CHS_SDK.msi
2)文件 ---> 新建 ---->项目 ---> Visual C++ --->智能设备 ----> Win32智能设备项目
3)在弹出来的项目向导中,选择已安装的SDK为 WinCE 6.0
4)完成项目创建,按F5,在WinCE模拟器中弹出来图形界面空文档
二,源码(自动创建Win32 项目源码解析)
主要函数:
1)入口函数
int WINAPI WinMain(HINSTANCE hInstance, //确定一个程序的实例
HINSTANCE hPrevInstance, //从旧的win16 API遗留下来,在win32中可以忽略
LPTSTR lpCmdLine, //是一个指针,指向一个包含命令行参数文本的字符串
int nCmdShow) //指定程序主窗口初始状态
2)MSG结构体
typedef struct tagMSG {
HWND hwnd; //表示消息所属的窗口 UINT message; //message指定了消息的标示符,由一个数值来表示(通常用WM_XXX宏表示) WPARAM wParam; // unsigned int 用于指定消息的附加信息 LPARAM lParam; //long 用于指定消息的附加信息 DWORD time; //消息投递到消息队列中的时间 POINT pt; //消息投递到消息队列中鼠标的当前位置 } MSG;3)窗口初始化
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
4)注册窗口
MyRegisterClass(hInstance, szWindowClass)
5)注册窗口时指定窗口过程函数。根据message 来执行窗口中一系列动作
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
6)message的来源与捕获 由 主函数中以下方法来实现
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0)) //WM_QUIT使GetMessage返回0,其他的大于零(case WM_DESTROY:产生WM_QUIT)
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);//将键盘消息转化为字符消息
DispatchMessage(&msg);//通知Windows将消息分发到程序的合适窗口
}
}
#include "stdafx.h"
#include "hello.h"
#include <windows.h>
#include <commctrl.h>
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE g_hInst; // 当前实例(句柄)
HWND g_hWndCommandBar; // 命令栏句柄
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE, LPTSTR);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;//结构体
// 执行应用程序初始化:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_HELLO));
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0)) //WM_QUIT使GetMessage返回0,其他的大于零(case WM_DESTROY:产生WM_QUIT)
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);//将键盘消息转化为字符消息
DispatchMessage(&msg);//通知Windows将消息分发到程序的合适窗口
}
}
// int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT UType);
//MessageBox(NULL,TEXT("Hello World"),TEXT("Hello ts"),MB_OK);//父窗口,窗体显示值,窗体标题栏文本,按钮数目和类型
MessageBox(msg.hwnd,TEXT("Hello World"),TEXT("Hello ts"),MB_ICONWARNING);
return (int) msg.wParam;
}
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;//窗口大小横向、纵向变化时,将强制从新绘制窗口
wc.lpfnWndProc = WndProc;//下面有实现函数(窗口过程的窗口地址,就是函数实现方法的方法地址)111111111
wc.cbClsExtra = 0;//类结构体增加额外空间
wc.cbWndExtra = 0;//Windows预定义结构体增加额外空间
wc.hInstance = hInstance;//拥有该窗口的进程
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_HELLO));//窗口默认图标句柄
wc.hCursor = 0;//是否支持鼠标
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);//绘制窗口背景的方式(GetStockObject()加载画刷:白色WHITE_BRUSH)
wc.lpszMenuName = 0;//必须为NULL ,winCE不支持直接包含菜单的窗口,菜单一般在菜单栏
wc.lpszClassName = szWindowClass;
return RegisterClass(&wc);
}
//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
g_hInst = hInstance; // 将实例句柄存储在全局变量中
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_HELLO, szWindowClass, MAX_LOADSTRING);
if (!MyRegisterClass(hInstance, szWindowClass))//注册窗口
{
return FALSE;
}
hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
if (g_hWndCommandBar)
{
CommandBar_Show(g_hWndCommandBar, TRUE);
}
return TRUE;
}
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//LRESULT == long 32 位 /* 窗口句柄 ;消息的数值(无符号整形);和消息相关的数据32位数值*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)//窗口过程11111111111111
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;//设备句柄
RECT rect;//窗口活动区域的位置坐标
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_HELP_ABOUT: //About为回调函数
DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);//弹出关于对话框 (IDD_ABOUTBOX在资源内)
break;
case IDM_FILE_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
g_hWndCommandBar = CommandBar_Create(g_hInst, hWnd, 1);
CommandBar_InsertMenubar(g_hWndCommandBar, g_hInst, IDR_MENU, 0);
CommandBar_AddAdornments(g_hWndCommandBar, 0, 0);
break;
case WM_PAINT://重新绘制客户区窗口
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd,&rect);//获取窗口位置坐标
// TODO: 在此添加任意绘图代码...
DrawText(hdc,TEXT("Hello WinCE"),-1,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//在屏幕上写字
EndPaint(hWnd, &ps);//已经处理了窗口中的客户区
break;
case WM_DESTROY://窗口销毁之前收到的消息
CommandBar_Destroy(g_hWndCommandBar);
PostQuitMessage(0);//将一条WM_QUIT消息放入消息队列
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
RECT rectChild, rectParent;
int DlgWidth, DlgHeight; // 以像素为单位的对话框宽度和高度
int NewPosX, NewPosY;
// 设法使“关于”对话框居中显示
if (GetWindowRect(hDlg, &rectChild))
{
GetClientRect(GetParent(hDlg), &rectParent);
DlgWidth = rectChild.right - rectChild.left;
DlgHeight = rectChild.bottom - rectChild.top ;
NewPosX = (rectParent.right - rectParent.left - DlgWidth) / 2;
NewPosY = (rectParent.bottom - rectParent.top - DlgHeight) / 2;
// 如果“关于”框比实际屏幕大
if (NewPosX < 0) NewPosX = 0;
if (NewPosY < 0) NewPosY = 0;
SetWindowPos(hDlg, 0, NewPosX, NewPosY,
0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
return (INT_PTR)TRUE;
case WM_COMMAND:
if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
case WM_CLOSE:
EndDialog(hDlg, message);
return TRUE;
}
return (INT_PTR)FALSE;
}