您尚未登录。

楼主 #1 2020-04-18 21:25:13

ffplay
会员
注册时间: 2019-08-31
已发帖子: 92
积分: 92

MiniGui使用,每隔一秒在静态框中显示系统时间,有时会闪一下,有大佬看看代码哪有问题吗,官方的例子

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>

#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>

#define _ID_TIME_STATIC     110
#define _ID_TIMER           100

static PLOGFONT logfont_rbf_gb12_song,logfont_rbf_gb16_song;//创建逻辑字体

static char* mk_time (char* buff)
{
    time_t t;
    struct tm * tm;

    time (&t);
    tm = localtime (&t);
    sprintf (buff, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec);

    return buff;
}

static int TaskBarWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
    char buff [20];
    HDC hdc,timeedit;

    switch (message) {
    case MSG_CREATE:
    {
        timeedit=CreateWindow (CTRL_STATIC, mk_time (buff), WS_CHILD | WS_BORDER | WS_VISIBLE | SS_CENTER,_ID_TIME_STATIC,0, 550, 284, 50, hWnd, 0);
        logfont_rbf_gb12_song = CreateLogFont("ttf", "simsun", "UTF-8",
                FONT_WEIGHT_DEMIBOLD, FONT_SLANT_ROMAN,
                FONT_FLIP_NIL, FONT_OTHER_AUTOSCALE,
                FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 40, 0);
        logfont_rbf_gb16_song = CreateLogFont ("rbf", "song", "GB2312-0",
                FONT_WEIGHT_BOOK, FONT_SLANT_ROMAN,
                FONT_FLIP_NIL, FONT_OTHER_AUTOSCALE,
                FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,
                32, 0);
        SetWindowFont (timeedit, logfont_rbf_gb16_song);
        SetTimer (hWnd, _ID_TIMER, 100);
        break;
    }
    break;

    case MSG_TIMER:
    {
        SetDlgItemText (hWnd, _ID_TIME_STATIC, mk_time (buff));
        break;
    }
       
    case MSG_CLOSE:
        KillTimer (hWnd, _ID_TIMER);
        DestroyAllControls (hWnd);
        DestroyMainWindow (hWnd);
        PostQuitMessage (hWnd);
        return 0;
    }

    return DefaultMainWinProc (hWnd, message, wParam, lParam);
}

int MiniGUIMain  (int argc, const char* argv[])
{
    MAINWINCREATE CreateInfo;
    HWND hMainWnd;
    MSG Msg;

    CreateInfo.dwStyle = WS_ABSSCRPOS | WS_VISIBLE|WS_CAPTION;
    CreateInfo.dwExStyle = WS_EX_TOOLWINDOW;
    CreateInfo.spCaption = "TaskBar" ;
    CreateInfo.hMenu = 0;
    CreateInfo.hCursor = GetSystemCursor (0);
    CreateInfo.hIcon = 0;
    CreateInfo.MainWindowProc = TaskBarWinProc;
    CreateInfo.lx = 0;
    CreateInfo.ty = 0;
    CreateInfo.rx = 1024;
    CreateInfo.by = 600;
    CreateInfo.iBkColor = PIXEL_black;
    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 _MGRM_PROCESSES
#include <minigui/dti.c>
#endif

离线

楼主 #4 2020-04-22 09:24:33

ffplay
会员
注册时间: 2019-08-31
已发帖子: 92
积分: 92

Re: MiniGui使用,每隔一秒在静态框中显示系统时间,有时会闪一下,有大佬看看代码哪有问题吗,官方的例子

novice 说:

试试这样:
CreateInfo.dwExStyle = WS_EX_TOOLWINDOW | WS_EX_CLIPCHILDREN;

感谢前辈们的评论,这个我看文档写的影响绘图效率就没加,不过问题我找到了:
首先官方3.0文档定时器例子部分代码确实有问题,其中少了一个大括号,其次这段程序也许在x86上跑不会出现问题(本地环境没搭所以没测,直接上板子),但是低端嵌入式产品绘制的时候文字带背景绘图就会在定时绘图的情况下绘图出现文字背景的噪点,只要是字符串都有这毛病(是不是时间无关),将文字背景改成透明的就行了,用什么写字的API都可以。
minigui用的人是不是太少了,网上讨论的帖子也很旧,多来些大佬讨论讨论哈哈

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn