亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? logwin.c

?? 在ecos 下mingui 的移植開發
?? C
字號:
// $Id: logwin.c,v 1.7 2000/11/17 07:02:01 ymwei Exp $//// logwin.c: implementation file of log window.//// Copyright (c) 2000, WEI Yongming// Copyright (C) 2000, BluePoint Software.//// Current maintainer: WEI Yongming.//// Create date: 2000.xx.xx/***  This library is free software; you can redistribute it and/or**  modify it under the terms of the GNU Library General Public**  License as published by the Free Software Foundation; either**  version 2 of the License, or (at your option) any later version.****  This library is distributed in the hope that it will be useful,**  but WITHOUT ANY WARRANTY; without even the implied warranty of**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU**  Library General Public License for more details.****  You should have received a copy of the GNU Library General Public**  License along with this library; if not, write to the Free**  Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,**  MA 02111-1307, USA*///// Modify records:////  Who             When        Where       For What                Status//-----------------------------------------------------------------------------//// TODO://#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <string.h>#include <pthread.h>#include <semaphore.h>#include <sys/stat.h>#include <sys/types.h>#include <unistd.h>#include <errno.h>#include "common.h"#include "minigui.h"#include "gdi.h"#include "window.h"#include "control.h"#include "logwin.h"typedef struct _LogWinCreateInfo{    HWND     log_win;    sem_t    wait;    BOOL     fVisible;    ONCLOSE  OnClose;    int      nr_rows;    int      nr_cols;    int      max_lines;} LOGWINCREATEINFO;#define MSG_LW_ADDTEXT     (MSG_USER + 1)#define MSG_LW_CLEANUP     (MSG_USER + 2)#define MAX_LENGTH_LINE	    100typedef struct tagTEXTLINE{    int     lineno;    char    text [MAX_LENGTH_LINE + 1];    struct  tagTEXTLINE* next;    struct  tagTEXTLINE* prev;} TEXTLINE;typedef TEXTLINE* PTEXTLINE;typedef struct _LogWinInfo{    int         vis_lines;      // number of visible lines in window    int         max_lines;      // maximal number of lines in window    int         last_line_nr;   // number of last line    PTEXTLINE   lines;          // pointer to text    PTEXTLINE   top_line;       // pointer to first visible line} LOGWININFO;typedef LOGWININFO* PLOGWININFO;#define line_count(info) min (info->max_lines, info->last_line_nr)static void logwinSetVScrollInfo (HWND log_win){    PLOGWININFO info;    SCROLLINFO si;    info = (PLOGWININFO)GetWindowAdditionalData2 (log_win);    if (info->vis_lines >= line_count (info)) {        SetScrollPos (log_win, SB_VERT, 0);        EnableScrollBar (log_win, SB_VERT, FALSE);        return;    }    si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;    si.nMax = line_count (info) - 1;    si.nMin = 0;    si.nPage = min (info->vis_lines, info->last_line_nr - info->top_line->lineno + 1);    si.nPos = info->top_line->lineno - info->lines->lineno;    SetScrollInfo (log_win, SB_VERT, &si, TRUE);    EnableScrollBar (log_win, SB_VERT, TRUE);}static PTEXTLINE next_n_line (PTEXTLINE line, int n){    int i;    for (i = 0; i < n && line; i++) {        line = line->next;    }    return line;}static PTEXTLINE prev_n_line (PTEXTLINE line, int n){    int i;    for (i = 0; i < n && line; i++) {        line = line->prev;    }    return line;}static void logwinOnVScroll (HWND log_win, int scroll_code, int new_pos){    PTEXTLINE top_line;    PLOGWININFO info;    int scroll_height = 0;    int line_height = GetCharHeight ();    int n;    info = (PLOGWININFO) GetWindowAdditionalData2 (log_win);    top_line = info->top_line;    switch (scroll_code) {    case SB_LINEDOWN:        if ((top_line->lineno + info->vis_lines) <= info->last_line_nr) {            top_line = top_line->next;            scroll_height = -line_height;        }        break;                    case SB_LINEUP:        if (top_line->lineno > info->lines->lineno) {            top_line = top_line->prev;            scroll_height = line_height;        }        break;                    case SB_PAGEDOWN:        if ((top_line->lineno + (info->vis_lines << 1)) <= info->last_line_nr)            n = info->vis_lines;        else            n = info->last_line_nr - info->vis_lines - top_line->lineno;        if (n == 0)            return;        top_line = next_n_line (top_line, n);        scroll_height = -(n * line_height);        break;    case SB_PAGEUP:        n = top_line->lineno - info->lines->lineno;        if (n > info->vis_lines)            n = info->vis_lines;        scroll_height = n * line_height;        top_line = prev_n_line (top_line, n);        break;    case SB_THUMBTRACK:        n = new_pos + info->lines->lineno - top_line->lineno;        if (n > 0)            top_line = next_n_line (top_line, n);        else if (n < 0)            top_line = prev_n_line (top_line, -n);        else            return;        scroll_height = -(n * line_height);        break;    }                if (scroll_height) {        info->top_line = top_line;        ScrollWindow (log_win, 0, scroll_height, NULL, NULL);        SendMessage (log_win, MSG_PAINT, 0, 0);        logwinSetVScrollInfo (log_win);        return;    }}static BOOL logwinAddTextLine (HWND log_win, const char* text, BOOL fUpdate){    PLOGWININFO info;    PTEXTLINE line;    PTEXTLINE oldline = NULL;    int nCharH = GetCharHeight ();    int top_lineno = 1;    PTEXTLINE top_next = NULL;    info = (PLOGWININFO)GetWindowAdditionalData2 (log_win);    if (info->last_line_nr >= info->max_lines) {        oldline = info->lines;        info->lines = info->lines->next;    }        if (!info->lines) {        if (oldline)            info->lines  = oldline;        else            info->lines = malloc (sizeof (TEXTLINE));        if (info->lines == NULL) {            info->lines = oldline;            return FALSE;        }        line = info->lines;        line->prev = NULL;    }    else {        line = info->lines;        while (line->next) {            line = line->next;        }                if (oldline)            line->next = oldline;        else            line->next = malloc (sizeof (TEXTLINE));        if (line->next == NULL) {            return FALSE;        }        line->next->prev = line;        line = line->next;    }    if (info->top_line) {        top_lineno = info->top_line->lineno;        top_next   = info->top_line->next;    }    strncpy (line->text, text, MAX_LENGTH_LINE);    line->text [MAX_LENGTH_LINE] = '\0';    line->next = NULL;    line->lineno = ++info->last_line_nr;    if (info->last_line_nr == 1)        info->top_line = info->lines;    if (fUpdate) {        RECT rcLine;        RECT rcClient;                if (info->last_line_nr >= (top_lineno + info->vis_lines)) {            info->top_line = top_next;            ScrollWindow (log_win, 0, -nCharH, NULL, NULL);            SendMessage (log_win, MSG_PAINT, 0, 0);        }        else {            // Get line output rect            GetClientRect (log_win, &rcClient);            rcLine.left   = rcClient.left;            rcLine.right  = rcClient.right;            rcLine.top    = rcClient.top + nCharH * (info->last_line_nr - top_lineno);            rcLine.bottom = rcLine.top + nCharH;                    InvalidateRect (log_win, &rcLine, FALSE);            SendMessage (log_win, MSG_PAINT, 0, 0);        }    }    logwinSetVScrollInfo (log_win);    return TRUE;}static void logwinDeleteContent (HWND log_win){    PLOGWININFO info;    PTEXTLINE line;    PTEXTLINE next;    info = (PLOGWININFO)GetWindowAdditionalData2 (log_win);    line = info->lines;    if (!line) return;    while (line) {        next = line->next;        free (line);        line = next;    }    info->lines = NULL;    info->last_line_nr = 0;}static void logwinOutLogWinText(HWND log_win, HDC hdc){    PLOGWININFO info;    PTEXTLINE line;    RECT rcClient;    RECT rcLine;    int iLine = 0;    int nCharH = GetCharHeight ();    info = (PLOGWININFO)GetWindowAdditionalData2 (log_win);    line = info->top_line;        GetClientRect (log_win, &rcClient);    SetTextColor (hdc, COLOR_lightwhite);    SetBkColor (hdc, COLOR_black);    while (line) {        char szLineNo [10];        rcLine.left = rcClient.left + 2;        rcLine.top = rcClient.top + nCharH*iLine;        rcLine.right = rcClient.right;        rcLine.bottom = rcLine.top + nCharH;                sprintf (szLineNo, "%06d", line->lineno);        TextOut (hdc, rcLine.left, rcLine.top, szLineNo);        TextOut (hdc, rcLine.left + GetCharWidth () * 6 + 4,                          rcLine.top, line->text);                line = line->next;        iLine++;    }}static int LogWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam){    switch (message) {    case MSG_CREATE:        EnableScrollBar (hWnd, SB_VERT, FALSE);        break;    case MSG_PAINT:    {        HDC hdc;        hdc = BeginPaint (hWnd);        logwinOutLogWinText(hWnd, hdc);        EndPaint (hWnd, hdc);    }    return 0;    case MSG_LW_ADDTEXT:        logwinAddTextLine (hWnd, (char*)lParam, TRUE);        break;    case MSG_LW_CLEANUP:        logwinDeleteContent (hWnd);        break;    case MSG_VSCROLL:        logwinOnVScroll (hWnd, (int)wParam, (int)lParam);        break;    case MSG_CLOSE:    {        ONCLOSE OnClose = (ONCLOSE) GetWindowAdditionalData (hWnd);        if (!OnClose || (*OnClose) (hWnd)) {            logwinDeleteContent (hWnd);            DestroyMainWindow (hWnd);            PostQuitMessage (hWnd);        }        break;    } // case    } // switch     return DefaultMainWinProc(hWnd, message, wParam, lParam);}static void logwinInitCreateInfo (PMAINWINCREATE pCreateInfo, int rows, int cols){    pCreateInfo->dwStyle = WS_THINFRAME | WS_VSCROLL | WS_CAPTION;    pCreateInfo->dwExStyle = WS_EX_NOCLOSEBOX;    pCreateInfo->spCaption = "Log Window";    pCreateInfo->hMenu = 0;    pCreateInfo->hCursor = GetSystemCursor(0);    pCreateInfo->hIcon = 0;    pCreateInfo->MainWindowProc = LogWinProc;    pCreateInfo->lx = 0;    pCreateInfo->ty = GetGDCapability (HDC_SCREEN, GDCAP_MAXY) - GetCharHeight () * rows - 1;    pCreateInfo->rx = pCreateInfo->lx + GetCharWidth () * cols + 2;    pCreateInfo->rx += GetMainWinMetrics (MWM_CXVSCROLL);    pCreateInfo->by = GetGDCapability (HDC_SCREEN, GDCAP_MAXY) + 1;    pCreateInfo->ty -= GetMainWinMetrics (MWM_CAPTIONY);    pCreateInfo->iBkColor = COLOR_black;    pCreateInfo->dwAddData = 0;    pCreateInfo->hHosting = HWND_DESKTOP;} static void* LogWindow (void* data){    MSG Msg;    MAINWINCREATE CreateInfo;    HWND hMainWnd;    LOGWINCREATEINFO* LogWinCreateInfo = (LOGWINCREATEINFO*)data;    LOGWININFO info;    RECT rcClient;    if (LogWinCreateInfo->nr_rows <= 0)        LogWinCreateInfo->nr_rows = 1;    if (LogWinCreateInfo->nr_cols <= 0)        LogWinCreateInfo->nr_cols = 1;    logwinInitCreateInfo (&CreateInfo,             LogWinCreateInfo->nr_rows, LogWinCreateInfo->nr_cols);    if (LogWinCreateInfo->fVisible)        CreateInfo.dwStyle |= WS_VISIBLE;    CreateInfo.dwAddData = (DWORD)(LogWinCreateInfo->OnClose);    hMainWnd = CreateMainWindow (&CreateInfo);    LogWinCreateInfo->log_win = hMainWnd;    info.vis_lines  = LogWinCreateInfo->nr_rows;    info.max_lines  = (LogWinCreateInfo->max_lines > LogWinCreateInfo->nr_rows) ?                         LogWinCreateInfo->max_lines : LogWinCreateInfo->nr_rows;    info.last_line_nr  = 0;    info.lines   = NULL;    info.top_line= NULL;    sem_post (&LogWinCreateInfo->wait);    if (hMainWnd == HWND_INVALID)        return NULL;    GetClientRect (hMainWnd, &rcClient);    SetWindowAdditionalData2 (hMainWnd, (DWORD)(&info));    while( GetMessage (&Msg, hMainWnd) ) {        DispatchMessage (&Msg);    }    MainWindowThreadCleanup (hMainWnd);    return NULL;}HWND CreateLogWin (BOOL fVisible, ONCLOSE OnClose, int nr_rows, int nr_cols, int max_lines){    LOGWINCREATEINFO LogWinCreateInfo;    pthread_t th;    if (nr_rows < 3 || nr_cols < 3)        return HWND_INVALID;    sem_init (&LogWinCreateInfo.wait, 0, 0);    LogWinCreateInfo.fVisible = fVisible;    LogWinCreateInfo.OnClose  = OnClose;    LogWinCreateInfo.nr_rows  = nr_rows;    LogWinCreateInfo.nr_cols  = nr_cols;    LogWinCreateInfo.max_lines = max_lines;    CreateThreadForMainWindow (&th, NULL, LogWindow, &LogWinCreateInfo);    sem_wait (&LogWinCreateInfo.wait);    sem_destroy (&LogWinCreateInfo.wait);    return LogWinCreateInfo.log_win;} void DestroyLogWin (HWND log_win){    SendMessage (log_win, MSG_CLOSE, 0, 0);}void LogMessage (HWND log_win, const char* format, ...){    char text [MAX_LENGTH_LINE + 1];    va_list args;    va_start (args, format);    vsnprintf (text, MAX_LENGTH_LINE, format, args);    va_end (args);    SendMessage (log_win, MSG_LW_ADDTEXT, 0, (LPARAM)text);}int IsLogWinVisible (HWND log_win){    if (log_win == HWND_INVALID)        return -1;    if (IsWindowVisible (log_win))        return 1;    return 0;}void ToggleLogWin (HWND log_win){    switch (IsLogWinVisible (log_win)) {    case 0:        ShowWindow (log_win, SW_SHOW);        break;    case 1:        ShowWindow (log_win, SW_HIDE);        break;    }}void DumpAllLogMessages (HWND log_win, FILE* fp){    PLOGWININFO info;    PTEXTLINE line;    info = (PLOGWININFO)GetWindowAdditionalData2 (log_win);    line = info->lines;    while (line) {        fprintf (fp, "%s\n", line->text);        line = line->next;    }}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区在线视频| 精东粉嫩av免费一区二区三区 | 国产日韩一级二级三级| 欧美日韩亚洲综合一区二区三区| caoporn国产一区二区| 97se亚洲国产综合自在线 | 中文字幕一区二区不卡| 国产人成亚洲第一网站在线播放| 国产精品视频免费| 亚洲国产日韩一级| 亚洲午夜av在线| 亚洲成av人片一区二区梦乃| 亚洲h在线观看| 美国毛片一区二区| 国产精品影视天天线| 岛国精品在线播放| 91碰在线视频| 3d动漫精品啪啪1区2区免费| 精品少妇一区二区三区在线播放| 精品欧美一区二区久久| 国产日韩欧美在线一区| 亚洲日本va在线观看| 日韩不卡一区二区三区 | 丰满岳乱妇一区二区三区 | 亚洲宅男天堂在线观看无病毒 | 精品欧美乱码久久久久久| 久久久影视传媒| 亚洲码国产岛国毛片在线| 午夜久久福利影院| 国产成人精品在线看| 在线观看日韩一区| 精品美女在线播放| 亚洲欧美日本韩国| 久久黄色级2电影| 91天堂素人约啪| 日韩欧美一区二区在线视频| 中文字幕亚洲综合久久菠萝蜜| 亚洲国产成人va在线观看天堂| 激情六月婷婷久久| 欧美日韩亚洲综合在线| 国产欧美视频一区二区| 亚洲成av人片www| av一本久道久久综合久久鬼色| 欧美一区二区视频在线观看2022| 久久九九久久九九| 日韩电影网1区2区| 色综合久久综合| 国产三级久久久| 另类人妖一区二区av| 色婷婷亚洲精品| 久久久国产精品不卡| 日韩精品一级中文字幕精品视频免费观看 | 亚洲精品国产精品乱码不99 | 中日韩av电影| 久久国产精品第一页| 欧美主播一区二区三区| 国产精品久久久久桃色tv| 久久99久久99| 日韩一级黄色片| 五月天网站亚洲| 欧美色精品天天在线观看视频| 国产精品久久久久影院老司| 精品一区二区三区在线视频| 欧美日韩国产影片| 亚洲影视在线观看| 色美美综合视频| 亚洲视频 欧洲视频| 99国产精品一区| 综合色天天鬼久久鬼色| 成人国产一区二区三区精品| 日韩女优毛片在线| 久久99精品久久久久久国产越南 | 欧美在线一二三| 亚洲精品久久嫩草网站秘色| jizz一区二区| 亚洲日本va午夜在线电影| 99re视频精品| 亚洲精品水蜜桃| 欧美色综合网站| 日韩精品色哟哟| 欧美大片在线观看| 国产一区二三区| 国产精品色婷婷| 色噜噜狠狠成人中文综合 | 精品理论电影在线| 久久激情五月婷婷| 中文字幕av免费专区久久| 成人性生交大片免费| 国产精品久久久久影院亚瑟| 色综合中文字幕国产| 亚洲欧洲美洲综合色网| 国产精品影音先锋| 亚洲免费在线观看视频| 欧美精品在线观看播放| 免费观看成人鲁鲁鲁鲁鲁视频| 精品少妇一区二区三区日产乱码 | 国产一区二区三区不卡在线观看 | 4438亚洲最大| 国产麻豆视频一区二区| 一区二区中文视频| 欧美精品一卡两卡| 成人夜色视频网站在线观看| 一区二区三区免费观看| 91麻豆精品久久久久蜜臀| 国产福利精品一区| 亚洲综合精品自拍| 26uuu亚洲综合色| 91色乱码一区二区三区| 日本不卡高清视频| 自拍偷自拍亚洲精品播放| 在线播放中文一区| 99视频有精品| 美女看a上一区| 一区二区三区中文免费| 日韩精品最新网址| 日本精品视频一区二区| 精品一区二区三区不卡| 亚洲精品写真福利| 亚洲国产高清aⅴ视频| 欧美精选一区二区| 99在线热播精品免费| 久久av老司机精品网站导航| 一区二区三区不卡视频 | 丰满少妇久久久久久久| 日韩中文字幕麻豆| 亚洲另类一区二区| 国产欧美日韩综合精品一区二区| 欧美一区中文字幕| 欧美亚洲一区三区| 99久久99久久精品国产片果冻| 久久精品理论片| 三级亚洲高清视频| 一区二区三区四区不卡视频 | 91精品国产综合久久久久久漫画 | 久久国产精品一区二区| 一区二区三区在线视频播放 | 91精品国模一区二区三区| 91麻豆.com| 99久久精品国产导航| 国产精品主播直播| 国产一区美女在线| 狠狠色丁香久久婷婷综| 日本不卡123| 蜜桃视频在线一区| 日本视频中文字幕一区二区三区| 一区二区三区中文免费| 亚洲免费观看高清完整版在线 | 欧美日韩国产高清一区二区三区 | 99久久精品国产毛片| 成人av网站免费观看| 国产风韵犹存在线视精品| 黄色日韩三级电影| 麻豆精品在线看| 老司机精品视频一区二区三区| 午夜不卡av免费| 日本vs亚洲vs韩国一区三区| 蜜桃视频一区二区三区| 国产做a爰片久久毛片| 精品一区二区av| 国产福利一区二区三区视频在线 | 亚洲精品一二三| 一级做a爱片久久| 亚洲成a人v欧美综合天堂| 午夜精品一区在线观看| 五月婷婷综合网| 美女视频黄频大全不卡视频在线播放| 免费成人美女在线观看.| 黄色资源网久久资源365| 成人a级免费电影| 色综合久久久久综合体桃花网| 日本高清不卡一区| 91精品欧美一区二区三区综合在| 91精品麻豆日日躁夜夜躁| 久久无码av三级| 国产精品久久久一本精品 | 91原创在线视频| 欧美日韩一区二区三区四区五区 | 秋霞av亚洲一区二区三| 久久69国产一区二区蜜臀| 丁香网亚洲国际| 欧美熟乱第一页| 精品国免费一区二区三区| 国产精品国产三级国产普通话99 | 一区2区3区在线看| 久99久精品视频免费观看| 成人性视频网站| 欧美日韩免费电影| 国产女人18水真多18精品一级做 | 日韩小视频在线观看专区| 国产区在线观看成人精品| 亚洲免费观看视频| 精品在线播放免费| 色天使久久综合网天天| 精品国产乱码久久久久久1区2区| 国产精品家庭影院| 国内精品伊人久久久久av一坑| 色综合久久中文字幕综合网 | 欧美中文字幕一二三区视频| 欧美精品一区二区在线播放| 亚洲女厕所小便bbb|