(3)码一个Zeta Linux应用程序

一、前言

像我们学习一门编语言那样,从码一个hello world应用程序开始我们的Zeta Linux之旅!嵌入式产品常伴有带显示与不带显示之分,即使同一类产品,也会存在是否有显示的形态差异。比如行车记录仪,有带显示屏的小机及后视镜,也有不带显示屏的口红机及隐藏式记录仪。下文将展示如何编写一个不含GUI的在终端窗口打印hello world的程序,以及一个包含嵌入式GUI的在显示屏上通过GUI控制显示hello world的程序。

二、终端程序

一个Zeta Linux程序/模块至少包含两部分,Makefile文件zeta.in以及源码文件。本例中,应用程序名字为demo_terminal_helloworld,创建相应的文件:

cd ZetaLinux/app
mkdir demo_terminal_helloworld/
touch zeta.in main.c

编写Makefile文件:

TARGET_PATH:= $(call my-dir)
include $(CLEAR_VARS)

TARGET_INC:= 
TARGET_SRC:= main.c
TARGET_CPPFLAGS += -fPIC -Wall
TARGET_CFLAGS += -fPIC -Wall
TARGET_MODULE := demo_terminal_helloworld

include $(BUILD_BIN)

编写源码文件:

#include <stdio.h>
#include<stdlib.h>

int main()
{
    printf("hello world.\n");
}

编译应用程序:

cd ZetaLinux/app/demo_terminal_helloworld
zmake zeta.in

将编译生成的可执行文件通过adb推送到设备里面运行,可在终端输出"hello world."。

三、GUI程序

Zeta Linux支持多种GUI引擎,目前在Zeta上顺利运行使用的GUI有MiniGUI、DireceFB、QT、LittlevGL。本例中使用MiniGUI。使用MiniGUI需要在zeta.in中显式指定程序所用的MiniGUI动态库,zeta.in如下:

TARGET_PATH :=$(call my-dir)

include $(ENV_CLEAR)

TARGET_SRC := ./main.c

TARGET_SHARED_LIB += libminigui_ths

TARGET_MODULE := demo_gui_helloworld

include $(BUILD_BIN)

编写源码文件,在窗口中输出Hello world!

#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <sys/time.h>

static BITMAP bmp_bkgnd;

static int HelloWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	static HWND hwnd;
	static int i = 0;
	switch (message)
	{
		case MSG_PAINT:
		{
			hdc = BeginPaint (hWnd);
			TextOut (hdc, 320 / 2 - 50, 240 / 2 - 10, "Hello world!");
			EndPaint (hWnd, hdc);
			return 0;
		}
		case MSG_CREATE:
		{
			hwnd = CreateWindowEx(
									"static", "", WS_CHILD | WS_VISIBLE, 
									WS_EX_NONE, 123, 0, 0, 50, 50, hWnd, NULL
								);
			SetWindowBkColor(hwnd, RGBA2Pixel(HDC_SCREEN, 0x00, 0x00, 0xff, 0x10));
			break;
		}
		case MSG_CLOSE:
		{
			DestroyMainWindow (hWnd);
			PostQuitMessage (hWnd);
			return 0;
		}
	}
	return DefaultMainWinProc (hWnd, message, wParam, lParam);
}

int MiniGUIMain(int argc, const char* argv[])
{
	MSG Msg;
	HWND hMainWnd;
	MAINWINCREATE CreateInfo;
	#ifdef _MGRM_PROCESSES
	JoinLayer (NAME_DEF_LAYER , "helloworld" , 0 , 0);
	#endif
	CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
	CreateInfo.dwExStyle = WS_EX_NONE;
	CreateInfo.spCaption = "HelloWorld";
	CreateInfo.hMenu = 0;
	CreateInfo.hCursor = GetSystemCursor (0);
	CreateInfo.hIcon = 0;
	CreateInfo.MainWindowProc = HelloWinProc;
	CreateInfo.lx = 0;
	CreateInfo.ty = 0;
	CreateInfo.rx = 320;
	CreateInfo.by = 240;
	CreateInfo.iBkColor = RGBA2Pixel(HDC_SCREEN, 0xff, 0xff, 0xff, 0x00);
	CreateInfo.dwAddData = 0;
	CreateInfo.hHosting = HWND_DESKTOP;
	hMainWnd = CreateMainWindow (&CreateInfo);

	if(hMainWnd == HWND_INVALID)
		return -1;
	ShowWindow (hMainWnd, SW_SHOWNORMAL);
	
	while (GetMessage (&Msg, hMainWnd))
	{
		fprintf(stderr, "msg\n");
		TranslateMessage (&Msg);
		DispatchMessage (&Msg);
	}
	UnloadBitmap(&bmp_bkgnd);
	MainWindowThreadCleanup (hMainWnd);
	return 0;
}
#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif

将编译生成的可执行文件通过adb推送到设备里面运行,可在显示屏上显示"hello world."。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值