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 + -
显示快捷键?