创建MiniGUI自定义控件

创建MiniGUI自定义控件 

  1. include <STDIO.H>   
  2.   
  3. #include <MINIGUI common.h>   
  4. #include <MINIGUI minigui.h>   
  5. #include <MINIGUI gdi.h>   
  6. #include <MINIGUI window.h>   
  7. #include <MINIGUI control.h>   
  8. #include <STRING.H>   
  9.   
  10. #define _FLAT_WINDOW_STYLE   
  11.   
  12.   
  13. /***********************************************************************  
  14. *** 函数原 型:static int ColorEditConProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)  
  15.               static BOOL RegisterColorEditControl (void)  
  16.               static void UnregisterColorEditControl (void)  
  17. *** 参数说明:  
  18. *** 返回值  :  
  19. *** 创建人  :王敏敏  
  20. *** 最后修改:  
  21. *** 描述    :"边框颜色可变编辑框"控件,这里利用Minigui中的自定 义控件实现。包括:  
  22.               其回调函数(ColorEditConProc);  
  23.               注册这个控件 (RegisterColorEditControl);  
  24.               注销这个控件 (UnregisterColorEditControl)  
  25. ************************************************************************/   
  26. static   int  ColorEditConProc ( HWND  hwnd,  int  message,  WPARAM  wParam,  LPARAM  lParam)  
  27. {     
  28.          HDC  hdc;      
  29.         RECT rc;                  // rc 为文本矩形   
  30.       
  31.     GetClientRect(hwnd, &rc);  // 取 得控件的大小       
  32.       
  33.      switch (message)  
  34.     {  
  35.          case  MSG_CREATE:  
  36.             SetWindowBkColor(hwnd, COLOR_black);  
  37.          break ;  
  38.           
  39.          case  MSG_PAINT:  
  40.             hdc = BeginPaint (hwnd);      
  41.              //SetBkMode(hdc, BM_TRANSPARENT);    // 让 文本框背景透明                    
  42.               
  43.              // 设置边框颜色-浅蓝色,并绘制边框     
  44.             SetPenColor(hdc, RGB2Pixel (hdc, 11, 244 , 244));                          
  45.             Rectangle (hdc, rc.left, rc.top, rc.right-1, rc.bottom-1);   
  46.              // 设置文本颜色——浅蓝色,文本背景色 ——黑色   
  47.             SetTextColor(hdc, RGB2Pixel (hdc, 11, 244 , 244));            
  48.             SetBkColor(hdc, COLOR_black);                                 
  49.             rc.right = rc.right-2;   // 文字到右边框留的距离为3   
  50.              // 输出文本内容,右对齐、上下居中显示   
  51.            DrawText(hdc, GetWindowCaption (hwnd), -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);  
  52.             EndPaint (hwnd, hdc);  
  53.              break ;                    
  54.          
  55.                     
  56.          case  MSG_SETTEXT:   // 此消息是为了使得SetDlgItemText()函数(此函数会发出MSG_SETTEXT消息)可用   
  57.                // 将设置的文本保存到caption 中   
  58.               SetWindowCaption (hwnd, ( char *)lParam);   
  59.                 
  60.             hdc = GetClientDC (hwnd);  
  61.              // 设置边框颜色-绿色,并绘制边 框                            
  62.             SetPenColor(hdc, RGB2Pixel (hdc, 9, 225 , 24));                 
  63.             Rectangle (hdc, rc.left, rc.top, rc.right, rc.bottom-1);                 
  64.              // 设置文本颜色——浅蓝色,文本背景色 ——黑色                      
  65.             SetTextColor(hdc, RGB2Pixel (hdc, 11, 244 , 244));            
  66.             SetBkColor(hdc, COLOR_black);                                 
  67.             rc.right = rc.right-3;   // 文字到右边框留的距离为3                        
  68.              // 用黑色刷新文字区域   
  69.             SetBrushColor(hdc, 0);              
  70.             FillBox (hdc, rc.left+1, rc.top+1, rc.right-rc.left-1, rc.bottom-rc.top-2);  // 加1减1目的是为了防止把边框刷掉   
  71.              // 输出文本内容,右对齐、上下居中显示   
  72.             DrawText(hdc, ( char *)lParam, -1, &rc, DT_NOCLIP | DT_CENTER | DT_VCENTER | DT_SINGLELINE);  
  73.             ReleaseDC (hdc);        
  74.              break ;        
  75.     }  
  76.       
  77.      // DefaultControlProc()调用 DefaultMainWinProc(),其内包含对MSG_GETTEXT消息的处理   
  78.      return  DefaultControlProc (hwnd, message, wParam, lParam);    
  79. }  
  80.   
  81. static   BOOL  RegisterColorEditControl ( void )  
  82. {  
  83.     WNDCLASS MyClass;  
  84.   
  85.     MyClass.spClassName =  "coloredit" ;  
  86.     MyClass.dwStyle     = WS_NONE;  
  87.     MyClass.dwExStyle   = WS_EX_NONE;  
  88.     MyClass.hCursor     = GetSystemCursor (IDC_ARROW);  
  89.     MyClass.iBkColor    = COLOR_black;  
  90.     MyClass.WinProc     = ColorEditConProc;  
  91.   
  92.      return  RegisterWindowClass (&MyClass);  
  93. }  
  94.   
  95. static   void  UnregisterColorEditControl ( void )  
  96. {  
  97.     UnregisterWindowClass ( "coloredit" );  
  98. }  
  99.   
  100.   
  101.   
  102. /***********************************************************************  
  103. *** 函数原 型:static int MenuWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)  
  104. *** 参数说明:  
  105. *** 返回值  :  
  106. *** 创建人  :王敏敏  
  107. *** 最后修改:  
  108. *** 描述    :主窗口回调函数  
  109. ************************************************************************/   
  110. static   int  MenuWinProc( HWND  hWnd,  int  message,  WPARAM  wParam,  LPARAM  lParam)  
  111. {    
  112.          HWND  hw;  
  113.      switch  (message) {  
  114.          case  MSG_CREATE:  
  115.             CreateWindow ( "coloredit" "呼吸率" ,   
  116.                     WS_VISIBLE, 101,   
  117.                     80, 100, 62, 20,   
  118.                     hWnd, 0);   
  119.             hw=CreateWindow (CTRL_TRACKBAR, "" ,  
  120.                         WS_VISIBLE | TBS_NOTIFY | TBS_NOTICK,  
  121.                         102,  
  122.                         10,10,280,18,hWnd,0);  
  123.             SendMessage(hw,TBM_SETRANGE,1,100);  
  124.              break ;  
  125.               
  126.          case  MSG_CLOSE:  
  127.             DestroyMainWindow (hWnd);  
  128.              // 注销自定义控件   
  129.             UnregisterColorEditControl ();  
  130.             PostQuitMessage (hWnd);  
  131.              break ;  
  132.     }  
  133.   
  134.      return  DefaultMainWinProc(hWnd, message, wParam, lParam);  
  135. }  
  136.   
  137.   
  138. /***********************************************************************  
  139. *** 函数原 型:int MiniGUIMain (int argc, const char* argv[])  
  140. *** 参数说明:  
  141. *** 返回值  :  
  142. *** 创建人  :王敏敏  
  143. *** 最后修改:  
  144. *** 描述    :主程序入口函数  
  145. ************************************************************************/   
  146. int  MiniGUIMain ( int  argc,  const   char * argv[])  
  147. {  
  148.     MSG Msg;  
  149.      HWND  hMainWnd;  
  150.     MAINWINCREATE CreateInfo;  
  151.   
  152. #ifdef _LITE_VERSION   
  153.     SetDesktopRect(0, 0, 578, 555);  
  154. #endif   
  155.       
  156.      // 注册自定义控件   
  157.     RegisterColorEditControl();  
  158.   
  159.     CreateInfo.dwStyle = WS_VISIBLE ;  
  160.     CreateInfo.dwExStyle = WS_EX_NONE;  
  161.     CreateInfo.spCaption =  "" ;  
  162.     CreateInfo.hMenu = 0;  
  163.     CreateInfo.hCursor = GetSystemCursor(0);  
  164.     CreateInfo.hIcon = 0;  
  165.     CreateInfo.MainWindowProc = MenuWinProc;  
  166.     CreateInfo.lx = 0;  
  167.     CreateInfo.ty = 0;  
  168.     CreateInfo.rx = 578;  
  169.     CreateInfo.by = 555;  
  170.     CreateInfo.iBkColor = COLOR_black;  
  171.     CreateInfo.dwAddData = 0;  
  172.     CreateInfo.hHosting = HWND_DESKTOP;  
  173.       
  174.     hMainWnd = CreateMainWindow (&CreateInfo);  
  175.       
  176.      if  (hMainWnd == HWND_INVALID)  
  177.          return  -1;  
  178.   
  179.     ShowWindow(hMainWnd, SW_SHOWNORMAL);  
  180.   
  181.      while  (GetMessage(&Msg, hMainWnd)) {  
  182.         TranslateMessage(&Msg);  
  183.         DispatchMessage(&Msg);  
  184.     }  
  185.   
  186.     MainWindowThreadCleanup (hMainWnd);  
  187.   
  188.      return  0;  
  189. }  
  190.   
  191. #ifndef _LITE_VERSION   
  192. #include <MINIGUI dti.c>   
  193. #endif   

学习MiniGUI之控件篇
   对每个控件而言,MiniGUI都为其定义了几个重要的数据结构:
1. WNDCLASS:窗口类信息,主要定义了控件的外观,风格等参数,用来注册控件时使用
typedef struct _WNDCLASS
{
    /** 类名,比如ListExCtrl */
    char*   spClassName;
    /** internal field, operation type */
    DWORD   opMask;
    /** 窗口的风格 */
    DWORD   dwStyle;
    /** 扩展风格 */
    DWORD   dwExStyle;
    /** 光标句柄 */
    HCURSOR hCursor;
    /** 背景色的像素值 */
    int     iBkColor;
    /** 窗口消息回调处理函数 */
    int     (*WinProc) (HWND, int, WPARAM, LPARAM);
    /** 私有数据区 */
    DWORD dwAddData;
} WNDCLASS;
typedef WNDCLASS* PWNDCLASS;
2. CTRLCLASSINFO:以上类信息的控制结构,内部使用
typedef struct _CTRLCLASSINFO
{
    char      name[MAXLEN_CLASSNAME + 1];
    DWORD     dwStyle;          // Default control styles.
    DWORD     dwExStyle;        // Default control extended styles.
    HCURSOR   hCursor;          // control cursor
    int       iBkColor;         // control background color.
    int (*ControlProc)(HWND, int, WPARAM, LPARAM);
                                // control procedure.
    DWORD dwAddData;            // the additional data.
    int nUseCount;              // use count.
    struct _CTRLCLASSINFO*  next;
                                // next class info
}CTRLCLASSINFO;
typedef CTRLCLASSINFO* PCTRLCLASSINFO;
3. CONTROL:定义了一个具体控件的形状,外观,风格,背景色等参数
typedef struct tagCONTROL
{
    short DataType;         // the data type
    short WinType;          // the window type
    int left, top;          // the position of control in main window's
    int right, bottom;      // client area.
    int cl, ct;             // the positio of control client in main window's
    int cr, cb;             // client area.
    DWORD dwStyle;          // the styles of child window.
    DWORD dwExStyle;        // the extended styles of child window.
    int iBkColor;     // the background color.
    HMENU hMenu;     // handle of menu.
    HACCEL hAccel;          // handle of accelerator table.
    HCURSOR hCursor;     // handle of cursor.
    HICON hIcon;      // handle of icon.
    HMENU hSysMenu;         // handle of system menu.
    PLOGFONT pLogFont;      // pointer to logical font.
    HDC   privCDC;          // the private client DC.
    INVRGN InvRgn;          // the invalid region of this control.
    PGCRINFO pGCRInfo;      // pointer to global clip region info struct.
    PZORDERNODE pZOrderNode;
                            // the Z order node,
                            // only for control with WS_EX_CTRLASMAINWIN.
    PCARETINFO pCaretInfo;  // pointer to system caret info struct.
    DWORD dwAddData;        // the additional data.
    DWORD dwAddData2;       // the second addtional data.
    int (*ControlProc) (HWND, int, WPARAM, LPARAM);
    char* spCaption;         // the caption of control.
    int   id;                // the identifier of child window.
    SCROLLBARINFO vscroll;   // the vertical scroll bar information.
    SCROLLBARINFO hscroll;   // the horizital scroll bar information.
    PMAINWIN pMainWin;       // the main window that contains this control.
    struct tagCONTROL* pParent;// the parent of this control.
    /*
     * Child windows.
     */
    struct tagCONTROL* children;
                             // the first child control.
    struct tagCONTROL* active;
                             // the active child control.
    struct tagCONTROL* old_under_pointer;
                             // the old under pointer child control.
    struct tagCONTROL* primitive;
                             // the primitive child of mouse event.
    NOTIFPROC notif_proc;    // the notification callback procedure.
    /*
     * window element data.
     */
    struct _wnd_element_data* wed;
    /*
     * The following members are only implemented for control.
     */
    struct tagCONTROL* next;   // the next sibling control.
    struct tagCONTROL* prev;   // the prev sibling control.
    PCTRLCLASSINFO pcci;     // pointer to Control Class Info struct.
}CONTROL;
typedef CONTROL* PCONTROL;
控件注册:
控件在可以被使用之前需要调用RegisterWindowClass函数,在这个函数里 向HWND_DESKTOP窗口 管理器发送MSG_REGISTERWNDCLASS消息。这里可以看到传入的参数是一个pWndClass的指针
 return SendMessage (HWND_DESKTOP,
  MSG_REGISTERWNDCLASS, 0, (LPARAM)pWndClass) == ERR_OK;
HWND_DESKTOP窗口管理器在它的消息处理函数DesktopWinProc函数中如何处理MSG_REGISTERWNDCLASS 消息?
        case MSG_REGISTERWNDCLASS:
            return AddNewControlClass ((PWNDCLASS)lParam);
调用了AddNewControlClass函数,该函数将控 件类信息添加到MiniGUI维护的一张保存所有控件的CTRLCLASSINFO的表中去,该表名为ccitable,按字母分成26个链 表,AddNewControlClass函数为待添加控件生成一个CTRLCLASSINFO实例,根据传入的PWNDCLASS结构的实例,填充相应 的数据,并加入到相应的ccitable链表中。
创建控件:
注册完控件就可以使用CreateWindow创建一个控件。CreateWindow是CreateWindowEx的一 个宏。
#define CreateWindow(class_name, caption, style,        /
                id, x, y, w, h, parent, add_data)       /
        CreateWindowEx(class_name, caption, style, 0,   /
                        id, x, y, w, h, parent, add_data)
CreateWindow首先向HWND_DESKTOP窗口管理器发送 一个MSG_GETCTRLCLASSINFO消息,获取CTRLCLASSINFO信息,然后定义一个PCONTROL变量,对控件进行初始化,然后向 HWND_DESKTOP窗口管理器发送一个MSG_NEWCTRLINSTANCE消息
 SendMessage (HWND_DESKTOP,
  MSG_NEWCTRLINSTANCE, (WPARAM)hParentWnd, (LPARAM)pNewCtrl);
接着向新创建的控件本身发送MSG_CREATE消息:
 if (SendMessage ((HWND)pNewCtrl, MSG_CREATE, (WPARAM)hParentWnd, (LPARAM)dwAddData)) {
  SendMessage (HWND_DESKTOP,
   MSG_REMOVECTRLINSTANCE, (WPARAM)hParentWnd, (LPARAM)pNewCtrl);
  goto error;
 }

你可能感兴趣的:(struct,System,Class,scroll,styles,Primitive)