一,创建过程
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;
}
分享到:
相关推荐
vs2005的工程,wince下的非规则对话框,好用
VS2005 WINCE 6.0 安装 指导VS2005 WINCE 6.0 安装 指导VS2005 WINCE 6.0 安装 指导VS2005 WINCE 6.0 安装 指导
在给控件添加类以后我没有在文件中找到有初始化的函数,由于是初学,很多东西不太懂,整了好久才弄明白怎么添加初始化函数OnInitDialog()
1. 微软.Visual.Studio.2005.英文专业版 2. WINCE 6.0 3. WINCE 6.0 R2 4. WINCE 6.0 R3 5. Windows Embedded CE 6.0 Platform Builder Service Pack 1 6. Update: WinCEPB60-061231-Product-Update-Rollup-Armv4I ...
一份ARM11 S3C6410 搭建WINCE6.0与VS2005开发环境的详细说明书,按照这个说明,一定能够搭建好WINCE6.0与VS2005开发环境,我就是按照这个一步步搭建进来的
WinCE5.0中文模拟器SDK(VS2005)
WINCE5.0模拟器 用于VS2005编程
目前权限只能上传45MB大小的文件,只能分包压缩上传了,需要用的请将两个压缩包都下载下来再解压缩。
如何用VS2005或者2008开发wince应用程序!
[转]在Windows 7操作系统下,使用VS2005/2008开发WinCE智能设备应用程序的时候,识别不到机器上已经安装好了的WinCE5 SDK。问题解决后,将搜集的资料做一下总结。
应用vs2005开发wince系统中的应用程序
WinCE中串口驱动及接口函数介绍 pdf
收集了winCE开发的API函数资料,希望多相关开发人员有帮助。
wince播放声音函数,可以直接添加到项目中使用。
详细的代码注释,wince系统下串口通信收发程序,实现串口调试助手功能,可通过设置嵌入式设备串口号及波特率等参数接收下位机发送数据以及给下位机发送数据指令,另增加wince下对话框背景图片的增加
如何在VS2005下使用WINCE,新手必看!
C#开发wince程序中vs2005无法启动调试解决方案
wince下的全国车牌查询系统(vs2005全套工程文件)
1.Win7_X64+VS2005+WinCE5.0开发环境搭建; 2.如有问题,联系chanior2005@gmail.com