`
mmdev
  • 浏览: 12891510 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

【WinCE】 VS2005 创建WinCE工程中各个函数解析

 
阅读更多

一,创建过程

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;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics