大学刚毕业,之前只接触过一点linux,arm9。因为工作关系,突然要搞基于arm11的wince操作系统,一片茫然。当看到第一个程序的时候,头大了,句柄是什么?后来慢慢的,把这个简单的程序分析下来了。句柄是一种指针的指针,可以说是一个对象的标号一样。
HELLO.H
struct DecodeUnit {
UINT message;
LONG (*fun)(HWND hwnd,UINT message,WPARAM wParam,LPARAM);
};
#define dim(x) (sizeof(x)/sizeof(x[0]))
LONG OnDestroy(HWND hwnd,UINT message,WPARAM wParam,LPARAM);
LONG OnPaint(HWND hwnd,UINT message,WPARAM wParam,LPARAM);
HELLO.C
#include"HELLO.H"
#include <wingdi.h>
#include <Windows.h> //最基本的windows头文件,里面包含了其他头文件,有如下
//WINDEF.H 基本数据类型定义
//WINNT.H 支持Unicode的类型定义
//WINBASE.H Kernel(内核)函数。
//WINUSER.H 用户界面函数。
//WINGDI.H 图形设备接口函数。
struct DecodeUnit MainMessageProc[]={ //与消息有关的结构体,通过前面的消息,调用后面的函数
WM_DESTROY,OnDestroy,
WM_PAINT,OnPaint,
};
HINSTANCE g_hInst; //定义了一个全局的实例句柄
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); //消息的回调函数
int WINAPI WinMain(HINSTANCE hInstance, //主函数用的是WinMain,和标准C的main很像,参数也和标准C的 argvc,argc[v]很类似,
//第一个参数是本程序的句柄,第二个参数前一实例句柄,第三个参数参考标准C main
//函数句柄,第四个参数是窗口的显示方式,最大化最小化隐藏激活等等。。。
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
//1.创建一个窗体类
WNDCLASS ws;
ws.cbClsExtra = 0; //窗口类无扩展
ws.cbWndExtra = 0; //窗口实例无扩展
ws.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景为白色
ws.hCursor = NULL; // 窗口采用的光标
ws.hIcon = NULL; //窗口的最小化图标
ws.hInstance = hInstance; //当前实例句柄
ws.lpfnWndProc = WndProc;
ws.lpszClassName = TEXT("Hello"); //窗口类名为“窗口”
ws.lpszMenuName = NULL; //窗口无菜单
ws.style = CS_VREDRAW | CS_HREDRAW; //窗口显示风格,
//CS_HREDRAW当垂直长度改变或移动窗口时,重画整个窗口
//CS_VREDRAW当水平长度改变或移动窗口时,重画整个窗口
//2.注册窗体类
if (! RegisterClass(&ws)) return -1;
//3.创建窗体
HWND hwnd = CreateWindow(TEXT("Hello"),TEXT("HELLO"),WS_VISIBLE | WS_SYSMENU ,//用刚注册的窗体类创建一个窗体,类名要一致
0,0,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
//4.更新窗体内容
UpdateWindow(hwnd);
ShowWindow(hwnd,nCmdShow);
MSG msg;
//5.获取系统消息
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) //消息回调函数,参见下面头文件
{
for (int i = 0;i < dim(MainMessageProc);i++)
{
if (MainMessageProc[i].message == message)
(*MainMessageProc[i].fun)(hwnd,message,wParam,lParam);
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
LONG OnDestroy(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) //结束消息,关闭窗口
{
PostQuitMessage(1);
return TRUE;
}
LONG OnPaint(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps; //定义的结构体包含了应用程序用来绘制它所拥有的窗口客户区所需要的信息
HDC hdc; //定义设备描述句柄
RECT rect; //定义一个记录矩阵坐标像素的变量
GetClientRect(hwnd,&rect); //获得窗口的像素坐标
hdc = BeginPaint(hwnd,&ps); //开始绘图
DrawText(hdc,TEXT("hello world"),-1,&rect,DT_VCENTER | DT_CENTER); //TEXT是一个宏,可以自由识别转换编码方式
EndPaint(hwnd,&ps); //绘图结束,BeginPaint与EndPaint成对使用
}