controlpanel.c

来自「MDE 图形引擎」· C语言 代码 · 共 463 行

C
463
字号
/***************************************************************************** $Id: controlpanel.c,v 1.7 2003/05/20 02:21:17 weiym Exp $**                        controlpanel.c  -  description**                           -------------------**  begin                : Tue Jan 16 2001**  copyright            : (C) 2001 by 冯大可**  email                : minx@thtfchain.com****************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#include <sys/time.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <pthread.h>#include <semaphore.h>#include <popt.h>#include <unistd.h>#include <minigui/common.h>#include <minigui/minigui.h>#include <minigui/gdi.h>#include <minigui/window.h>#include <minigui/control.h>#include <minigui/mywindows.h>#include <minigui/filedlg.h>#include "controlpanel.h"#include "panels.h"int myLoadBitmap (BITMAP* bm, const char* filename){    char full_path [MAX_PATH + 1];#if 0    static char res_dir [MAX_PATH + 1] = {'\0'};    if (res_dir [0] == '\0') {        if (GetValueFromEtcFile (ETCFILEPATH, "appinfo", "apprespath",            res_dir, MAX_PATH) < 0)            strcpy (res_dir, "res/");    }    strcpy (full_path, res_dir);    if (full_path [strlen (full_path) - 1] != '/')        strcat (full_path, "/");    strcat (full_path, "controlpanel/");    strcat (full_path, filename);#else    strcpy (full_path, "./res/");    strcat (full_path, filename);#endif    return LoadBitmap (HDC_SCREEN, bm, full_path);}void AboutLaodan (HWND hParent){    MessageBox (hParent,          "老聃 (laodan), 本名李耳, 道家创始人"            "著有道德二篇, 清净无为以治万物.\n\n"            "本系统设计目的是试图寻找 MiniGUI "            "系统的应用前景, 并在制作中寻找方便的开发方法与工具.\n\n"            "作者喜爱先秦哲学, 诸子百家之言, 每下工夫制作一新系统, "            "必以一子为名. "            "故作者在 MiniGUI 上的工作均以老聃 (Laodan) 为代名.",            "老聃",          MB_OK | MB_ICONINFORMATION);}void AboutControlPanel (HWND hParent){    MessageBox (hParent,      "其实熟悉 MINIGUI 的朋友都可以通过直接修改参数文件来设置MINIGUI。\n\n"      "出于完善图形界面系统的功能的原因, 我制作了这个面板,并加入了一些我认为"      "在未来会添加进来的功能, 顺便排除系统BUG.\n\n"      "            --冯大可 minx@thtfchain.com\n"      "                   (or frankcd@263.net)",      "控制面板",      MB_OK | MB_ICONINFORMATION);}static HMENU createpmenuabout (void){    HMENU hmnu;    MENUITEMINFO mii;    memset (&mii, 0, sizeof(MENUITEMINFO));    mii.type        = MFT_STRING;    mii.id          = 0;    mii.typedata    = (DWORD)"帮助";    hmnu = CreatePopupMenu (&mii);    memset (&mii, 0, sizeof(MENUITEMINFO));    mii.type        = MFT_STRING ;    mii.state       = 0;    mii.id          = IDM_ABOUT_THIS;    mii.typedata    = (DWORD)"关于控制面板...";    InsertMenuItem(hmnu, 0, TRUE, &mii);    memset (&mii, 0, sizeof(MENUITEMINFO));    mii.type        = MFT_STRING ;    mii.state       = 0;    mii.id          = IDM_ABOUT;    mii.typedata    = (DWORD)"关于老聃...";    InsertMenuItem(hmnu, 1, TRUE, &mii);    return hmnu;}static HMENU createpmenufile (void){    HMENU hmnu;    MENUITEMINFO mii;    memset (&mii, 0, sizeof(MENUITEMINFO));    mii.type        = MFT_STRING;    mii.id          = 0;    mii.typedata    = (DWORD)"文件";    hmnu = CreatePopupMenu (&mii);    memset (&mii, 0, sizeof(MENUITEMINFO));    mii.type        = MFT_STRING;    mii.state       = 0;    mii.id          = IDM_EXIT;    mii.typedata    = (DWORD)"退出";    InsertMenuItem(hmnu, 0, TRUE, &mii);    return hmnu;}static HMENU createmenu (void){    HMENU hmnu;    MENUITEMINFO mii;    hmnu = CreateMenu();    memset (&mii, 0, sizeof(MENUITEMINFO));    mii.type        = MFT_STRING;    mii.id          = 100;    mii.typedata    = (DWORD)"文件";    mii.hsubmenu    = createpmenufile ();    InsertMenuItem(hmnu, 0, TRUE, &mii);    mii.type        = MFT_STRING;    mii.id          = 140;    mii.typedata    = (DWORD)"帮助";    mii.hsubmenu    = createpmenuabout ();    InsertMenuItem(hmnu, 1, TRUE, &mii);    return hmnu;}static char *xmBmpName[]={"system.bmp","display.bmp","mouse.bmp","app.bmp", "ime.bmp", "passwd.bmp",  "browser.bmp","fonts.bmp", "programers.bmp","adddel.bmp","ie.bmp","sound.bmp", "keyboard.bmp"};static char fdkBmpName[]="controlpanel.bmp";static char *xmTitle[]={"系统","显示","鼠标","应用程序","输入法","口令","浏览","字体","程序员","图标","浏览器","声音","键盘"};static char *xmInfo[]={"系统:设定采用何种显示引擎","显示:设定显示属性","鼠标:设定鼠标参数和指针","应用程序:设定应用程序路径","输入法:设定输入法属性","口令:(尚未实现)","浏览:查看MINIGUI的文件位置","字体:修改字体设定(实现中)","程序员:MINIGUI的贡献者们,也包括你哦。","图标:显示MINIGUI图标","浏览器:设置WEB浏览器属性(尚未实现)","声音:设置系统声音(尚未实现)","键盘:设置键盘属性(尚未实现)",};static char fdkInfo[]="控制面板:对MINIGUI进行配置的图形工具";static XMBUTTON xmButton [BTM_NUM];static FDKBUTTON fdkButton ;int WhichBox(int x,int y){  int i;  for (i=0;i<BTM_NUM;i++)  {    if ((x>xmButton[i].x)&&(x<xmButton[i].x+xmButton[i].w)        &&(y>xmButton[i].y)&&(y<xmButton[i].y+xmButton[i].h))      return i;  }  return -1;}int changeMode(HWND hWnd,int x,int y,int mode){  int btm=WhichBox(x,y);  int i;  RECT rect;  static int lastbtm=-1;  static int lastmode=BTM_FLAT;  if ((btm==lastbtm)&&(mode==lastmode))    return btm;  for (i=0;i<BTM_NUM;i++)  {    if(xmButton[i].mode==BTM_FLAT) continue;    xmButton[i].mode=BTM_FLAT;    rect.left=xmButton[i].x;    rect.right=xmButton[i].x+xmButton[i].w;    rect.top=xmButton[i].y;    rect.bottom=xmButton[i].y+xmButton[i].h;    InvalidateRect(hWnd,&rect,FALSE);  }  if (btm!=-1)  {    xmButton[btm].mode=mode;    rect.left=xmButton[btm].x;    rect.right=xmButton[btm].x+xmButton[btm].w;    rect.top=xmButton[btm].y;    rect.bottom=xmButton[btm].y+xmButton[btm].h;    InvalidateRect(hWnd,&rect,FALSE);    fdkButton.info=xmButton[btm].info;    fdkButton.bitmap = & xmButton[btm].bitmap;  }  else  {    fdkButton.info = fdkButton.myInfo;    fdkButton.bitmap = &fdkButton.myBitmap;  }  rect.left = fdkButton.x;  rect.right= fdkButton.x+fdkButton.w;  rect.top= fdkButton.y;  rect.bottom= fdkButton.y+fdkButton.h;  if(btm!=lastbtm)    InvalidateRect(hWnd,&rect,FALSE);  lastbtm = btm;  lastmode = mode;  return btm;}int ControlPanelWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam){    static int lastdown=-1;    switch (message)    {      case MSG_CREATE:      {      }      break;      case MSG_COMMAND:      {        int id   = LOWORD(wParam);//        int code = HIWORD(wParam);        switch (id)        {          case IDM_EXIT:            if(MessageBox(hWnd,"确实要退出吗?","控制面板",MB_YESNO|MB_ICONQUESTION)==IDYES)            {                int i;                for(i=0;i<BTM_NUM;i++)                  UnloadBitmap(&(xmButton[i].bitmap));                UnloadBitmap(&fdkButton.myBitmap);                DestroyMainWindow (hWnd);                PostQuitMessage (hWnd);                return 0;            }          break;          case IDM_ABOUT_THIS:            AboutControlPanel(hWnd);          break;          case IDM_ABOUT:            AboutLaodan(hWnd);          break;        }      }      break;      case MSG_LBUTTONDOWN:      {        lastdown = changeMode(hWnd,LOWORD(lParam),HIWORD(lParam),BTM_DOWN );//        InvalidateRect(hWnd,NULL,FALSE);      }      break;                                                                  //      case MSG_LBUTTONUP:      {//        char temp[100];        int up = changeMode(hWnd,LOWORD(lParam),HIWORD(lParam),BTM_FLAT );//        InvalidateRect(hWnd,NULL,FALSE);        if(up==-1) break;        if(up==lastdown)        {//          sprintf(temp,"you have choosed:%d\n",up);//          MessageBox(hWnd,temp,"hei",MB_OK);            OpenPanel(hWnd,up);        }      }      break;                                                                  //      case MSG_MOUSEMOVE:      {        changeMode(hWnd,LOWORD(lParam),HIWORD(lParam),BTM_UP );//        InvalidateRect (hWnd,NULL,FALSE);      }      break;      case MSG_PAINT:      {        HDC hdc;        RECT rc,rect;        int i;        hdc = BeginPaint (hWnd);        GetWindowRect(hWnd,&rc);        Draw3DDownFrame (hdc, 3,  3 ,                  (rc.right - rc.left - 5)/3,                  rc.bottom - rc.top - 46,// - GetMainWinMetrics( MWM_CAPTIONY ),                  PIXEL_lightwhite);        Draw3DDownFrame (hdc, (rc.right - rc.left - 5)/3 +4,  3,                  rc.right - rc.left - 7,                  rc.bottom - rc.top - 46,// - GetMainWinMetrics( MWM_CAPTIONY ),                  PIXEL_lightwhite);        Draw3DUpFrame (hdc,fdkButton.x,fdkButton.y,                      fdkButton.x+fdkButton.w,fdkButton.y+fdkButton.h,                      PIXEL_lightwhite);        FillBoxWithBitmap (hdc, fdkButton.x+fdkButton.bmpx,                                fdkButton.y+fdkButton.bmpy,                                0, 0, fdkButton.bitmap);        rect.left = fdkButton.x+fdkButton.infox;        rect.right = fdkButton.x+fdkButton.infox+fdkButton.infow;        rect.top = fdkButton.y+fdkButton.infoy;        rect.bottom = fdkButton.y+fdkButton.infoy+fdkButton.infoh;        DrawText(hdc,fdkButton.info,-1,&rect, DT_NOCLIP | DT_WORDBREAK|DT_LEFT|DT_VCENTER);        for(i=0;i<BTM_NUM;i++)        {          if(xmButton[i].mode == BTM_UP)            Draw3DUpFrame (hdc, xmButton[i].x,  xmButton[i].y ,                    xmButton[i].x+xmButton[i].w,xmButton[i].y+xmButton[i].h,                  PIXEL_lightwhite);          else  if(xmButton[i].mode == BTM_DOWN)            Draw3DDownFrame (hdc, xmButton[i].x,  xmButton[i].y ,                    xmButton[i].x+xmButton[i].w,xmButton[i].y+xmButton[i].h,                  PIXEL_lightwhite);          FillBoxWithBitmap (hdc, xmButton[i].x+xmButton[i].bmpx,                                xmButton[i].y+xmButton[i].bmpy,                                0, 0, &xmButton[i].bitmap);          TextOut(hdc,xmButton[i].x+xmButton[i].titlex,xmButton[i].y+xmButton[i].titley,                  xmButton[i].title);        }        EndPaint (hWnd,hdc);      }      return 0;      case MSG_CLOSE:      {        int i;        for(i=0;i<BTM_NUM;i++)          UnloadBitmap(&(xmButton[i].bitmap));        UnloadBitmap(&fdkButton.myBitmap);        DestroyMainWindow (hWnd);        PostQuitMessage (hWnd);        return 0;      }    }    return DefaultMainWinProc (hWnd, message, wParam, lParam);}static void InitControlPanelInfo (PMAINWINCREATE pCreateInfo){    pCreateInfo->dwStyle = WS_CAPTION | WS_BORDER |                         WS_VISIBLE ;    pCreateInfo->dwExStyle =  WS_EX_IMECOMPOSE;;    pCreateInfo->spCaption = "控制面板";    pCreateInfo->hMenu = createmenu();    pCreateInfo->hCursor = GetSystemCursor(0);    pCreateInfo->hIcon = 0;    pCreateInfo->MainWindowProc = ControlPanelWinProc;    pCreateInfo->lx = 50;    pCreateInfo->ty = 50;    pCreateInfo->rx = 530;    pCreateInfo->by = 410;    pCreateInfo->iBkColor = COLOR_lightgray;    pCreateInfo->dwAddData = (DWORD)0;    pCreateInfo->hHosting = HWND_DESKTOP;}void initBTMs(void){    int i,j;    for(i=0;i<BTM_NUM;i++)    {      xmButton[i].x=170 + (i%5)*55;      xmButton[i].y=20 + ((int)(i/5))*80;      xmButton[i].h=60;      xmButton[i].w=50;      xmButton[i].bmpx=5;      xmButton[i].bmpy=2;      strcpy(xmButton[i].title,xmTitle[i]);      strcpy(xmButton[i].info,xmInfo[i]);      j=strlen(xmButton[i].title);      xmButton[i].titlex=(8-j)*3;      xmButton[i].titley=42;      myLoadBitmap (&(xmButton[i].bitmap),xmBmpName [i]);    }    fdkButton.x=30;    fdkButton.y=50;    fdkButton.h=200;    fdkButton.w=100;    fdkButton.bmpx=30;    fdkButton.bmpy=20;    strcpy(fdkButton.myInfo,fdkInfo);    myLoadBitmap(&(fdkButton.myBitmap),fdkBmpName);    fdkButton.info = fdkButton.myInfo;    fdkButton.bitmap = &(fdkButton.myBitmap);    fdkButton.infox = 10;    fdkButton.infoy = 80;    fdkButton.infoh = 100;    fdkButton.infow = 80;}void* ControlPanel(void* data){    MSG Msg;    MAINWINCREATE CreateInfo;    HWND hMainWnd;    initBTMs();    InitControlPanelInfo (&CreateInfo);    hMainWnd = CreateMainWindow (&CreateInfo);    if (hMainWnd == HWND_INVALID)        return NULL;    while( GetMessage(&Msg, hMainWnd) )    {        TranslateMessage(&Msg);        DispatchMessage(&Msg);    }    MainWindowThreadCleanup(hMainWnd);    return NULL;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?