文章目录

  • 一、窗口过程和句柄是什么?
  • 二、helloworld代码部分以及部分代码的解释

一、窗口过程和句柄是什么?


提示:以下是本篇文章正文内容

1、窗口过程是什么?

窗口过程是一个特定类型的函数,用来接收和处理所有发送到该窗口的消息。每个控件类都有一个窗口过程,属于同一控件类的所有控件共用一个窗口过程来处理消息。窗口过程函数是MiniGUI程序的主体部分,应用程序实际所做的工作大部分都发生在窗口过程函数中,因为MiniGUI程序的主要任务就是接收和处理窗口收到的各种消息。窗口过程函数由MiniGUI调用,是一个回调函数。

窗口过程函数一般定义的形式:

static int HelloWinPro(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)

        hWnd:接收消息的窗口的句柄,与CreateMainWindow函数的返回值相同,该值标识了接收该消息的特定窗口。(何为句柄? 下面会说)

        message:与MSG结构中的message域相同,是一个标识窗口所收到消息的整数值。

        wParam和IParam:都是32位的消息参数。

2、句柄是什么?

        句柄(Handle)是一个用来标识对象或项目的标识符,可以用来描述窗体、文件等。在 MiniGUI 中,使用句柄访问窗口、控件、菜单、图标等。

eg: 窗口句柄:是用来标识窗口的唯一值。每个窗口都对应一个句柄,所有的句柄都不会重复,根据句柄可以获取对应窗口的相关信息。

二、代码部分

1.helloworld代码部分

#include <stdio.h>
#include <minigui/common.h>   //包括MiniGUI常用的宏以及数据类型的定义
#include <minigui/minigui.h>  //包含全局接口函数和通用接口函数以及某些杂项函数的定义
#include <minigui/gdi.h>      //包含MiniGUI绘图函数的接口定义
#include <minigui/window.h>    //包含窗口有关的宏、数据类型、数据结构定义以及函数接口声明
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)//窗口过程函数
{HDC hdc;switch (message) {case MSG_PAINT:                //该消息在需要进行窗口重绘时发送到窗口过程,处理完该消息后    直接返回hdc = BeginPaint (hWnd);       //获取设备上下文句柄//TextOut (hdc, 100, 100, "Hello world!");//文本的输出SetPenColor(hdc, PIXEL_red);Rectangle (hdc, 100, 100, 200, 200);EndPaint (hWnd, hdc);           //释放设备上下文句柄return 0;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 _LITE_VERSIONSetDesktopRect(0, 0, 800, 600);#endifCreateInfo.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 = COLOR_lightwhite;CreateInfo.dwAddData = 0;CreateInfo.hHosting = HWND_DESKTOP;hMainWnd = CreateMainWindow (&CreateInfo);if (hMainWnd == HWND_INVALID)return -1;ShowWindow(hMainWnd, SW_SHOWNORMAL);while (GetMessage(&Msg, hMainWnd)) {TranslateMessage(&Msg);DispatchMessage(&Msg);}MainWindowThreadCleanup (hMainWnd);return 0;
}
#ifndef _LITE_VERSION
#include <minigui/dti.c>
#endif

2.部分代码解释

PostQuitMessage (hWnd);       

      该消息在消息队列中设置一个QS_QUIT标志。GetMessage在从指定消息队列中获取消息时,会检查该标准,如果有QS_QUIT标志,GetMessage消息将返回FALSE,从而可以利用该返回值终止消息循环 。

SetDesktopRect(0, 0, 800, 600);

        在MiniGUI-Lite版本中,每个MiniGUI客户端程序在调用其它MiniGUI函数之前必须调用该函数以设置程序的桌面显示矩形区域。

CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;

CreateInfo.dwStyle——窗口的风格。

WS_VISIBLE——创建⼀个初始状态为可见的窗⼝

WS_BORDER——创建⼀个单边框的窗⼝

WS_CAPTION——标题栏

CreateInfo.dwExStyle = WS_EX_NONE;

 CreateInfo.dwExStyle——窗口的附加风格。

 WS_EX_NONE——表示无附加窗口风格

CreateInfo.spCaption = "HelloWorld";

CreateInfo.spCaption ——窗口的标题。

CreateInfo.hMenu = 0;

  CreateInfo.hMenu——附加在窗口上的菜单句柄,设置窗口的主菜单

  CreateInfo.hMenu = 0;表示该窗口无主菜单

CreateInfo.hCursor = GetSystemCursor(0);

  CreateInfo.hCursor—— 在窗口中所使用的鼠标光标句柄

  GetSystemCursor(0);——设置主窗口的光标为系统缺省光标。(即系统默认的光标)

CreateInfo.hIcon = 0;

CreateInfo.hIcon ——程序的图标 

  CreateInfo.hIcon = 0;表示该窗口没有图标

CreateInfo.MainWindowProc = HelloWinProc;

   CreateInfo.MainWindowProc= HelloWinProc ——设置主窗口的过程函数为HelloWinProc,发往该  窗口的消息由该函数处理

    CreateInfo.lx = 0;CreateInfo.ty = 0;CreateInfo.rx = 320;CreateInfo.by = 240;

 设置窗口在屏幕的位置,该窗口左上角位于(0,0),右下角位于(320,240).

    CreateInfo.lx——窗口左上角相对屏幕的绝对横坐标
    CreateInfo.ty ——窗口左上角相对屏幕的绝对纵坐标
    CreateInfo.rx ——窗口右下角相对屏幕的绝对横坐标
    CreateInfo.by ——窗口右下角相对屏幕的绝对纵坐标

CreateInfo.iBkColor = COLOR_lightwhite;

 CreateInfo.iBkColor——设置窗口的背景颜色

 CreateInfo.iBkColor = COLOR_lightwhite;表示设置主窗口的颜色为白色

CreateInfo.dwAddData = 0;

  CreateInfo.dwAddData ——窗口的附加数据

  CreateInfo.dwAddData = 0; 表示窗口无附加数据

CreateInfo.hHosting = HWND_DESKTOP;

 CreateInfo.hHosting——设置主窗口的托管窗口

 CreateInfo.hHosting = HWND_DESKTOP;表示设置主窗口的托管窗口为桌面窗口

 ShowWindow(hMainWnd, SW_SHOWNORMAL);

  显示窗口;

        第一个参数为所要显示的窗口的窗口句柄,第二个参数指明显示方式(显示或者隐藏,SW_SHOWNORMAL说明要显示主窗口,并把它置为顶窗口)。 调用ShowWindow函数后主窗口会出现在屏幕上,之后便进入消息循环

TranslateMessage(&Msg);

 TranslateMessage函数把击键消息转化为MSG_CHAR消息,然后直接发送到窗口过程函数。

 DispatchMessage(&Msg);

DispatchMessage函数最终将把消息发往该消息的目标窗口过程,让它进行处理。

 MainWindowThreadCleanup (hMainWnd);

清除主窗口所使用的消息队列、内存等系统资源,并由MiniGUIMain返回。

参考资料———《MiniGUI编程指南》

MiniGUI——第一个程序helloworld相关推荐

  1. actionscript 3.0 怎么写android 程序,(ActionScript3.0笔记)第一个程序HelloWorld!

    (ActionScript3.0笔记)第一个程序HelloWorld! 创建我的第一个ActionScript3.0程序--HelloWord! 首先下载ActionScript3.0的集成开发环境, ...

  2. 2018年9月28日第一个程序HelloWorld

    A编写第一个程序 HelloWorld public class HelloWorld { //一个文件只能有一个public的class // 一个文件中可以有多个类,但是只能有一个公开的类 pub ...

  3. java怎么开始学dos,第一阶段-Java基础知识:【第一章 DOS命令与开发环境的配置 + 第一个程序HelloWorld】...

    加油Ideal星河滚烫  你是人间理想 第一阶段 JAVA基础知识 第一章 开发环境的配置 Dos 命令 在正式进入Java学习之前我们来了解一个看起来B格很高的东西--Dos命令 DOS命令,计算机 ...

  4. 【Spring 4.0】Spring入门之第一个程序HelloWorld实现

    一.什么是Spring? Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache License 2.0开源许可协议的形式 ...

  5. java第一个程序编译失败,零基础java第一个程序HelloWorld,编译,环境变量,运行,注释...

    1.开发第一个java程序:HelloWorld public class HelloWorld{ // 这是一个类,类名叫做HelloWorld public static void main(St ...

  6. JAVA 第一个程序“HelloWorld”

    大三上学期我们开设了"JAVA程序设计"这门课程,所用的教材是Bruce Eckel的<Java编程思想>也就是<Thinking in Java Fourth ...

  7. java学习笔记1:第一个程序HelloWorld

    public class HelloWorld{/**该方法是程序的入口*/public static void main(String[] args){//这是一个输出语句System.out.pr ...

  8. java游戏一开始去山上打狐狸_。。。这才是Java的第一个程序------HelloWorld

    这个是别人程序的错误,拿来给自己借鉴一下,以免发生同样的错误 不多说了...看程序 class   helloworld   { public   static   void   main   (St ...

  9. Servlet的第一个程序HelloWorld

    如果按照本流程,一定可以完成自己的第一个servlet程序. 首先Tomcat要安装好,在Tomcat的webapps文件夹下建立自己的项目,我这里取名为my,按照servlet的规则,项目下必须有一 ...

最新文章

  1. android app 自动更新,AndroidUpdateDemo
  2. 计算机辅助园林设计ps,计算机辅助园林设计III
  3. python操作Excel的5种方式
  4. Android中edittext一些属性设置
  5. for(;;)是什么,for(;;)的作用
  6. 什么叫大地高_涨得高不是不买的理由,更不是卖出的理由,什么叫追涨杀跌?(附最简单选股方法)---交易那些事儿...
  7. MySQL的学习--触发器
  8. java(IO)读写文件乱码转换UTF-8问题
  9. Storm精华问答 | 为什么要用Storm?不用Spark?
  10. java中异常+连接重置_java.net.SocketException:连接重置
  11. 框架-vue-cli
  12. 一级指针易犯错误模型
  13. 属性动画和补间动画的原理及区别
  14. Qt Android treeWidget树状单击展开
  15. ZigBee Routing Tables 路由表
  16. 保研经验贴 某不知名211上岸华南理工大学
  17. Python+Excel 华尔街的一股清流
  18. 【Linux】Linux目录
  19. Micro(二)[环境搭建]
  20. Angular4中使用DomSanitizer

热门文章

  1. 安霸Ambarella CV系列芯片
  2. AWS Route53里使用Godady注册的域名
  3. vue集成汉字转拼音并提取首字母
  4. 未来第五代计算机的发展方向,走进新时代 从五代酷睿看未来电脑发展
  5. Thingworx 调用外部接口
  6. 在Win10下搭建web服务器,使用本机IP不能访问,但是使用localhos或127.0.0.1可以正常访问的解决办法...
  7. 速度与压缩比如何兼得?压缩算法在构建部署中的优化
  8. Typora 常用快捷键
  9. php怎么压缩文件夹,PHP压缩文件夹 php
  10. Unity 的 Scroll View组件