一,创建过程
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; }