zoukankan      html  css  js  c++  java
  • 【转】第一个MiniGUI程序:模仿QQ界面

    最近几天在学MiniGui,最好的学习方法就是实践,先写个练练笔。
    其实只是一个界面,不知道什么时候才能真正写个完整的程序。
    初次写GUI程序,感觉写得不好,还请高手来指教。

    //======================================================================//
    //                             MiniQQ GUI ver 1.0                                                                                       //
    //                     作者:YoYo Chan                                                                                                //
    //                     Email: czy1000@126.com                                                                                   //
    //                     Blog: http://hi.baidu.com/chenzhuoyou                                                              //
    //                     MiniGUI版本: 1.3.3                                                                                            //
    //==================================================================//                 
    #include <stdio.h>
    #include <minigui/common.h>
    #include <minigui/minigui.h>
    #include <minigui/gdi.h>
    #include <minigui/window.h>
    #include <minigui/control.h>
    #ifndef _LITE_VERSION
    #include <minigui/dti.c>
    #endif
    #define IDC_BUTTON0 100
    #define IDC_BUTTON1 100+1
    #define IDC_BUTTON2 100+2
    #define IDC_BUTTON3 100+3
    #define IDC_CHECKBOX0 110
    #define IDC_CHECKBOX1 110+1
    #define IDC_CHECKBOX2 110+2
    #define IDC_TEXT0 120
    #define IDC_TEXT1 120+1
    #define IDC_TEXT2 120+2
    #define IDC_TEXT3 120+3
    #define IDC_TEXT4 120+4
    #define IDC_EDIT0 130
    #define IDC_EDIT1 130+1
    #define IDC_EDIT2 130+2
    #define IDC_EDIT3 130+3
    #define IDC_EDIT4 130+4
    #define IDC_LISTBOX0 140
    
    //==========================Dialog代码开始==============================================================================//
    static DLGTEMPLATE DlgInitProgress = {
      WS_BORDER | WS_CAPTION,
      WS_EX_NONE,
      0,0,320,240,
      "This is a dialog!",
      0,0,
      3,NULL,
      0
    };
    
    static CTRLDATA CtrlInitProgress[] =
    {
      {
          CTRL_STATIC,
          WS_VISIBLE | SS_SIMPLE,
          50,50,250,30,
          IDC_TEXT4,
          "欢迎到我的BLOG做客:",
          0
      },
      {
          CTRL_STATIC,
          WS_VISIBLE | SS_SIMPLE,
          50,80,250,30,
          IDC_TEXT4,
          "HTTP://HI.BAIDU.COM/CHENZHUOYOU",
          0
      },
      {
          CTRL_BUTTON,
          WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,
          120,150,80,30,
          IDOK,
          "关闭",
          0
      }
    };
    
    static int InitDialogBoxProc(HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
    {
      switch(message){
      case MSG_INITDIALOG:
        return 1;
      case MSG_COMMAND:
        switch(wParam){
        case IDOK:
          EndDialog(hDlg, wParam);
          break;
        }
        return 0;
      case MSG_CLOSE:
        EndDialog(hDlg, wParam);
        return 0;
      }
      return DefaultDialogProc(hDlg, message, wParam, lParam);
    }
    static int InitDialogBox(HWND hWnd) {   DlgInitProgress.controls = CtrlInitProgress;   DialogBoxIndirectParam(&DlgInitProgress, hWnd, InitDialogBoxProc, 0L); } //=======================Dialog代码结束=======================================================================// //========================Login代码开始=======================================================================// int MiniGUIMain(int argc, const char* argv[]) {   static int LoginWinProc();   MSG Msg;   HWND hMainWnd;   MAINWINCREATE CreateInfo;
      #ifdef _LITE_VERSION   SetDesktopRect(
    0, 0, 800, 600);   #endif   char *p = "这是YoYo的第一个MiniGUI程序!";   CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;   CreateInfo.dwExStyle = WS_EX_NONE;   CreateInfo.spCaption = "MiniQQ ver0.1 Author: YoYo Chan";   CreateInfo.hMenu = 0;   CreateInfo.hCursor = GetSystemCursor(0);   CreateInfo.hIcon = 0;   CreateInfo.MainWindowProc = LoginWinProc;   CreateInfo.lx = 0;   CreateInfo.ty = 0;   CreateInfo.rx = 320;   CreateInfo.by = 240;   CreateInfo.iBkColor = COLOR_lightwhite;   CreateInfo.dwAddData = p;   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);   printf(
    "The MainWin has been close! ");   return 0; } static int LoginWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) {   static int QQWin();   char *str1 = (char *)GetWindowAdditionalData(hWnd);   switch(message){   case MSG_CREATE:     CreateWindow(CTRL_STATIC,             str1,             WS_CHILD | WS_VISIBLE,             IDC_TEXT0,             10,10,220,20,hWnd,0);
        CreateWindow(CTRL_STATIC,
                "用户名:",             WS_CHILD | WS_VISIBLE,             IDC_TEXT1,             50,50,80,20,hWnd,0);
        CreateWindow(CTRL_EDIT,
                "User Name",             WS_CHILD | WS_BORDER | WS_VISIBLE,             IDC_EDIT0,             130,50,100,20,hWnd,0);
        CreateWindow(CTRL_STATIC,
                "密码:",             WS_CHILD | WS_VISIBLE,             IDC_TEXT2,             50,80,80,20,hWnd,0);
        CreateWindow(CTRL_EDIT,
                "Password",             WS_CHILD | WS_BORDER | WS_VISIBLE | ES_PASSWORD,             IDC_EDIT1,             130,80,100,20,hWnd,0);
        CreateWindow(CTRL_BUTTON,
                "登陆",             WS_CHILD | BS_DEFPUSHBUTTON | WS_VISIBLE,             IDC_BUTTON0,             100,160,80,30,hWnd,0);
        CreateWindow(CTRL_BUTTON,
                "保存密码",             WS_CHILD | BS_AUTOCHECKBOX | WS_VISIBLE,             IDC_CHECKBOX0,             50,120,100,30,hWnd,0);
        CreateWindow(CTRL_BUTTON,
                "隐身登陆",             WS_CHILD | BS_AUTOCHECKBOX | WS_VISIBLE,             IDC_CHECKBOX1,             180,120,100,30,hWnd,0);     printf("The MainWin has been opened! ");     return 0;   case MSG_COMMAND:{     int id = LOWORD(wParam);     int code = HIWORD(wParam);     switch(id){     case IDC_BUTTON0:       if(code == BN_CLICKED){         SendMessage(hWnd, MSG_CLOSE, 0, 0);         QQWin();       }     }     return 0;   }   case MSG_DESTROY:     DestroyAllControls(hWnd);     return 0;   case MSG_CLOSE:     DestroyMainWindow(hWnd);     PostQuitMessage(hWnd);     return 0;   }
      
    return DefaultMainWinProc(hWnd, message, wParam, lParam); } //=========================Login代码结束==========================================================================================// //=========================QQ主面板代码开始=========================================================================================// static int QQWin(void) {   static int QQWinProc();   MSG Msg;   HWND hQQWnd;   MAINWINCREATE CreateInfo;   CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;   CreateInfo.dwExStyle = WS_EX_NONE;   CreateInfo.spCaption = "MiniQQ ver0.1";   CreateInfo.hMenu = 0;   CreateInfo.hCursor = GetSystemCursor(0);   CreateInfo.hIcon = 0;   CreateInfo.MainWindowProc = QQWinProc;   CreateInfo.lx = 0;   CreateInfo.ty = 0;   CreateInfo.rx = 180;   CreateInfo.by = 450;   CreateInfo.iBkColor = COLOR_lightwhite;   CreateInfo.dwAddData = 0;   CreateInfo.hHosting = HWND_DESKTOP;   hQQWnd = CreateMainWindow(&CreateInfo);   if(hQQWnd==HWND_INVALID)     return -1;   ShowWindow(hQQWnd, SW_SHOWNORMAL);   while(GetMessage(&Msg, hQQWnd)){     TranslateMessage(&Msg);     DispatchMessage(&Msg);   }   MainWindowThreadCleanup(hQQWnd);   printf("The QQWin has been closed! ");   return 0; } static int QQWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) {   static int MessageWin();   static HWND hListBox;   switch(message){   case MSG_CREATE:{     HWND hListBox;     hListBox = CreateWindow(CTRL_LISTBOX,                   "FriendsList",                   WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_SORT | LBS_NOTIFY | LBS_USEICON,                   IDC_LISTBOX0,                   10,10,160,350,hWnd,0);     LISTBOXITEMINFO lbii;     lbii.hIcon = GetSmallSystemIcon(4);     lbii.cmFlag = CMFLAG_BLANK;     lbii.string = "YoYo Chan";     SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)&lbii);     CreateWindow(CTRL_BUTTON,             "点击我",             WS_CHILD | WS_VISIBLE,             IDC_BUTTON3,             10,370,160,30,hWnd,0);     printf("The QQWin has been opened! ");     return 0;   }   case MSG_COMMAND:{     int id = LOWORD(wParam);     int code = HIWORD(wParam);     switch(id){     case IDC_LISTBOX0:       if(code == LBN_DBLCLK){         hListBox = GetDlgItem(hWnd, IDC_LISTBOX0);         int index;         char buffer[20];         index = SendMessage(hListBox, LB_GETCURSEL, 0, 0);         SendMessage(hListBox, LB_GETTEXT, index, (LPARAM)buffer);         MessageWin(hWnd, (char *)buffer);       }     case IDC_BUTTON3:       if(code == BN_CLICKED)         InitDialogBox(hWnd);     }     return 0;   }   case MSG_DESTROY:     DestroyAllControls(hWnd);     return 0;   case MSG_CLOSE:     DestroyMainWindow(hWnd);     PostQuitMessage(hWnd);     return 0;   }
      
    return DefaultMainWinProc(hWnd, message, wParam, lParam); } //======================QQ主面板代码结束====================================================================================// //=====================消息对话框代码开始=====================================================================================// static int MessageWin(HWND hWnd, char* friendName) {   static int MessageWinProc();   HWND hMsgWnd;   MAINWINCREATE CreateInfo;   CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;   CreateInfo.dwExStyle = WS_EX_NONE;   CreateInfo.spCaption = friendName;   CreateInfo.hMenu = 0;   CreateInfo.hCursor = GetSystemCursor(0);   CreateInfo.hIcon = 0;   CreateInfo.MainWindowProc = MessageWinProc;   CreateInfo.lx = 0;   CreateInfo.ty = 0;   CreateInfo.rx = 450;   CreateInfo.by = 350;   CreateInfo.iBkColor = COLOR_lightwhite;   CreateInfo.dwAddData = 0;   CreateInfo.hHosting = hWnd;   hMsgWnd = CreateMainWindow(&CreateInfo);   if(hMsgWnd==HWND_INVALID)     return -1;
      ShowWindow(hMsgWnd, SW_SHOWNORMAL);   
    return 0; } static int MessageWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) {   static int MessageSendProc();   switch(message){   case MSG_CREATE:     CreateWindow(CTRL_MLEDIT,             "",             WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOWRAP | WS_VSCROLL,             IDC_EDIT2,             10,10,350,200,hWnd,0);
        SendMessage(GetDlgItem(hWnd, IDC_EDIT2), EM_SETREADONLY, TRUE,
    0);
        CreateWindow(CTRL_EDIT,
                "",             WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | ES_AUTOWRAP,             IDC_EDIT3,             10,220,350,100,hWnd,0);
        CreateWindow(CTRL_BUTTON,
                "发送",             WS_CHILD | WS_VISIBLE,             IDC_BUTTON1,             370,220,70,45,hWnd,0);     CreateWindow(CTRL_BUTTON,             "关闭",             WS_CHILD | WS_VISIBLE,             IDC_BUTTON2,             370,275,70,45,hWnd,0);
        SetNotificationCallback(GetDlgItem(hWnd, IDC_BUTTON1), MessageSendProc);     printf(
    "The MessageWin has been opened! ");     return 0;   case MSG_COMMAND:{     int id = LOWORD(wParam);     int code = HIWORD(wParam);     switch(id){     case IDC_BUTTON2:       if(code == BN_CLICKED)         SendMessage(hWnd, MSG_CLOSE, 0, 0);     }     return 0;   }   case MSG_DESTROY:     DestroyAllControls(hWnd);     printf("The MessageWin has been destroyed! ");     return 0;   case MSG_CLOSE:     DestroyMainWindow(hWnd);     MainWindowCleanup(hWnd);     printf("The MessageWin has been closed! ");     return 0;   }
      
    return DefaultMainWinProc(hWnd, message, wParam, lParam); } static int MessageSendProc(HWND hWnd, int id, int nc, DWORD add_data) {   switch(nc){   case BN_CLICKED:{       char buffer[256];       char *p;
          p
    = (char *)malloc(1024);       GetWindowText(GetDlgItem(GetParent(hWnd), IDC_EDIT2), p, 1024);       GetWindowText(GetDlgItem(GetParent(hWnd), IDC_EDIT3), buffer, 255);       strcat(p, buffer);       SetWindowText(GetDlgItem(GetParent(hWnd), IDC_EDIT2), p);       free(p);       return 0;     }     return 0;   } } //=======================信息对话框代码结束====================================================================================//

    效果图:

    (chenzhuoyou)
    本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。

    转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9078.html]

  • 相关阅读:
    vue-cli脚手架工具构建&初始化vue项目
    2020/05/17 Github加速-DNS配置
    同时将本地git仓库提交到gitee和github
    git远程仓库在本地看不到&push 到远程仓库失败的解决方案
    stylus的使用-变量和函数
    webpack使用4-HRM热替换&SourceMap&解析es语法
    webpack使用3-plugin插件的使用
    webpack使用2-常用的几个loader的使用
    webpack基本使用
    spring框架里面的注入?
  • 原文地址:https://www.cnblogs.com/cslunatic/p/5152887.html
Copyright © 2011-2022 走看看